数据结构(C语言版) 栈和队列 算法设计Demo6
Posted Aiden (winner)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版) 栈和队列 算法设计Demo6相关的知识,希望对你有一定的参考价值。
假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素站点(注意不设头指针) ,试编写相应的置空队、判队空 、入队和出队等算法。
[题目分析]
置空队就是建立一个头节点,并把头尾指针都指向头节点,头节点是不存放数据的;判队空就是当头指针等于尾指针时,队空;入队时,将新的节点插入到链队列的尾部,同时将尾指针指向这个节点;出队时,删除的是队头节点,要注意队列的长度大于1还是等于1的情况,这个时候要注意尾指针的修改,如果等于1,则要删除尾指针指向的节点。
[算法描述]
//先定义链队结构:
typedef struct queuenode
Datatype data;
struct queuenode *next;
QueueNode; //以上是结点类型的定义
typedef struct
queuenode *rear;
LinkQueue; //只设一个指向队尾元素的指针
//(1) 置空队
void InitQueue( LinkQueue *Q)
//置空队:就是使头结点成为队尾元素
QueueNode *s;
Q->rear = Q->rear->next;//将队尾指针指向头结点
while(Q->rear!=Q->rear->next)//当队列非空,将队中元素逐个出队
s=Q->rear->next;
Q->rear->next=s->next;
delete s;
//回收结点空间
//(2) 判队空
int EmptyQueue( LinkQueue *Q)
//判队空。当头结点的next指针指向自己时为空队
return Q->rear->next->next==Q->rear->next;
//(3) 入队
void EnQueue( LinkQueue *Q, Datatype x)
//入队。也就是在尾结点处插入元素
QueueNode *p=new QueueNode;//申请新结点
p->data=x;
p->next=Q->rear->next;//初始化新结点并链入
Q-rear->next=p;
Q->rear=p;//将尾指针移至新结点
//(4) 出队
Datatype DeQueue( LinkQueue *Q)
//出队,把头结点之后的元素摘下
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
delete p;//释放被删结点
return x;
以上是关于数据结构(C语言版) 栈和队列 算法设计Demo6的主要内容,如果未能解决你的问题,请参考以下文章