目录
一、链式队列的基本概念和结构
1.1 链式队列的基本概念
1.2 链式队列的优点
1.3 链式队列的实现方式及结构
二、链式队列的接口函数实现
2.1 链式队列的接口函数
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "queue_list.h"
#include <vld.h>
//初始化
void Init_QueueList(struct QueueList *ql);
//入队
bool Push(struct QueueList *ql, ELEM_TYPE val);
//出队
bool Pop(struct QueueList *ql);
//判空
bool IsEmpty(struct QueueList *ql);
//获取队头元素值
ELEM_TYPE Front(struct QueueList *ql);
//有效数据节点个数
int Get_length(struct QueueList *ql);
//清空
void Clear(struct QueueList *ql);
//销毁
void Destroy(struct QueueList *ql);
//打印
void Show(struct QueueList *ql);
2.2 链式队列的设计(结构体)
typedef int ELEM_TYPE;
//有效数据结点结构体设计
struct QNode
{
ELEM_TYPE data;//数据域
struct QNode* next;//指针域
};
//链式队列头结点结构体设计
//这里只能队尾指针处入队 在队头指针处出队
typedef struct QueueList
{
struct QNode *front;//队头指针
struct QNode *rear;//队尾指针
}QueueList, *PQueueList;
2.3 链式队列的初始化
//初始化
void Init_QueueList(struct QueueList *ql)
{
//0.传入的指针参数断言
assert(ql!=NULL);
//此时,链式队列为空链表,两个指针域均为NULL
ql->front = NULL;
ql->rear = NULL;
}
2.4 入队
//入队
bool Push(struct QueueList *ql, ELEM_TYPE val)
{
//0.传入的指针参数断言
assert(ql!=NULL);
//1.购买新节点
struct QNode * pnewnode = (struct QNode *)malloc(1 * sizeof(struct QNode));
pnewnode->data = val;
//1.5 要区分,到底是空队列 还是 非空队列
//2.找到合适的插入位置
if(IsEmpty(ql))
{
//链表为空
pnewnode->next = NULL;
ql->front = ql->rear = pnewnode;
return true;
}
//3.链表不为空,正常插入
struct QNode *p = ql->rear;
pnewnode->next = p->next;// == pnewnode->next = ql->rear->next;
p->next = pnewnode;
ql->rear = pnewnode;
return true;
}
2.5 出队
//出队
bool Pop(struct QueueList *ql)
{
//0.传入的指针参数断言
assert(ql!=NULL);
//1.判空
if(IsEmpty(ql))
{
return false;
}
//2.指针q指向待删除结点 指针p指向待删除结点的上一个结点
struct QNode *q = ql->front;
//p可以用ql代替
//2.5 判断是否仅有唯一一个有效结点,单独处理
if(ql->front->next == NULL)
{
//存在唯一的节点
ql->front = ql->rear = NULL;
free(q);
return true;
}
//3.不是唯一的节点,正常的删除,跨越指向+释放
ql->front = q->next;
free(q);
return true;
}
2.6 获取队头元素值
//获取队头元素值
ELEM_TYPE Front(struct QueueList *ql)
{
//0.传入的指针参数断言
assert(ql!=NULL);
if(IsEmpty(ql))
{
exit(1);
}
return ql->front->data;
}
2.7 获取有效元素个数
//有效数据节点个数
int Get_length(struct QueueList *ql)
{
//0.传入的指针参数断言
assert(ql!=NULL);
struct QNode * p = ql->front;
int count = 0;
for(; p!=NULL; p=p->next)
{
count++;
}
return count;
}
2.8 判空
//判空
bool IsEmpty(struct QueueList *ql)
{
//0.传入的指针参数断言
assert(ql!=NULL);
return ql->front == NULL;
//return ql->rear == NULL;
}
2.9 打印
//打印
void Show(struct QueueList *ql)
{
//0.传入的指针参数断言
assert(ql!=NULL);
struct QNode * p = ql->front;
for(; p!=NULL; p=p->next)
{
printf("%d ", p->data);
}
printf("\n");
}
2.10 清空
//清空
void Clear(struct QueueList *ql)
{
//0.传入的指针参数断言
assert(ql!=NULL);
Destroy(ql);
}
2.11 销毁
//销毁
void Destroy(struct QueueList *ql)
{
//0.传入的指针参数断言
assert(ql!=NULL);
struct QNode *p = ql->front;
struct QNode *q = NULL;
ql->front = ql->rear = NULL;
while(p != NULL)
{
q = p->next;
free(p);
p = q;
}
}
三、测试
int main()
{
struct QueueList head;
Init_QueueList(&head);
Push(&head, 12);
Push(&head, 23);
Push(&head, 34);
Show(&head);
Pop(&head);
Pop(&head);
Show(&head);
Push(&head, 100);
Push(&head, 200);
Push(&head, 300);
Show(&head);
printf("length = %d\n", Get_length(&head));
int tmp = Front(&head);
printf("Front = %d\n", tmp);
Destroy(&head);
}
四、总结
以上便是我为大家带来的循环队列设计内容,若有不足,望各位大佬在评论区指出,谢谢大家!下一节继续进行链式队列的内容,感兴趣的你可以留下你们的点赞、收藏和关注,这是对我极大的鼓励,我也会更加努力创作更优质的作品。再次感谢大家!