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

#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;
}

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)
{ // 从队头到队尾依次对队列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",e.name,e.id,e.x,e.y,e.z); // 输出i所指元素
i=(i+1)%MAX_QSIZE; // i指向下一个元素
}
printf("\n");
}

void main()
{
int i;
SqQueue Q;
InitQueue(Q);
point p[N];
point e;
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,e);

}
运行时如入数据后弹出对话框---应用程序错误,0xccccccc内存不能为written.
为什么会这样啊?怎么改?急求解……答得好加分!~
额……我也不知道是内存溢出还是什么……我是初学者……我急于知道哪里错了,怎么能改对……希望各位大侠帮帮忙~

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;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-11-14
改了三个地方:用//!!!!!!标注的地方:

#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;
}
第2个回答  2010-11-14
这个知道的可能都不会看这里了
第3个回答  2010-11-14
是内存溢出吗?

数据结构顺序循环队列中取模(求余)问题,C语言
因为是循环队列 所以 完全有可能出现 队头在队尾后面的情况,即R<F 比如 一共10个元素 M=10 先入队9个元素,队头指向最后一个 即9 然后 出队5个元素,队尾指向5 再入队三个元素, 队头指向2 这是队内实际个数为(2-5+10)%10 = 7个 至于为什么要加上 是因为 当F=9 R=5的时候 (9...

...求一完整程序 !】编写实现该循环队列的入队和出队操作的算法。_百...
if (tail==top)printf("空队列");printf("\\n");printf("\\n1队列初始化\\n2入队操作\\n3出队操作\\n4输出队头元素\\n5判断队列是否为空\\n0退出\\n请输入代码:");scanf("%d",&n);} while (n!=0);}

请问,在严蔚敏《数据结构(C语言版)》中,不能用动态分配的一维数组来实...
可以的,不过在初始化时开辟的空间要是一定的。这和用数组定义一样。因为当空间满时不能用realloc来重新分配内存。我是这么理解的。如果错了的话请指点。

关于数据结构的问题,用C语言描述
一、数据结构的章节结构及重点构成数据结构学科的章节划分基本上为:概论,线性表,栈和队列,串,多维数组和广义表,树和二叉树,图,查找,内排,外排,文件,动态存储分配。对于绝大多数的学校而言,“外排,文件,动态存储分配”三章基本上是不考的,在大多数高校的计算机本科教学过程中,这三章也是基本上不作讲授的。所以,...

C语言版数据结构程序设计求大神帮助
struct { SElemType elem[MaxSize]; int front,rear; }SqQueue; \/* 队列 *\/ void InitQueue(SqQueue* pQ) \/* 初始化队列,开始时队列为空 *\/ { pQ->front=pQ->rear=0; } int EnQueue(SqQueue* pQ,SElemType e) \/* 进队 *\/ { if ((pQ->rear+1)%MaxSize == pQ->front)...

数据结构 c语言版问题何谓队列上溢现像?解决它有哪些方法,且分别简述其...
队列的上溢就是,队列中实际上还有位置可存储元素,但是指示位置的指针呢不能正确表示存放位置,指到了不能存放元素的位置,并且告诉系统,不能存了,这是与现实中队列运行不同的,上溢就是走一次,走到了存满元素的最后一个位置,再走,就超出了可存放元素的位置。解释一下,教室里可以做100个学生...

数据结构C语言版的图书目录
2括号匹配的检验493?2?3行编辑程序493?2?4迷宫求解503?2?5表达式求值52**3.3栈与递归的实现543.4队列583.4.1抽象数据类型队列的定义583.4.2链队列——队列的链式表示和实现603.4.3循环队列——队列的顺序表示和实现63**3.5离散事件模拟65第4章串704.1串类型的定义704.2串的表示和实现724....

常用数据结构有哪些
链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。5、树 树是一种数据结构,...

求09年3月份全国计算机等级考试二级c语言笔试试题的详细讲解
09年3月全国计算机等级考试二级C笔试真题(附答案)(考试时间90分钟,满分100分)一、选择题(1)下列叙述中正确的是 A) 栈是先进先出(FIFO)的线性表B) 队列是先进先出(FIFO)的线性表C) 循环队列是非线性结构D) 有序线性表既可以采用顺序存储结构,也可以采用链式存储结构(2)支持子程序调用的数据结构是 A) 栈 ...

二级c语言,队列、循环队列是什么?
队列是一种特殊的线性表,循环队列是将向量空间想象为一个首尾相接的圆环。1、队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。2、循环队列是将向量空间想象为一个首尾相接的圆环,并称...

相似回答