内容:
带头结点的循环链表表示队列, 并且只设一个指针指向队尾元素结点, 试编写相应的队列初始化,入队列和出队列的算法。
算法分析
本题是链队基本操作的扩展,知道尾指针后,要实现元素入队,则直接用链表的插入操作即可。要实现出队操作,则需要根据尾指针找出头结点和开始结点,然后进行删除。要注意的是,尾指针应始终指向终端结点,并且当删除结点后队列为空时,必须特殊处理。
概要设计
函数 |
int Create_Empty_Queue(SeqLQueue &mode) int Insertt(SeqLQueue& p, int e) int Pop_Queue(SeqLQueue& p, int& e) bool Empty_Queue(SeqLQueue& p) void PRINT(SeqLQueue& p) |
#include<stdio.h>
#include<stdlib.h>
//带头结点的循环单链表队列,只有一个尾指针
struct LQueue {
int date;
LQueue* next;
};
typedef struct
{
LQueue* rear;
}SeqLQueue;
//循环队列构造函数,初始化空队列
int Create_Empty_Queue(SeqLQueue &mode)
{
mode.rear = (LQueue*)malloc(sizeof(LQueue));
if (!mode.rear)
{
printf("内存分配失败,创造空队列失败!\n");
return 0;
}
mode.rear->next = mode.rear; //尾指针的下一个还是自己,空队列自循环
printf("创造空队列成功!\n");
return 1;
}
//入队函数,表尾插入
int Insertt(SeqLQueue& p, int e)
{
LQueue* q;
q = (LQueue*)malloc(sizeof(LQueue));
if (!q)
{
printf("内存分配失败!\n");
return 0;
}
q->date = e;
q->next = p.rear->next; //构成循环,q的下一个是队列头,即原p.rear->next
p.rear->next = q; //入队,插入到表尾之后
p.rear = q; //更新表尾指针为q指针
return 1;
}
//出队函数,表头出队
int Pop_Queue(SeqLQueue& p, int& e)
{
if (p.rear == p.rear->next)
{
printf("队列为空!\n");
return 0;
}
LQueue* q; //用来保存需要出队的元素指针
q = p.rear->next->next; //rear.next是头节点,头结点下一个节点才是首数据地址
p.rear->next->next = q->next; //从队列里面删除q节点
e = q->date;
if (q == p.rear) //如果队列就一个元素,让队列自循环
p.rear = p.rear->next;
free(q);
return 1;
}
//判断是否空队列函数
bool Empty_Queue(SeqLQueue& p)
{
if (p.rear == p.rear->next)
{
printf("这是一个空队列!\n");
return true;
}
else
{
printf("这不是一个空队列!\n");
return false;
}
}
//遍历队列所有元素
void PRINT(SeqLQueue& p)
{
LQueue* k;
k = p.rear->next->next;
while (k != p.rear->next)
{
printf("%d ", k->date);
k = k->next;
}
printf("\n");
}
int main(int argc, char* argv[])
{
SeqLQueue L1;
int num;
L1.rear = (LQueue*)malloc(sizeof(LQueue));
Create_Empty_Queue(L1); //创造空队列l1
Empty_Queue(L1); //调用判空函数判断队列是否为空
for (int i = 0; i < 10; i++)
{
Insertt(L1, i); //把0-9入队l1
PRINT(L1);
}
printf("现在");
Empty_Queue(L1); //调用判空函数判断队列是否为空
printf("现在开始出队:\n");
for (int i = 0; i < 10; i++)
{
Pop_Queue(L1, num); //把0-9入队l1
PRINT(L1);
}
printf("现在");
Empty_Queue(L1); //调用判空函数判断队列是否为空
return 0;
}