数据结构:用带头循环链表表示队列的问题

作者&投稿:白贷 (若有异议请与网页底部的电邮联系)
数据结构:如何正向建立一个带头结点的循环链表~

#include#includetypedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next;}LNode,*LinkList;LinkList Create(int n){//创建带头结点n个结点的循环链表 int i; LinkList L,p,q; L=(LinkList)malloc(sizeof(LNode));//头结点 p=q=L; for(i=1;idata); q->next=p; q=p; } q->next=L;//构成循环链表 return L;}void main(){ LinkList L,p; int n=6; L=Create(6); for(p=L->next;p!=L;p=p->next) printf("%d",p->data); printf("
");}

不明白你的意思,下面是一个链队的C语言示例,没有C++版本的:
#include #include #include #define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int QElemType;typedef int Status;typedef struct QNode //定义结点类型{QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct //定义链表指针{QueuePtr front; //队头指针QueuePtr rear; //队尾指针}LinkQueue;Status visit(QElemType d){printf("%d ",d);return OK;}Status InitQueue(LinkQueue &Q)//构造一个空队列Q{Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); //动态分配内存,生成头结点,使头指针尾指针都指向它if(!Q.front) exit(1);Q.front->next=NULL; //头指针指向的头结点的指针域为NULLreturn OK;}Status DestroyQueue(LinkQueue &Q){//销毁队列Qwhile (Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status EnQueue(LinkQueue &Q,QElemType e)//插入元素e为Q的新的队尾元素{QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); //动态分配内存,生成新结点if(!p) exit(1);p->data=e; p->next=NULL; //新结点p作为尾指针,故其指针域为NULLQ.rear->next=p; //使p链到原队尾结点后面Q.rear=p; //使队尾指针指向新结点preturn OK;}//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK,否则返回ERRORStatus DeQueue(LinkQueue &Q,QElemType &e){QueuePtr p;if(Q.front==Q.rear) return ERROR; //队列为空 p=Q.front->next; //令p指向队头结点e=p->data; //将队头元素值赋值给eQ.front->next=p->next; //令头结点的指针域指向p后面的结点if(Q.rear==p) Q.rear=Q.front;//原队中只有一个结点,删去后队尾指针丢失,所以需对队尾重新赋值(指向队头结点)free(p);return OK;}Status ClearQueue(LinkQueue &Q){QueuePtr p,q;Q.rear=Q.front;p=Q.front->next;Q.front->next=NULL; while(p){q=p;p=p->next;free(q);}return OK;}/*若Q为空队列,则返回TRUE否则返回FALSE*/Status QueueEmpty(LinkQueue Q){ if(Q.front==Q.rear) return TRUE; else return FALSE;}/*求队列的长度*/int QueueLength(LinkQueue Q){int i=0;QueuePtr p;p=Q.front;while(Q.rear!=p){i++;p=p->next;}return i;}/*若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR*/Status GetHead(LinkQueue Q,QElemType *e){QueuePtr p;if (Q.front==Q.rear) return ERROR;p=Q.front->next;*e=p->data;return OK;}/*从队头到队尾依此对队列Q中每个元素输出*/Status QueueTraverse(LinkQueue Q){ QueuePtr p; p=Q.front->next; while(p) { visit(p->data); p=p->next; } printf("
"); return OK;}

前提:队列中的结点从队尾插入,从队头删除;队列中的结点的指向是从队头指向队尾,因为是循环链表,则队尾结点的下一个结点是队头。

如果只设头指针,则出列容易,头指针往后移一个就行;入列则要遍历整个队列,确定队尾后再插入,所以出列是O(1),入列是O(n)

如果只设尾指针,则入列时直接插入,出列只须后移一个结点即可找到队头结点,都是常数级的时间耗费,即都是O(1)

一般来说循环队列不用设头指针,只需一个指向尾结点的指针就行了,确定头和尾都很容易。

非空循环链表所表示的数据结构( )。
答:【答案】:A 在单链表的第一个结点前增加一个表头结点,队头指针指向表头结点,最后一个结点的指针域的值由NULL改为指向表头结点,这样的链表称为循环链表。循环链表是线性结构,有且只有一个根结点,每一个结点最多有一个前件,也最多有一个后件。循环链表表头结点为根结点,链表的最后一个结点为...

数据结构 设有一个循环双链表,其中有一个结点的指针为p,编写一个算法...
答:先添加;后删除!node *s;s = (node*)malloc(sizeof(node));s->data = p->data;/*以下是把s往p->next后面插入*/ s->next = p->next->next;s->next->pre = s;//右边插好 s->pre = p->next;s->pre->next = s;//左边接好 /*以下是删除p结点的代码*/ p->pre->next =...

循环链表的主要优点是什么
答:首先,循环链表在数据结构中形成了一个闭环,这意味着我们可以从任何一个节点开始遍历整个链表。这与单向链表形成鲜明对比,单向链表只能从头部节点开始遍历。因此,在某些需要频繁从链表中间位置开始遍历的场景下,循环链表能够提供更好的性能。其次,循环链表的这种闭环结构也使得它在处理一些特定问题时更加...

带头节点循环单链表 释放
答:关于最后的头结点要不要释放 根据严蔚敏的《数据结构(C语言版)》37页,对DestroyList(LinkList &L)的解释是:销毁线性链表L,L不再存在。我认为应该是要释放。参考代码如下:p=head->next;for(; p ;){ q=p->next;free(p);p=q;} free(head);

循环链表的主要优点是什么
答:1、遍历时,可以从任何节点开始并以任何方向向前或向后遍历列表,直到到达开始的同一节点。2、循环链表没有开始也没有结束。3、在循环链表中,最后一个节点地址部分保存第一个节点的地址,从而形成一个循环链状结构。二、循环链表的优点 1、动态数据结构 链表是一种动态排列,可以通过分配和刷新内存在运行...

已知一双向循环链表,从第二个节点至表尾递增有序(设a1<x<an)。_百度...
答:L;InitList_DUL(L);//定义CreateList_DUL(L);//初始化、创建双向循环链表L;resetting(L);//引用重构函数;display(L);//最后输出结果;}最后结果就是这样:=-=想必是在学数据结构,我还是大一学的C语言,快两年没动了,写起来忒费劲了 很多细节地方我也不太懂,但最后能运行起来就是了== ...

循环链表和双向链表的区别是是什么?
答:1、最后一个结点指针指向不同 在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是像双向链表那样置为NULL。此种情况还用于在最后一个结点后插入一个新的结点。2、判断链域值不同 在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表...

数据结构的一道题
答:“逆邻接表”只是把“邻接表”中弧头和弧尾的次序换了,并不是一种新表,它和“邻接表”的唯一区别就是弧尾的nextarc指针指向弧头而已。所以节点数是相等的。(参考数据结构教材164页)第二个问题:我的答案:正确理由:尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点...

什么叫带头结点的链表? 什么叫不带头结点的链表?
答:带头结点的链表的第一个节点没有直接前驱,而不带头结点的链表有直接前驱。数据结构中,在单链表的第一个结点之前附设一个结点,它没有直接前驱,称之为头结点。它们的区别:1、不带头结点的单链表对于第一个节点的操作与其他节点不一样,需要特殊处理,这增加了程序的复杂性和出现bug的机会,因此,...

数据结构
答:单链表就是 只能向后移动 循环链表就是 尾巴的next指向头 带头节点(头指针)的链表就是 普通链表 带尾节点(尾指针)的链表就是 没有头指针,只有尾指针。(一般都是循环的,或者是双链的,否则指个屁股,又不能往前搜索,什么用都没有哦)哥哥明白了吗,他们是结构的不同类型,这样的题目 ,你...