关于队列的清空

wuyuwww 2011-07-18 06:45:41
我写的队列的清空
不知道对不对,哪位高手看看
#include<stdlib.h>
#include<stdio.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status
typedef struct _QNode{
int data;
struct _QNode * next;
}QNode,*QueuePtr;

typedef struct{
QueuePtr front;//队列头指针
QueuePtr rear;//队列尾指针
}LinkQueue;

Status InitQueue(LinkQueue &Q)
{//建立一个空队列
Q.front=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front) exit(OVERFLOW);
Q.front->next=NULL;
Q.rear=Q.front;
return OK;
}
Status ClearQueue(LinkQueue &Q)
{
QueuePtr s;
while(Q.front->next->next)
{
Q.front->next=Q.front->next->next;
free(Q.front);
}
free(Q.front->next);
Q.front->next=NULL;
Q.rear=Q.front;
//free(Q.front->next);
return OK;
}


我不知道清空队列与摧毁队列有啥区别,不知道我这样清空队列对不对.请教高手
...全文
755 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
走好每一步 2011-07-23
  • 打赏
  • 举报
回复
楼主还没明白我意思。
我是说既然你都定义了结构体来存放循环队列的头与尾,为什么还要画蛇添足使用头结点?
最好把你的想要说出来,别只是求别人改你的源代码,你的思想都错了,别人怎么改呢?
wuyuwww 2011-07-23
  • 打赏
  • 举报
回复
我的思想好像是:不是队列是删除头吗 从尾进吗 所以我在摧毁的时候也是从头删 最后留尾结点 在吧头结点赋值和尾结点相等 就是这样的啦
Xomic 2011-07-22
  • 打赏
  • 举报
回复
楼主!散分啊...
懒得打字 2011-07-22
  • 打赏
  • 举报
回复

Status ClearQueue(LinkQueue &Q)
{
QueuePtr s;
while(Q.front!=Q.rear)
{
s=Q.front;
Q.front=Q.front->next;
free(s);
}
return OK;
}
wuyuwww 2011-07-22
  • 打赏
  • 举报
回复
我才不三分啊 给帖了代码的同志分数啊
shaotine_wu 2011-07-19
  • 打赏
  • 举报
回复
没运行,不过看了下,感觉下面代码有问题

while(Q.front->next->next)
{
Q.front->next=Q.front->next->next;
free(Q.front); //这里都把Q.front给释放了,那下次循环的时候,Q.front->next->next去哪找啊????
}

LZ可以用两个局部变量,一个是用来保存要删的结点,一个是用来保存要删结点的上一个结点。这样就不会丢失要删结点的上一个结点了

wuyuwww 2011-07-19
  • 打赏
  • 举报
回复
谢谢楼上的啊 说的很详细 人才啊
Xomic 2011-07-19
  • 打赏
  • 举报
回复
1、free(Q.front); // 你把头空节点也删了!清空的话保留头空节点,下次就不用重新建立队列

2、习惯上:销毁的话是把头空节点也释放掉,下次使用必须重新建立。

3、while(Q.front->next->next)

你的清空函数如果连续运行两次,程序就会break!if(Q.front->next==NULL) ???
tianzhu_1 2011-07-19
  • 打赏
  • 举报
回复
清空的话,头结点和尾结点还在,也就是说这个队列还存在,只是清空了数据,释放了所占用的空间,但是摧毁队列的话,所有数据都不存在了,就是说还要用这个队列的话,就得重新建立一个队列
wuyuwww 2011-07-19
  • 打赏
  • 举报
回复
楼上的方法还不错 可以借鉴一下
xuxinmmy 2011-07-19
  • 打赏
  • 举报
回复
你这是有头节点的队列,清空后要还原成初始化的样子,即只有一个头节点

Status ClearQueue(LinkQueue &Q)
{
if(!Q.front)
exit(OVERFLOW);

//将要删除的节点取出来 del
QueuePtr del = Q.front->next;
Q.front->next = NULL;
Q.rear=Q.front;

//删除链表del即可
while(del)
{
QueuePtr tmp = del;
del = del->next;
free(tmp);
}

return OK;
}
走好每一步 2011-07-19
  • 打赏
  • 举报
回复
楼主都定义了一个结构体
LinkQueue来存放front结点和rear结点了。怎么还去申请一个空结点?

先用文字加图形把整个思路理清,再来写程序吧。因为我不知道你的思路是什么
未注销 2011-07-18
  • 打赏
  • 举报
回复
清空队列还是存在的啊,摧毁是队列已经不存在了。
wuyuwww 2011-07-18
  • 打赏
  • 举报
回复
楼上讲的啥马 对如我这种对知识如饥似渴的人,我真是很。。。,也不讲我错在哪里了?我真是很服了这样的回答者,
jixingzhong 2011-07-18
  • 打赏
  • 举报
回复
环形队列,这么清理没有问题。

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧