这个代码一开始出了点问题,在进队列时没有将next指针置为NULL导致后面数据出错,不过好在,我问了一个朋友,才发现这个问题。
在此我要对我这位朋友表示感谢!3Q温小姐
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream.h>
typedef int ELemType;
typedef struct Node
{
ELemType data;
struct Node *next;
}QNode;
typedef struct
{
QNode *front;
QNode *rear;
}LiQueue;
void InitQueue(LiQueue *&p)
{
p=(LiQueue *)malloc(sizeof(LiQueue));
p->front=p->rear=NULL;
}
void DestroyQueue(LiQueue *&q)
{
QNode *r,*p=q->front;
if(p!=NULL)
{
r=p->next;
while(r!=NULL)
{
free(p);
p=r;
r=p->next;
}
}
free(p);//删除头节点
free(q);//删除链队头结点
}
bool QueEmpty(LiQueue *q)
{
return (q->rear==NULL);
}
void EnQueue(LiQueue *&q,ELemType e)
{
QNode *r;
r=(QNode *)malloc(sizeof(QNode));
r->data=e;
r->next=NULL;
if(q->rear==NULL)
{
q->front=q->rear=r;
}
else
{
q->rear->next=r;
q->rear=r;
}
}
bool DeQueue(LiQueue *&p,ELemType &e)
{
QNode *r;
if(p->rear!=NULL)
{
r=p->front;
e=r->data;
if(p->rear==p->front)
p->rear=p->front=NULL;
else
{
p->front=p->front->next;
}
free(r);
return true;
}
return false;
}
void DisQueue(LiQueue *q)
{
if(q->rear!=NULL)
{
QNode *p=q->front,*r;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
}
}
int main()
{
int a;
LiQueue *q;
InitQueue(q);
if(QueEmpty(q))
cout<<"队列为空"<<endl;
EnQueue(q,1);
EnQueue(q,2);
EnQueue(q,3);
EnQueue(q,4);
DisQueue(q);
DeQueue(q,a);
cout<<a<<endl;
DisQueue(q);
DestroyQueue(q);
return 0;
}
本文介绍了一个简单的链式队列数据结构的实现,并分享了在开发过程中遇到的一个bug——未将新加入队列的元素的next指针设置为NULL的问题及解决方法。
566

被折叠的 条评论
为什么被折叠?



