链式队列
1)逻辑结构:线性结构
2)存储结构:链式存储
3)操作:增删改查
头文件:
"[code=C]"
#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);
#endif
函数:
"[code=C]"
#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()
{
linkqueue_node_t *q=(linkqueue_node_t *)malloc(sizeof(linkqueue_node_t));
if(q==NULL)
{
perror("q malloc err");
return NULL;
}
linkqueue_t *p=(linkqueue_t *)malloc(sizeof(linkqueue_t));//开辟头尾指针,指向头节点
if(p==NULL)
{
perror("p malloc err");
return NULL;
}
q->next=NULL;
p->front=q;
p->rear=q;
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("q malloc err");
return -1;
}
pnew->next=NULL;
pnew->data=data;
p->rear->next=pnew;
p->rear=pnew;
return 0;
}
//3.出列
datatype OutLinkQueue(linkqueue_t *p)
{
if(IsEmptyLinkQueue(p))
{
printf("空了");
return -1;
}
linkqueue_node_t *pdel=p->front->next;
datatype a=pdel->data;
p->front->next=pdel->next;
if(p->rear==pdel)
p->front=p->rear;
free(pdel);
pdel=NULL;
return a;
}
//4.判断队列是否为空
int IsEmptyLinkQueue(linkqueue_t *p)
{
return p->front==p->rear;
}
//5.求队列长度的函数
int LengthLinkQueue(linkqueue_t *p)
{
int len=0;
linkqueue_node_t *pl=p->front;
while(pl!=p->rear)
{
pl=pl->next;
len++;
}
return len;
}
//6.清空队列
void ClearLinkQueue(linkqueue_t *p)
{
while(p->front!=p->rear)
{
p->front=p->front->next;
}
}
int main(int argc, char const *argv[])
{
linkqueue_t *p=CreateEmptyLinkQueue();
for(int i=0;i<=5;i++)
InLinkQueue(p,i);
printf("%d\n",OutLinkQueue(p));
printf("%d\n",OutLinkQueue(p));
printf("%d\n",OutLinkQueue(p));
printf("长度为%d\n", LengthLinkQueue(p));
ClearLinkQueue(p);
printf("长度为%d\n", LengthLinkQueue(p));
printf("%d\n",OutLinkQueue(p));
return 0;
}