c语言编程软件,链队列问题求解队列节点间靠什么联系在一起的?下面有代码请网友指点

数据结构 C语言 队列的基本操作 调试出现了问题 在线等 急 把我的悬赏都给你了_百度知道
提问者采纳
你的不是调试的问题,是照搬《数据结构》教材p61-62上算法,那是伪代码!无法运行!修改了以下内容:1、函数中间的形参必须改成指针:如&int&InitQueue(LinkQueue&&Q)改成&int&InitQueue(LinkQueue&*Q)2、没有头文件定义Overflow3、output函数算法错误!换成vist4、主函数的调用有很多小问题代码和运行结果如下:#include&stdio.h&#include&&stdlib.h&typedef&struct&QNode{int&struct&QNode&*}QNode,*QueuePtypedef&struct{QueuePrt&QueuePrt&}LinkQint&InitQueue(LinkQueue&*Q)&{&/*&构造一个空队列Q&*/&&&(*Q).front=(*Q).rear=(QueuePrt)malloc(sizeof(QNode));&&&if(!(*Q).front)&&&&&exit(0);&&&(*Q).front-&next=NULL;&&&return&1;&}&/*int&InitQueue(LinkQueue&&Q){&&&&Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));&&&&if(!Q.front)&exit&(OVERFLOW);&&&&Q.front-&next=NULL;&&&&return&1;&}*/int&creatQueue(LinkQueue&*Q){int&i,n;QueuePrt&s;printf(&inpur&num:\n&);scanf(&%d&,&n);printf(&inpur&numbers:\n&);for(i=0;1&n;i++){s=(QueuePrt)malloc(sizeof&(QNode));scanf(&%d&,s-&data);Q-&rear-&next=s;&&&&&&&&Q-&rear=s;&&&&&&&s=s-&&}&&&&Q-&rear-&next=NULL;return&1;}int&EnQueue(LinkQueue&*Q,int&e)//插入元素e{&&QueuePrt&p;&&&&printf(&input&);&&&&p=(QueuePrt)malloc(sizeof(QNode));&&&&if(!p)exit(0);//存储分配失败&&&&p-&data=e;&p-&next=NULL;&Q-&rear-&next=p;&Q-&rear=p;&return&1;}int&DeQueue(LinkQueue&*Q,int&e)//删除队头元素e{QueuePrt&p;&&&&if(Q-&front==Q-&rear)&&&&return&0;&&&&p=Q-&front-&&&&&e=p-&&&&&Q-&front-&next=p-&&&&&if(Q-&rear==p)&&Q-&rear=Q-&&&&&free(p);&&&&return&1;&}/*int&output(LinkQueue&&Q)//出队,想输出来(这个算法是错误的,需要输出全部元素用上面这个Dequeue,需要输出队首用下面这个vist{LinkQueue&*s;&s=Q;&QueuePrt&p;&p=s-&front-&while(p!=NULL)&{printf(&%3d&,p-&data);p=p-&}}*/int&vist(LinkQueue&Q,void(*vi)(int))&{&/*&从队头到队尾依次对队列Q中每个元素调用函数vi()。一旦vi失败,则操作失败&*/&&&QueuePrt&p;&&&p=Q.front-&&&&while(p)&&&{&&&&&vi(p-&data);&&&&&p=p-&&&&}&&&printf(&\n&);&&&return&1;&}&void&vi偿範稗既织焕半唯报沥(int&i)&{&&&printf(&%d&&,i);&}void&main(){&int&i,d;&&&LinkQueue&q;&&&i=InitQueue(&q);&&&if(i)printf(&成功地构造了一个空队列!\n&);&&&&EnQueue(&q,-5);&&&EnQueue(&q,5);&&&EnQueue(&q,10);&&&printf(&队列的元素依次为:&);&&&vist(q,vi);&&//出队Dequeue自己做&&}程序一共帮你修改了错误数十个,功夫费了不少,出队Dequeue请模仿上面自己做&
提问者评价
太给力了,你的回答完美的解决了我的问题!
其他类似问题
按默认排序
其他2条回答
#include&stdio.h&#include &stdlib.h&typedef struct QNode{struct QNode *}QNode,*QueuePtypedef struct{QueuePQueueP}LinkQint InitQueue(LinkQueue &Q)//建立一个空队列{
Q.front=Q.rear=(QueuePrt)malloc(sizeof (QNode));
if(!Q.front) exit (0);
Q.front-&next=NULL;
return 1; }int creatQueue(LinkQueue &Q)//入队{int i,n;QueuePprintf(&inpur num:&#偿範稗既织焕半唯报沥92;n&);scanf(&%d&,&n);printf(&inpur numbers:\n&);for(i=0;1&n;i++){s=(QueuePrt)malloc(sizeof (QNode));scanf(&%d&,&(s-&data));Q.rear-&next=s;
//s=s-& 无用}
Q.rear-&next=NULL;return 1;}int EnQueue(LinkQueue &Q,int e)//插入元素e {QueueP
printf(&input&);
p=(QueuePrt)malloc(sizeof(QNode));
if(!p)exit(0);//存储分配失败
p-&data=e; p-&next=NULL; Q.rear-&next=p; Q.rear=p; return 1;}int DeQueue(LinkQueue &Q,int &e)//删除队头元素e{QueueP
if(Q.front==Q.rear)return 0;
p=Q.front-&
Q.front-&next=p-&
if(Q.rear==p)Q.rear=Q.
return 1; }int output(LinkQueue &Q)//出队,想输出来{LinkQueue &s=Q;QueuePp=s.front-&while(p!=NULL){printf(&%3d&,p-&data);p=p-&}return 1;}void main(){LinkQueue *Q=(LinkQueue*)malloc(sizeof(LinkQueue));
int InitQueue(LinkQueue &Q) ;int creatQueue(LinkQueue &Q);int output(LinkQueue &Q);int EnQueue(LinkQueue &Q,int e) ;int output(LinkQueue &Q);int DeQueue(LinkQueue &Q,int e);int output(LinkQueue &Q);}望采纳
不要引用,c语言没有引用
具体怎么改呢 主函数还有这样的问题
不要用 &,直接定义
数据结构的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁用C语言编写队列程序_百度知道
用C语言编写队列程序
试写程序识别依读入@结束符字符序列否形‘序列1&序列2’模式字符序列其序列1序列2都包含字符‘&’且序列2序列1逆序列
我有更好的答案
按默认排序
#include&stdio.h&#include&stdlib.h&#include&malloc.h&#define TRUE 1#define FALSE 0#define NULL 0#define OK 1#define OVERFLOW 0#define ERROR 0typedef int QElemTtypedef int Stypedef struct QNode{
QElemT QNode *}*QueuePstruct LinkQueue{
QueuePtr front,//队队尾指针};//函数列表void InitQueue(LinkQueue &Q){//初始化队列 Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front)//结点失败
exit(OVERFLOW); Q.front-&next=NULL;}void DestoryQueue(LinkQueue &Q){ //销毁队列 while(Q.front) {
Q.rear=Q.front-&//Q.rear指向Q.front结点
free(Q.front);//释放Q.front所指结点
Q.front=Q.//Q.front指向Q.front结点 }}void ClearQueue(LinkQueue &Q){ //队列清空 DestoryQueue(Q);//销毁队列 InitQueue(Q);//重新构造队列}Status QueueEmpty(LinkQueue Q){ //判断队列否空 if(Q.front-&next==NULL)
return TRUE; else return FALSE;}int QueueLength(LinkQueue Q){ //求队列度 int i=0;//计数器清0 QueuePtr p=Q.//p指向结点 while(Q.rear!=p)//p所指向尾结点 {
i++;//计数器加1
p=p-& }}Status GetHead(LinkQueue Q,QElemType &e){
//若队列空则用e返队元素 QueueP if(Q.front==Q.rear) return ERROR; p=Q.front-&//p指向队结点 e=p-&//队元素值赋给e return OK;}void EnQueue(LinkQueue &Q,QElemType e){ //插入元素e队列Q新队尾元素
p=(QueuePtr)malloc(sizeof(QNode));
//态新结点
exit(OVERFLOW);
p-&data=e;//e值赋给新结点
p-&next=NULL;//新结点指针空
Q.rear-&next=p;//原队尾结点指针域指向新结点
Q.rear=p;//尾指针指向新结点}Status DeQueue(LinkQueue &Q,QElemType &e){ //若队列空删除Q队元素用e返其值
if(Q.front==Q.rear)//队列空
return ERROR;
p=Q.front-&//p指向队结点
e=p-&//队元素赋给e
Q.front-&next=p-&//结点指向结点
if(Q.rear==p)//删除队尾结点
Q.rear=Q.//修改队尾指针指向结点
return OK;}void QueueTraverse(LinkQueue Q,void(*visit)(QElemType)){ //队队尾依队列每元素调用函数visit()
p=Q.front-&
visit(p-&data);//p所指元素调用visit()
printf(&\n&);}void print(QElemType e){ printf(&%2d&,e);}void main(){
InitQueue(q);//构造空栈 for(i=1;i&=5;i++) {
EnQueue(q,i); } printf(&栈元素:&);
QueueTraverse(q,print);
k=QueueEmpty(q);
printf(&判断栈否空,k=%d(1:空9;0:空)\n&,k);
printf(&队元素赋给d\n&);
k=GetHead(q,d);
printf(&队元素d=%d\n&,d);
printf(&删除队元素:\n&);
DeQueue(q,d);
k=GetHead(q,d);
printf(&删除新队元素d=%d\n&,d);
printf(&队列度%d\n&,QueueLength(q));
ClearQueue(q);//清空队列
printf(&清空队列q.front=%u,q.rear=%u,q.front-&next=%u\n&,q.front,q.rear,q.front-&next);
DestoryQueue(q);
printf(&销毁队列,q.front=%u,q.rear=%u\n&,q.front,q.rear);
LZ你想学编程的话我建议去饭客网络学习,那里有专门的版块供大家交流学习,还有许多教程供大家观看,你的问题到那里可以解决
其他类似问题
c语言的相关知识
您可能关注的推广
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁用C语言编写队列的各种基本操作,我不是非常明白:注释里有些问题:请大家讲讲,如果可能,请详细讲讲各种_百度知道
用C语言编写队列的各种基本操作,我不是非常明白:注释里有些问题:请大家讲讲,如果可能,请详细讲讲各种
#include &stdafx.h&#include &stdio.h&#include &conio.h&#include &stdlib.h&#include &math.h&#define OK 1#define ERROR 0typedef struct qnode{ struct qnode *}*QnodePtr,Qtypedef struct linkqueue{ QnodeP QnodeP}LinkQvoid InitQueue(LinkQueue *Q)//创建一个队列并且初始化队列{ if(!(Q-&front=Q-&rear=(QnodePtr)malloc(sizeof(struct qnode))))
exit(OVERFLOW); Q-&front-&next=NULL;//为何要这样做???}void DestroyQueue(LinkQueue *Q)//销毁队列{ while(Q-&front) {//在这里Q-&reat就没什么用了吗?可以用来做中间变量来释放内存????
Q-&rear=Q-&front-&
free(Q-&front);
Q-&front=Q-& }}void ClearQueue(LinkQueue *Q)//把队列清空成空队列{ QnodePtr p=NULL,q=NULL; Q-&rear=Q-& p=Q-&front-& Q-&front-&next=NULL;//注意这两句话的意思
while(p!=NULL) {
}}int QueueEmpty(LinkQueue Q)//注意这里Q不是传递的地址{ if(Q.front==Q.rear)
return OK; return ERROR;}int QueueLength(LinkQueue Q)//求队列的长度{ QnodePtr p=Q.//注意这里变量的类型 int length=0; while(p!=Q.rear) {
p=p-& }}int GetHead(LinkQueue Q,int *e)//获取队首元素{ QnodePtr p=NULL;//声明一个节点型的指针变量 if(Q.front==Q.rear)
return ERROR; p=Q.front-&//p指向队首元素??? *e=p-& return OK;}void QueueInsert(LinkQueue *Q,int e)//将e元素插入到队尾//由于这里需要对队列Q进行添加操作,所以要用指针型变量{ QnodePtr p=(QnodePtr)malloc(sizeof(Qnode)); if(!p)
exit(OVERFLOW); p-&data=e; p-&next=NULL;//这一步有什么必要性呢???? Q-&rear-&next=p;//注意这里是什么意思//
回答:这一步把p节点连接到队列中去 Q-&rear=p;//注意这一步把队尾指针指向p,使p成为新的队尾指针}int QueueDelete(LinkQueue *Q,int *e)//删除队首元素,并用e来承载删除元素的值{ QnodePtr p=NULL; if(Q-&front==Q-&rear)
return ERROR; p=Q-&front-& *e=p-& Q-&front-&next=p-&//问:这一步是什么意思 if(Q-&rear==p)
Q-&front=Q-& free(p); return OK;}void QueueTraverse(LinkQueue Q,void (*vi)(int))//从队首到队尾对每个元素调用函数 vi(){ QnodePtr p=Q.front-& while(p!=NULL) {
vi(p-&data);
p=p-& } printf(&\n&);}void Print(int i){ printf(&%d&,i);}
提问者采纳
ont)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入在元素将是最先被删除;反之最后插入的元素将最后被删除,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。
队列空的条件:front=rear
队列满的条件: rear = MAXSIZE
队列可以用数组Q[1…m]来存储,数组的上界m即是队列所容许的最大容量。在队列的运算中需设两个指针:head,队头指针,指向实际队头元素的前一个位置;tail,队尾指针,指向实际队尾元素所在的位置。一般情况下,两个指针的初值设为0,这时队列为空,没有元素。图1 ( a)画出了一个由6个元素构成的队列,数组定义Q[1…10]。Q(i) i=3,4,5,6,7,8头指针head=2,尾指针tail=8。队列中拥有的元素个数为:L=tail-head现要让排头的元素出队,则需将头指针加1。即head=head+1这时头指针向上移动一个位置,指向Q(3),表示Q(3)已出队。见图1 (b)。如果想让一个新元素入队,则需尾指针向上移动一个位置。即tail=tail+1这时Q(9)入队,见图1 (c)。当队尾已经处理在最上面时,即tail=10,如果还要执行入队操作,则要发生&上溢&,但实际上队列中还有三个空位置,所以这种溢出称为&假溢出&。
克服假溢出的方法有两种。一种是将队列中的所有元素均向低地址区移动,显然这种方法是很浪费时间的;另一种方法是将数组存储区看成是一个首尾相接的环形区域。当存放到n地址后,下一个地址就&翻转&为1。在结构上采用这种技巧来存储的队列称为循环队列。
队列和栈一样只允许在断点处插入和删除元素。
循环队的入队算法如下:
1、tail=tail+1;
2、若tail=n+1,则tail=1;
3、若head=tail尾指针与头指针重合了,表示元素已装满队列,则作上溢出错处理;
4、否则,Q(tail)=X,结束(X为新入出元素)。
队列和栈一样,有着非常广泛的应用。具体网上查:另外,虚机团上产品团购,超级便宜
提问者评价
其他类似问题
c语言的相关知识
按默认排序
其他1条回答
指针指向NULL,释放当前占用的内存空间
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁求C语言实现链队列的建立和出入队列_百度知道
求C语言实现链队列的建立和出入队列
要C语言的,最好简单基础点,我是编程苦手
最好能输入数字的
提问者采纳
#include&stdio.h&#include&stdlib.h&struct&Node&{ int&&//&数据类型自己根据需要定义 Node&*};struct&Queue&{ Node&*head,&*};Queue*&creatQueue()&{ Queue&*Q&=&new&Q Node&*node&=&(Node*)&malloc(sizeof(Node));&//&创建头节点 node-&next&=&NULL; Q-&head&=&Q-&rear&=& return&Q;}void&enQueue(Queue&*Q,&int&d)&{ Node&*node&=&(Node*)&malloc(sizeof(Node)); node-&data&=&d; node-&next&=&NULL; Q-&rear-&next&=& Q-&rear&=&}int&deQueue(Queue&*Q)&{ int& if&(Q-&head==Q-&rear)&{
printf(&队列下溢!&);
return&;&//&表示错误 } Node&*node&=&Q-&head-& data&=&node-& Q-&head-&next&=&node-& if(node-&next==NULL)&{
Q-&rear&=&Q-& } free(node); return&}void&printQueue(Queue&*Q)&{ Node&*node&=&Q-&head-& puts(&Queue:&&); while(node!=NULL)&{
printf(&%d&&,&node-&data);
node&=&node-& } putchar('\n');}void&destroyQueue(Queue&*Q)&{&//&回收内存 Node&* while(Q-&head)&{
node&=&Q-&head-&
free(Q-&head);
Q-&head&=& } free(Q);}void&main()&{ int&d,&run&=&1; Queue&*Q&=&creatQueue(); while(run)&{
system(&cls&);
printQueue(Q);
puts(&1、入队\n2、出队\n3、退出\n请输入操作号:&);
scanf(&%d&,&&d);
switch(d)&{
puts(&请输入需要入队的数字:&);
scanf(&%d&,&&d);
enQueue(Q,&d);
printf(&%d&出队\n&,&deQueue(Q));
puts(&输入错误!\n&);
system(&pause&); } destroyQueue(Q);}
提问者评价
有劳啦,谢谢!
其他类似问题
c语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁0:58:29【 转载互联网】 作者: &&|&责编:李强
&&& &为了解决用户可能碰到关于"C语言关于循环队列的问题,求帮忙!"相关的问题,突袭网经过收集整理为用户提供相关的解决办法,请注意,解决办法仅供参考,不代表本网同意其意见,如有任何问题请与本网联系。"C语言关于循环队列的问题,求帮忙!"相关的详细问题如下:RT,我想知道:C语言关于循环队列的问题,求帮忙!===========突袭网收集的解决方案如下===========
解决方案1:第一种情况有40-8 = 32个元素,相当于走了一圈还多.
第二种情况有8个元素,说明还没被循环覆盖掉,
================可能对您有帮助================
问:5. 设循环队列的容量为40(序号从0到39),现经过一系列的入队和出队运...答:第一种情况有40-8 = 32个元素,相当于走了一圈还多. 第二种情况有8个元素,说明还没被循环覆盖掉,===========================================问:这是一个只有一个尾指针指向最后一个节点的循环链式队列,我编写的一个...答:rear=p;应该是这句话的问题,你的参数truct duilie *rear,这么写可以改变rear指向内容的值,但不能改变rear指向的内容,应该使用指向指针的指针 void insert(struct duilie **rear,int a) //a为要入队的数值,rear是尾指针 { struct duilie *p,...===========================================问:这是一个只有一个尾指针指向最后一个节点的循环链式队列,我编写的一个...答:14-6=8个元素===========================================问:金币: 国王用金币奖励他忠诚的侍从。第一天侍从工作结束后,国王奖励了...答:本人也是初学C语言,写得不够简练,见谅 1. #include #include main() { char a[200],*p=a,*q; int n,i; gets(a); n=strlen(a); q=&a[n-1]; for(;pj) {strcat(a,b); puts(a);} else {strcat(b,a); puts(b);} getch(); }===========================================问:#include &stdio.h& #include &conio.h& #include &math.h& #include &s...答:这个链表队列是具备头节点功能,因此在链头那里不存放数据,从后面开始算 int QueueLen(LinkQueue Q)//求队列的长度 { int length=0; //QnodePtr p=Q.front-&//这是为什么是Q.front //while(p!=NULL)//为什么这里是p!=Q.rear??? 不可以是...===========================================问:如果一个正整数恰好等于它的所有因子(包括1但不包括自身)之和,则称之为...答:是不是最后出现一个莫名其妙的数 关键问题在于 count++和最后一个for循环中的 b===========================================问:系统给定外部整型变量n、i、imin和整型二维数组a(不需要 自行定义)。...答:int get_min_value( int a[][10], int row) { int v = 0; for(i = 0; i===========================================问:编程 已知某课程的平时、实习、测验和期末成绩,求学生在该课程的总评成...答:按照你的要求编写的C语言程序如下: #include int main(){ float pingshi,shixi,ceyan, do do{ printf("请输入平时成绩:"); scanf("%f",&pingshi); printf("请输入实习成绩:"); scanf("%f",&shixi); ...===========================================问:#include&stdio.h&voidmain() { int i=1,a=0; for(; i&=5; i++) { do { ...答:学习一下for循环的执行过程就知道为什么了。===========================================第一种情况有40-8 = 32个元素,相当于走了一圈还多.
第二种情况有8个元素,说明还没被循环覆盖掉,===========================================这个是循环队列~如果MAXSIZE=10
rear=10的时候REAR+1就是11了超出范围了 这样%MAXSIZE不就又变成一了么 这样才是循环啊!===========================================用指针的方法啊,设front为头指针,temp为尾指针,用front-temp,如果其值为正的,就为指针长度,如果为负,则加上循环队列长度就是的=========================================== // 应该是10和20把?
rear=20的意思是指20的那个位置为下次插入的位置
也就是说现在队里有:10 11 12 13......19
20的也是这么算的。。。===========================================队列和语言无关,主要看采用什么策略!
1)多1空间的一种实现!
enum {NUM =120};
struct Queue
int a[NUM+1];
push(x){ q.a[ q.front++]=x;}
pop(){...===========================================头指针一般指向队头元素的前一位置,并不涵盖在队列中,它的数据域中存放的内容也不属于队列元素=========================================== 很简单啊,用一个数组,和2个指针就可以做到这一点,注意,一定要控制好指针,防止写的东西覆盖了没有发送的东西。 一个指针控制写,一个控制输出。如果走到尾巴 ,就把它移动...=========================================== #define MAXSIZE 100 typedef struct {
int * }SqQ int Queuelength(SqQueue Q) //返回Q的元素个数 {
return(Q.rear-Q.front+MAXQSIZE)%MAXS...===========================================2
循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是&qu...===========================================顺序队列的"假上溢"现象:由于头尾指针不断前移,超出向量空间。这时整个向... 是把向量空间形成一个头尾相接的环形,这时队列称循环队列。判定循环队列是空还是满...===========================================
12345678910}

我要回帖

更多关于 c语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信