数据结构c语言版,出队入队及依次输出一个队列的操作。

代码如下,输出没有什么大的问题就是会弹出一个错误黑色的提示框。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef int QElemType;
typedef struct QNode {
QElemType data;
struct QNode *next;
}QNode;

typedef struct{
QNode *front,*rear;
}LinkQueue;

void enQueue(LinkQueue *Q, QElemType e);/*入队列操作*/
void delQueue(LinkQueue *Q,QElemType *e);/*出队列操作*/
void printQueue(LinkQueue *Q);/*依次输出队列*/
main()
{
LinkQueue *myQueue;
QNode *s;
QElemType elem;
myQueue=(LinkQueue *)malloc(sizeof(LinkQueue));

s=(QNode *)malloc(sizeof(QNode));
s->next=NULL;
myQueue->front=myQueue->rear=s;
enQueue(myQueue,5);
enQueue(myQueue,7);
enQueue(myQueue,9);
delQueue(myQueue, &elem);
printf("出队列的元素为:%d\n",elem);
printQueue(myQueue);

}

void enQueue(LinkQueue *Q, int e)/*入队列操作*/
{
QNode *s;
s=(QNode *)malloc(sizeof(QNode));
s->data=e;
s->next=NULL;
Q->rear->next=s;
Q->rear=s;

}
void delQueue(LinkQueue *Q, int *e)/*出队列操作,将删除的结点值保存在参数*e中*/
{ QNode *s;
if(Q->front==Q->rear)
{
printf("队列为空!");
exit(1);
}
s=Q->front->next;
*e=s->data;
Q->front->next=Q->front->next->next;
free(s);
}
void printQueue(LinkQueue *Q)/*依次输出队列*/
{
if(Q->front==Q->rear)
{
printf("队列为空");
exit(1);
}
while(Q->front!=Q->rear)/*老师告诉我说是这里的while是死循环,为什么是死循环呢,不是很懂,请细说。请帮我改为正确的代码,谢谢。*/
{

printf("%d, ", Q->front->next->data);
Q->front->next=Q->front->next->next;
}
exit(0);
}

  黑色的提示框是程序运行结果窗口,不是错误的窗口

  代码错误说明如下:

while(Q->front!=Q->rear)//在本循环体之中,Q->front Q->rear的值始终没有变化
//故而在这里肯定是一个死循环
{
    printf("%d,  ", Q->front->next->data);
    Q->front->next=Q->front->next->next;
}
//改正后的代码如下:
QNode* s = Q->front;
while(s!=Q->rear)
{
    printf("%d,  ", s->data);
    s=s->next;
}

  另外,所有的函数当中不应该有exit

  exit是一个系统函数,表示结束程序,而不是退出函数

  如果需要退出函数可以使用return来达到该目的

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-26
你的代码是想把front到rear的值全部输出
但是你下面的操作自己检查一下没有改变front的值,也没有改变rear的值,所以front!=rear是死循环
如果好一点的话
void printQueue(LinkQueue *Q)/*依次输出队列*/
{
if(Q->front==Q->rear)
{
printf("队列为空");
exit(1);
}
while(Q->front!=Q->rear)/*老师告诉我说是这里的while是死循环,为什么是死循环呢,不是很懂,请细说。请帮我改为正确的代码,谢谢。*/
{

printf("%d, ", Q->front->data);
Q->front=Q->front->next;
}
//exit(0);
}试试可不可以,不行再追问追问

追答

怎么了?

追问

你把图片打开嘛,主函数的注释里就是我提出的问题,谢谢了。

追答

你把你的exit(0) exit(1) 给删掉,这是结束成熟的标志

追问

不好意思,运行正确了,你可以给我讲讲“exit(0) exit(1) 给删掉,这是结束成熟的标志'’,这句话是什么意思,为什么这样做,不是很懂。谢谢

本回答被提问者采纳

数据结构C语言描述的链队列的基本操作(初始化,判空,入队,出队,取对头...
free(t);return 1;} \/\/取队头 输出队列所有数就是出队

数据结构课程设计《报数游戏》队列问题 c语言
约瑟夫环问题:如果你用队列做的话,设一个计数器,如果计数器<m就出队后再入队,等于m时那个元素只出队不入队,输出这个元素并且让m等于0。循环到队列为空就行了。

C语言中,队列是什么意思,有什么用途
队列一种可以实现“先进先出”的存储结构,即“一端入,一端出”,队首(front)出队,队尾(rear)入队,若front指向队首,则rear指向队尾最后一个有效元素的下一个元素;若rear指向队尾,则front指向队首第一个有效元素的下一个元素。队列特殊之处在于它只允许在表的前端(front)进行删除操作,而在...

关于数据结构的问题,用C语言描述
1.设一函数f(x,y)=(1+A*(e^B\/cosθ)*(1+C*(cosψ)^2),其中θ=(π*x)\/180,ψ=(π*y)\/180,参数A=-0.5,B=-0.4,C=-0.1。x从0变化到89,步长为1,y从0变化到359,步长为1。采用一种数据结... 1. 设一函数 f(x,y)=(1+A*(e^B\/cosθ)*(1+C*(cosψ)^2),其中θ=(π*x)\/18...

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

c语言队列操作
= pnew这个代码从队列的尾部增加新节点,然后pq->rear = pnew更新队列尾部指针。队列的数据结构形式就是由一个头front指针,一个尾rear指针来表征,items的设计是用空间换时间,涉及队列大小的操作会非常方便。队列的特征是先进先出,你给出的链式实现,其实就跟一个链表一样,链表的添加删除如果能理解...

将下面的算术运算式表示成逆波兰式(数据结构 C语言版)
读入(,入栈,栈中为*(,输出:ab+;读入(,入栈,栈中为*((,输出:ab+;读入c,直接输出,栈中为*((,输出:ab+c;读入-,入栈,栈中为*((-,输出:ab+c;读入d,直接输出,栈中为*((-,输出:ab+cd;读入),依次推出栈中的符号,直到遇见一个(【注意括号不输出】,栈...

C语言数据结构:利用两个顺序栈来实现一个列队的功能时遇到的问题
此时要想在入栈一个元素6的话,按照你的想法,得把s1的数据出栈到一个缓冲区,然后把缓冲区中,在原来s1栈底的3挪动到s2的栈顶,然后s1的4、5依次压回栈s1,然后s1就能够空出栈顶的一个位置了,对吧?但是,这个放置s1出栈元素的缓冲区。。。也得是一个栈结构吧?否则的话,你怎么知道s1向...

严蔚敏 的 《数据结构(C语言版)》 这本书在豆瓣评分为什么不高?_百度...
严蔚敏的《数据结构(C语言版)》这本书在豆瓣评分挺高的。数据结构(C语言版)的具体内容:数据结构分为8类有:数组、栈、队列、链表、树、散列表、堆、图。数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。1、数组 数组是可以再内存中连续存储多个元素的...

c语言有哪些数据结构
链表是一种线性结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。栈遵循后进先出原则,支持压栈和弹栈操作,而队列遵循先进先出原则,提供入队和出队操作。树是一种非线性结构,由节点和指针组成,如二叉树。图同样是非线性结构,由节点和边构成,表示多对多关系。在C语言中,这些数据...

相似回答