一:链式队列
1)逻辑结构:线性结构
2)存储结构: 链式存储
typedef int datatype;
typedef struct node
{
datatype data;//数据域
struct node *next;//指针域
}linkqueue_node_t,*linkqueue_list_t;
typedef struct//将队列头指针和尾指针封装到一个结构体里
{
linkqueue_list_t front;//相当于队列的头指针
linkqueue_list_t rear;//相当于队列的尾指针
//有了链表的头指针和尾指针,那么我们就可以操作这个链表
}linkqueue_t;
(1)创建一个空的队列
(2)入列
(3)出列
二:头文件的定义
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
datatype data;//数据域
struct node *next;//指针域
}linkqueue_node_t,*linkqueue_list_t;
//linkqueue_list_t p === linkqueue_node_t *
typedef struct//将队列头指针和尾指针封装到一个结构体里
{
linkqueue_list_t front;//相当于队列的头指针
linkqueue_list_t rear;//相当于队列的尾指针
//有了链表的头指针和尾指针,那么我们就可以操作这个链表
}linkqueue_t;
//1.创建一个空的队列
linkqueue_t *CreateEmptyLinkQueue();
//2.入列 data代表入列的数据
int InLinkQueue(linkqueue_t *p,datatype data);
//3.出列
datatype OutLinkQueue(linkqueue_t *p);
//4.判断队列是否为空
int IsEmptyLinkQueue(linkqueue_t *p);
//5.求队列长度的函数
int LengthLinkQueue(linkqueue_t *p);
//6.清空队列
void ClearLinkQueue(linkqueue_t *p);
三:代码实现
#include"linkqueue.h"
//1.创建一个空的队列
linkqueue_t *CreateEmptyLinkQueue()
{
linkqueue_t *p=(linkqueue_t *)malloc(sizeof(linkqueue_t));
if(p==NULL)
{
perror("开辟失败:");
return NULL;
}
p->front=p->rear=(linkqueue_list_t)malloc(sizeof(linkqueue_node_t));
if(p->front==NULL)
{
perror("开辟失败:");
return NULL;
}
p->front->next=NULL;//
return p;
}
//2.入列 data代表入列的数据
int InLinkQueue(linkqueue_t *p,datatype data)
{
//开辟节点,存放数据
linkqueue_node_t *pnew=(linkqueue_node_t *)malloc(sizeof(linkqueue_node_t));
if(pnew==NULL)
{
perror("CreateEmptyLinkQueue err");
return -1;
}
//初始化
pnew->data=data;
pnew->next=NULL;
//将数据入队
p->rear->next=pnew;
//移动尾指针
p->rear=pnew;
return 0;
}
//3.出列
datatype OutLinkQueue(linkqueue_t *p)
{
//判空
if(IsEmptyLinkQueue(p))
{
perror("队空:");
return -1;
}
//定义指针指出列数据
linkqueue_node_t *pdel=p->front->next;
//定义变量保存
int temp=pdel->data;
//移动头指针
p->front=p->front->next;
//释放出队空间
if(pdel->next==NULL)//如果下一节点的指针域为空
{
p->rear=p->front;//将队头的值赋给队尾
}
free(pdel);
pdel=NULL;
//输出出队数据
return temp;
}
//4.判断队列是否为空
int IsEmptyLinkQueue(linkqueue_t *p)
{
return p->front==p->rear;
}
//5.求队列长度的函数
int LengthLinkQueue(linkqueue_t *p)
{
int sum=0;
linkqueue_list_t q=p->front;
q=q->next;
while(q!=NULL)
{
q=q->next;
sum++;
}
return sum;
}
//6.清空队列
void ClearLinkQueue(linkqueue_t *p)
{
while(!IsEmptyLinkQueue(p))
{
OutLinkQueue(p);
}
}