数据结构算法 习题 答案 带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构算法题(假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针)试编写相应的队列初始化,入队列和出队列的算法!) (提供两种答案哦!!!)

一:

//既然是算法就不用源码了具体看注释

typedef int Datype;

typedef struct quenode{Datype data;

struct quenode *next;

}QueNode; //以上是结点类型的定义

typedef struct{quenode rear;

}LinkQue; //只设一个指向队尾元素的指针

void InitQue( LinkQue &Q){//置空队:

就是使头结点成为队尾元素

Q.rear=(quenode*)malloc(sizeof(quenode))

QueNode* s;

Q->rear = Q->rear->next;//将队尾指针指向头结点

while(Q->rear!=Q->rear->next) //当队列非空,将队中元素逐个出队

{s=Q->rear->next;

Q->rear->next=s->next;

free(s);

} //回收结点空间}int EmptyQue( LinkQue &Q)

{//判队空

//当头结点的next指针指向自己时为空队

return Q->rear->next->next==Q->rear->next;}void EnQue( LinkQue &Q, Datype x)

{//入队

//也就是在尾结点处插入元素

QueNode *p=(QueNode *) malloc

(sizeof(QueNode));//申请新结点

p->data=x; p->next=Q->rear->next;//初始化新结点并链入Q-rear->next=p;

Q->rear=p;//将尾指针移至新结点}Datype DeQue( LinkQue &Q,Datype &x){//出队,把头结点之后的元素摘下

Datype t;

QueNode *p;

if(EmptyQue( Q ))

Error("Que underflow");

p=Q->rear->next->next; //p指向将要摘下的结点

x=p->data; //保存结点中数据

if (p==Q->rear)

{//当队列中只有一个结点时,p结点出队后,要将队尾指针指向头结点

Q->rear = Q->rear->next; Q->rear->next=p->next;}

else

Q->rear->next->next=p->next;//摘下结点p

free(p);//释放被删结点

return x;}二:

typedef struct Node{int data;

struct Node *next;

}Node,*CiLNode;

typedef struct{CiLNode CiLrear;

}CiQue;

void InitCiQue(CiQue &Q)//初始化循环链表表示的队列

Q{Q=(CiLNode*)malloc(sizeof(CiLNode));

Q->next=Q;

}//InitCiQue

voidEnCiQue(CiQue&Q,intx)//把元素x插入循环链表表示的队列Q,Q指向队尾元素,Q->next指向头结点,Q->next->next指向队头元素

{p=(CiLNode*)malloc(sizeof(CiLNode));

p->data=x;

p->next=Q->next; //直接把p加在Q的后面

Q->next=p;

Q=p;//修改尾指针}Status DeCiQue(CiQue &Q,int x)//从循环链表表示的队列Q 头部删除元素x{if(Q==Q->next) return INFEASIBLE; //队列已空

p=Q->next->next;

x=p->data;

Q->next->next=p->next;

free(p);

return OK;

}//DeCiQue

相关文档
最新文档