内容:
假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素节点(注意不设头结点),试编写相应的置空队、判队空、入队和出队等算法。
步骤:
- 算法分析
本题是循环链表基本操作的扩展,题中设有一个指针指向队尾元素的结点,此时要实现元素入队,则直接采用链表的插入操作即可。因题中不设有头结点,因此要实现出队操作,则需要尾指针找到头结点和开始结点,然后进行删除。在进行置空队操作时,只需要使queue.rear->next=queue.rear;即可,进行判空队操作时,则需要判断queue.rear->next==queue.rear,若相等,则说明该队是空队,否则不是空队。
2.概要设计
使用C语言,其中设置了以下函数:
3.程序运行流程图如下:
4.运行结果:
5.源码如下
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
typedef int qelemType;
typedef struct queue {
qelemType data;
struct queue *next;
} queue,*linkqueue;
typedef struct {
linkqueue rear;
int length;
} seqqueue;
//置队空
void InitQueue(seqqueue &queue) {
queue.rear=(linkqueue)malloc(sizeof(queue));
queue.rear->next=queue.rear;
}
//判队空
int EmptyQueue(seqqueue &queue) {
if(queue.rear->next==queue.rear)
return OK;
else
return 0;
}
//入队
int Enqueue(seqqueue &queue,qelemType e) {
linkqueue p;
p=(linkqueue)malloc(sizeof(queue));
if(!p)
return 0;
p->data=e;
p->next=queue.rear->next;
queue.rear->next=p;
queue.rear=p;
return OK;
}
//出队
int Deletequeue(seqqueue &queue,qelemType &e) {
linkqueue p;
if(queue.rear->next==queue.rear)
return ERROR;//若队列为空返回0
p=queue.rear->next->next;//循环链表队列队尾指针下一结点(头结点)的下一结点(即队头指针)
e=p->data;
queue.rear->next->next=p->next;
free(p);
return OK;
}
int main() {
seqqueue queue2;
qelemType num;
InitQueue(queue2);
if(EmptyQueue(queue2))
printf("该队列为空");
else
printf("该队列不为空");
for(int i=1; i<=5; i++)
if(Enqueue(queue2,i))
printf("元素 %d成功入列",i);
printf(" ");
for(int j=1; j<=4; j++)
if(Deletequeue(queue2,num))
printf("元素 %d成功出列",num);
return 0;
}