首页 科普 资讯 养生 问答 找医院 相关问答
首页> 问答

数据结构循环队列的c语言实现,程序通过了编译连接但是运行时崩溃...

发布网友 发布时间:2024-09-25 19:04

我来回答

4个回答

热心网友 时间:2024-10-03 05:45

scanf("%s %s %d %d %d",p[i].name,p[i].id,&p[i].x,&p[i].y,&p[i].z);
输入改为上句(你没对int类型变量取地址)
改过之后就不会 出内存错误了 (不崩溃了)
但是程序会陷入死循环
简单分析一下: 你的 point e 没有初始化就作为函数QueueTraverse的参数使用了
是不是这里的问题 我不太了解你写的程序的目的 所以不太清楚具体细节
一下是完整程序:

// testing2.cpp : 定义控制台应用程序的入口点。
//

#include<string.h> // 字符串函数头文件
#include<ctype.h> // 字符函数头文件
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // 标准输入输出头文件
#include<stdlib.h> // atoi(),exit()
#include<io.h> // eof()
#include<math.h> // 数学函数头文件
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; // Status是函数的类型,其值是函数结果状态代码
#define MAX_QSIZE 100 // 最大队列长度+1
#define N 2
typedef int QElemType;
typedef struct
{
char name[20];
char id[20];
int x;
int y;
int z;
}point;
typedef struct
{ point* base; // 初始化的动态分配存储空间
int front; // 头指针,若队列不空,指向队列头元素
int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;

void InitQueue(SqQueue &Q)
{ // 构造一个空队列Q
Q.base=(point *)malloc(MAX_QSIZE *sizeof(point));
if(!Q.base) // 存储分配失败
exit(OVERFLOW);
Q.front=Q.rear=0;
}

Status QueueEmpty(SqQueue Q)
{ // 若队列Q为空队列,则返回TRUE;否则返回FALSE
if(Q.front==Q.rear) // 队列空的标志
return TRUE;
else
return FALSE;
}

Status EnQueue(SqQueue &Q,point e)
{ // 插入元素e为队列Q的新的队尾元素
if((Q.rear+1)%MAX_QSIZE==Q.front) // 队列满
return ERROR;
Q.base[Q.rear]=e; // 将e插在队尾
Q.rear=(Q.rear+1)%MAX_QSIZE; // 队尾指针+1后对MAX_QSIZE取余
return OK;
}

int QueueLength(SqQueue Q)
{ // 返回队列Q的元素个数,即队列的长度
return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;
}

int DeQueue(SqQueue &Q,point &e)
{ // 若队列Q不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
if(Q.front==Q.rear) // 队列空
return ERROR;
e=Q.base[Q.front]; // 将队头元素的值赋给e
Q.front=(Q.front+1)%MAX_QSIZE; // 移动队头指针
return OK;
}

void QueueTraverse(SqQueue Q)
{ // 从队头到队尾依次对队列Q中每个元素输出
int i=Q.front; // i最初指向队头元素
point e=Q.base[i];//把i指向的元素赋给e
while(i!=Q.rear) // i指向队列Q中的元素
{
printf("name:%s id=%s x=%d y=%d z=%d\n",e.name,e.id,e.x,e.y,e.z); // 输出i所指元素
i=(i+1)%MAX_QSIZE; // i指向下一个元素
}
printf("\n");
}
int main()
{
int i;
SqQueue Q;
InitQueue(Q);
point p[N];
for(i=1;i<=N;i++)
{
printf("Input the %dth point's name id x y z ",i);
scanf("%s %s %d %d %d",p[i].name,p[i].id,&p[i].x,&p[i].y,&p[i].z);
EnQueue(Q,p[1]);
}
QueueTraverse(Q);
system("pause");
return 0;
}

热心网友 时间:2024-10-03 05:44

改了三个地方:用//!!!!!!标注的地方:

#include<string.h> // 字符串函数头文件
#include<ctype.h> // 字符函数头文件
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // 标准输入输出头文件
#include<stdlib.h> // atoi(),exit()
#include<io.h> // eof()
#include<math.h> // 数学函数头文件
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; // Status是函数的类型,其值是函数结果状态代码
#define MAX_QSIZE 100 // 最大队列长度+1
#define N 10
typedef int QElemType;

typedef struct
{
char name[20];
char id[20];
int x;
int y;
int z;
}point;

typedef struct
{
point* base; // 初始化的动态分配存储空间
int front; // 头指针,若队列不空,指向队列头元素
int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;

void InitQueue(SqQueue &Q)
{
// 构造一个空队列Q
Q.base=(point *)malloc(MAX_QSIZE *sizeof(point));
if (!Q.base) // 存储分配失败
exit(OVERFLOW);
Q.front=Q.rear=0;
}

Status QueueEmpty(SqQueue Q)
{
// 若队列Q为空队列,则返回TRUE;否则返回FALSE
if (Q.front==Q.rear) // 队列空的标志
return TRUE;
else
return FALSE;
}

Status EnQueue(SqQueue &Q,point e)
{
// 插入元素e为队列Q的新的队尾元素
if ((Q.rear+1)%MAX_QSIZE==Q.front) // 队列满
return ERROR;
Q.base[Q.rear]=e; // 将e插在队尾
Q.rear=(Q.rear+1)%MAX_QSIZE; // 队尾指针+1后对MAX_QSIZE取余
return OK;
}

int QueueLength(SqQueue Q)
{
// 返回队列Q的元素个数,即队列的长度
return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;
}

Status DeQueue(SqQueue &Q,point &e)
{
// 若队列Q不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
if (Q.front==Q.rear) // 队列空
return ERROR;
e=Q.base[Q.front]; // 将队头元素的值赋给e
Q.front=(Q.front+1)%MAX_QSIZE; // 移动队头指针
return OK;
}

void QueueTraverse(SqQueue Q,point &e) //!!!!!!!!这里将"point e"改为引用:"point &e"
{
// 从队头到队尾依次对队列Q中每个元素输出
int i=Q.front; // i最初指向队头元素
while (i!=Q.rear) // i指向队列Q中的元素
{
e=Q.base[i];//把i指向的元素赋给e //!!!!!!!!这句移到循环里面来
printf("name:%s id=%s x=%d y=%d z=%d\n", e.name, e.id, e.x, e.y, e.z); // 输出i所指元素
i=(i+1)%MAX_QSIZE; // i指向下一个元素
}
printf("\n");
}

int main()
{
int i;
SqQueue Q;
InitQueue(Q);
point p[N];
point e;
for (i=0;i<N;i++)
{
printf("Input the %dth point's name id x y z ",i);
scanf("%s %s %d %d %d", p[i].name, p[i].id, &p[i].x, &p[i].y, &p[i].z); //!!!!!!!这里读入整型变量必须加取地址符
EnQueue(Q,p[i]);
}
QueueTraverse(Q,e);

return 0;
}

热心网友 时间:2024-10-03 05:44

是内存溢出吗?

热心网友 时间:2024-10-03 05:50

这个知道的可能都不会看这里了

热心网友 时间:2024-10-03 05:44

scanf("%s %s %d %d %d",p[i].name,p[i].id,&p[i].x,&p[i].y,&p[i].z);
输入改为上句(你没对int类型变量取地址)
改过之后就不会 出内存错误了 (不崩溃了)
但是程序会陷入死循环
简单分析一下: 你的 point e 没有初始化就作为函数QueueTraverse的参数使用了
是不是这里的问题 我不太了解你写的程序的目的 所以不太清楚具体细节
一下是完整程序:

// testing2.cpp : 定义控制台应用程序的入口点。
//

#include<string.h> // 字符串函数头文件
#include<ctype.h> // 字符函数头文件
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // 标准输入输出头文件
#include<stdlib.h> // atoi(),exit()
#include<io.h> // eof()
#include<math.h> // 数学函数头文件
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; // Status是函数的类型,其值是函数结果状态代码
#define MAX_QSIZE 100 // 最大队列长度+1
#define N 2
typedef int QElemType;
typedef struct
{
char name[20];
char id[20];
int x;
int y;
int z;
}point;
typedef struct
{ point* base; // 初始化的动态分配存储空间
int front; // 头指针,若队列不空,指向队列头元素
int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;

void InitQueue(SqQueue &Q)
{ // 构造一个空队列Q
Q.base=(point *)malloc(MAX_QSIZE *sizeof(point));
if(!Q.base) // 存储分配失败
exit(OVERFLOW);
Q.front=Q.rear=0;
}

Status QueueEmpty(SqQueue Q)
{ // 若队列Q为空队列,则返回TRUE;否则返回FALSE
if(Q.front==Q.rear) // 队列空的标志
return TRUE;
else
return FALSE;
}

Status EnQueue(SqQueue &Q,point e)
{ // 插入元素e为队列Q的新的队尾元素
if((Q.rear+1)%MAX_QSIZE==Q.front) // 队列满
return ERROR;
Q.base[Q.rear]=e; // 将e插在队尾
Q.rear=(Q.rear+1)%MAX_QSIZE; // 队尾指针+1后对MAX_QSIZE取余
return OK;
}

int QueueLength(SqQueue Q)
{ // 返回队列Q的元素个数,即队列的长度
return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;
}

int DeQueue(SqQueue &Q,point &e)
{ // 若队列Q不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
if(Q.front==Q.rear) // 队列空
return ERROR;
e=Q.base[Q.front]; // 将队头元素的值赋给e
Q.front=(Q.front+1)%MAX_QSIZE; // 移动队头指针
return OK;
}

void QueueTraverse(SqQueue Q)
{ // 从队头到队尾依次对队列Q中每个元素输出
int i=Q.front; // i最初指向队头元素
point e=Q.base[i];//把i指向的元素赋给e
while(i!=Q.rear) // i指向队列Q中的元素
{
printf("name:%s id=%s x=%d y=%d z=%d\n",e.name,e.id,e.x,e.y,e.z); // 输出i所指元素
i=(i+1)%MAX_QSIZE; // i指向下一个元素
}
printf("\n");
}
int main()
{
int i;
SqQueue Q;
InitQueue(Q);
point p[N];
for(i=1;i<=N;i++)
{
printf("Input the %dth point's name id x y z ",i);
scanf("%s %s %d %d %d",p[i].name,p[i].id,&p[i].x,&p[i].y,&p[i].z);
EnQueue(Q,p[1]);
}
QueueTraverse(Q);
system("pause");
return 0;
}

热心网友 时间:2024-10-03 05:44

是内存溢出吗?

热心网友 时间:2024-10-03 05:48

这个知道的可能都不会看这里了

热心网友 时间:2024-10-03 05:43

改了三个地方:用//!!!!!!标注的地方:

#include<string.h> // 字符串函数头文件
#include<ctype.h> // 字符函数头文件
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // 标准输入输出头文件
#include<stdlib.h> // atoi(),exit()
#include<io.h> // eof()
#include<math.h> // 数学函数头文件
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; // Status是函数的类型,其值是函数结果状态代码
#define MAX_QSIZE 100 // 最大队列长度+1
#define N 10
typedef int QElemType;

typedef struct
{
char name[20];
char id[20];
int x;
int y;
int z;
}point;

typedef struct
{
point* base; // 初始化的动态分配存储空间
int front; // 头指针,若队列不空,指向队列头元素
int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;

void InitQueue(SqQueue &Q)
{
// 构造一个空队列Q
Q.base=(point *)malloc(MAX_QSIZE *sizeof(point));
if (!Q.base) // 存储分配失败
exit(OVERFLOW);
Q.front=Q.rear=0;
}

Status QueueEmpty(SqQueue Q)
{
// 若队列Q为空队列,则返回TRUE;否则返回FALSE
if (Q.front==Q.rear) // 队列空的标志
return TRUE;
else
return FALSE;
}

Status EnQueue(SqQueue &Q,point e)
{
// 插入元素e为队列Q的新的队尾元素
if ((Q.rear+1)%MAX_QSIZE==Q.front) // 队列满
return ERROR;
Q.base[Q.rear]=e; // 将e插在队尾
Q.rear=(Q.rear+1)%MAX_QSIZE; // 队尾指针+1后对MAX_QSIZE取余
return OK;
}

int QueueLength(SqQueue Q)
{
// 返回队列Q的元素个数,即队列的长度
return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;
}

Status DeQueue(SqQueue &Q,point &e)
{
// 若队列Q不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
if (Q.front==Q.rear) // 队列空
return ERROR;
e=Q.base[Q.front]; // 将队头元素的值赋给e
Q.front=(Q.front+1)%MAX_QSIZE; // 移动队头指针
return OK;
}

void QueueTraverse(SqQueue Q,point &e) //!!!!!!!!这里将"point e"改为引用:"point &e"
{
// 从队头到队尾依次对队列Q中每个元素输出
int i=Q.front; // i最初指向队头元素
while (i!=Q.rear) // i指向队列Q中的元素
{
e=Q.base[i];//把i指向的元素赋给e //!!!!!!!!这句移到循环里面来
printf("name:%s id=%s x=%d y=%d z=%d\n", e.name, e.id, e.x, e.y, e.z); // 输出i所指元素
i=(i+1)%MAX_QSIZE; // i指向下一个元素
}
printf("\n");
}

int main()
{
int i;
SqQueue Q;
InitQueue(Q);
point p[N];
point e;
for (i=0;i<N;i++)
{
printf("Input the %dth point's name id x y z ",i);
scanf("%s %s %d %d %d", p[i].name, p[i].id, &p[i].x, &p[i].y, &p[i].z); //!!!!!!!这里读入整型变量必须加取地址符
EnQueue(Q,p[i]);
}
QueueTraverse(Q,e);

return 0;
}
单位高温防护欠缺致员工中暑如何对待 狗狗为什么爱看视频 360浏览器怎么设置倍速播放 ...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 家里面楼梯是水泥的不想铺地毯或者地砖还能铺什么 楼梯的水泥台阶上可以铺地板革吗 手机腾讯会议共享屏幕播放视频没声 腾讯会议共享屏幕没声音怎么办 微信寄快递怎么取消订单_取消订单方法介绍 300兆宽带用什么路由器好? 请问高分子井盖具体材料有那些?谢谢 井盖骨架有哪些材料 ...一个女主是空姐,她和男主第一次在去巴黎飞机上相遇,约定如果三次... 找一部电影 记得结局是主角上了私人飞机,然后和空姐,可能是情人... 360借条怎么开通? 脚踝系红绳是什么意思 痤疮 痘痘 黑头 粉刺必看的终结绿色治疗 女性脸上有痤疮不能吃皮蛋吗 前事不忘,__ 只可意会,___ 皮之不存,__ __,不为瓦全,__ __,不见泰山... 薪酬:以薪酬战略撬动企业变革内容简介 领先型薪酬策略在实践中的应用 领先型薪酬策略什么是领先型薪酬策略 什么是领先型薪酬策略 第三方支付都有什么 银行用车抵押贷款 雌雄眼的女人不能惹雌雄眼的女人旺夫吗 修缮,与修理的区别 小弟想买一款索尼的笔记本。麻烦各位推荐一下。颜色必须是黑色的,键盘... SONY的笔记本电脑硬盘大概多钱一个 先说谢谢了 sony的笔记本ea38ec 到底用的是什么牌子的内存 尔必达?威刚... 在Sony Style上面买机子,除了鼠标,包,其他东西都全么? 有谁知道SONY的最新最小VGN-UX的笔记本好无好用?介绍下基本功能~!_百度... 怎样让孩子主动找老师补课? 表格列求和公式怎么设置 求和函数公式怎么输入 北京注册成立一个公司需要多少钱 北京公司都是什么 手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 使用Microsoft visual c++ 6.0编译生成的程序不能停留界面,一闪就过 ... 刚学c++ 写了点东西 但总运行不了 帮忙分析一下 百度新人 无以为敬 献... 每个windows程序就是带有头文件windows.h编译都出现一下错误,什么原因... 洛克王国中土系克什么系 ...程序编译时不能打开头文件#include<string.h>,是什么原因啊?_百度... 洛克王国什么克火 使命召唤4高空俱乐部之前的英语是什么? 使命召唤4隐藏关开头对话中文意思? ...功率为750瓦,电费0.53一度,此水泵工作一小时电费多少钱 使命召唤4里面那句“we're going deep and we're going hard"是什么... 布偶猫枫叶脸的更贵吗 多少钱一只 泰戈尔的诗两首 3个月的布偶猫好养活吗 多少钱一只 读一读冰心和泰戈尔的诗歌,并写一首小诗 小布偶猫价格是多少 哪个颜色最贵 爱的擦肩而过,爱你的人没位置坐 ...为了你为我为了自己》是连着唱的 叫这首叫什么名 谢谢 什么是 官配王道?? ...一些EXO里有关鹿鹿的文给我么、all鹿或是任何配对都可以、真心求... 钢铁是眼泪炼成的的歌词是什么? 九年级政治人教版,第4课 这个问题求解啊啊 急!!【 青少年如何适应... 我定义一个头文件,用来保存程序中的全局变量,但是编译时出现这样的错... ...运行之后说找不到“stdafx.h”这个头文件,试过了什么预编译的... 丽江今夜不再说爱情电子书txt全集下载 《说了不再爱》的全文阅读 作者是茶禅一味 ...些死后重生的小说。。现代的。女主要强的。。类系《说了不再爱》 ...you。什么什么猴塞猴,,有知道这首歌曲什么名字吗~! 狗狗乱跑,蹭家居挠耳朵,随后呕吐物呈深黄色,吐完精神不振 ...而且呼吸急促,不停地挠耳朵,没精神。这是什么病,把治疗方法说来_百... 手机充电时闪电是什么颜色的? 武威尚城华府绿化率是多少? 求高质量英文翻译一句话,高手请进 武威尚城华府容积率是多少? 英语翻译~急!!高手请进 武威尚城华府售楼服务热线是多少? 2024年多门超薄零嵌冰箱推荐 精选10款60cm超薄法式多门冰箱,含松下453... ...目前公认最好的三款海尔法式四门冰箱!TOP3海尔法式四门冰箱推荐! 自己的淘宝店重置密码后还要手势照,身份证正面照片和背面照片等待审合... 2024年618高性价比西门子智能法式多门冰箱推荐 哪款法式冰箱年轻人用的比较多,体验感较好?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com