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

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

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

一:

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

typedef int Datatype;

typedef struct queuenode

{

Datatype data;

struct queuenode *next;

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

typedef struct

{

queuenode rear;

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

void InitQueue( LinkQueue &Q)

{

//置空队:就是使头结点成为队尾元素

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

QueueNode* s;

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

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

{

s=Q->rear->next;

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

free(s);

} //回收结点空间

}

int EmptyQueue( LinkQueue &Q)

{ //判队空

//当头结点的next指针指向自己时为空队return Q->rear->next->next==Q->rear->next;

}

void EnQueue( LinkQueue &Q, Datatype x)

{ //入队

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

QueueNode *p=(QueueNode *) malloc

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

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

Q-rear->next=p;

Q->rear=p;//将尾指针移至新结点

}

Datatype DeQueue( LinkQueue &Q,Datatype &x)

{

//出队,把头结点之后的元素摘下

Datatype t;

QueueNode *p;

if(EmptyQueue( Q ))

Error("Queue 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;

}CiQueue;

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

{

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

Q->next=Q;

}//InitCiQueue

void EnCiQueue(CiQueue &Q,int x)//把元素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 DeCiQueue(CiQueue &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;

}//DeCiQueue

相关文档
最新文档