linkqueue.h //链式队列的头文件
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int datatype; /*定义链队列中数据元素的数据类型*/
typedef struct linkqueuenode{ //使用单链表记录数据的入队(队头添加节点)和出队(队尾删除节点)
datatype data; /*数据域*/
struct linkqueuenode *next; /*链接指针域*/
}linkqueue_node,*linkqueue_pnode; /*链表元素类型定义*/
typedef struct linkqueue{ //定义一个结构体,记录队列(单链表)中的头结点和尾节点
linkqueue_pnode front,rear;
}link_queue,*link_pqueue;
extern void init_linkqueue(link_pqueue *Q); //创建队列
extern bool is_empty_linkqueue(link_pqueue q); //判断队列是否为空
extern bool in_linkqueue(datatype data,link_pqueue q); //入队
extern bool out_linkqueue(link_pqueue q,datatype *D); //出队
extern void show_linkqueue(link_pqueue q); //依次显示队头到队尾的数据
extern void free_linkqueue(link_pqueue q); //释放队列
#endif
linkqueue.c //链式队列相关函数的实现方法
#include "linkqueue.h"
void init_linkqueue(link_pqueue *Q) //创建队列
{
//申请front和rear的空间
*Q=(link_pqueue)malloc(sizeof(link_queue));
if((*Q)==NULL)
{
perror("malloc");
exit(-1);
}
//申请头结点空间
(*Q)->front=(linkqueue_pnode)malloc(sizeof(linkqueue_node));
if((*Q)->front==NULL)
{
perror("malloc");
exit(-1) ;
}
(*Q)->front->next=NULL;
(*Q)->rear=(*Q)->front;
return;
}
//入对
bool in_linkqueue(datatype data,link_pqueue q)
{
linkqueue_pnode new;
//申请数据结点空间
new=(linkqueue_pnode)malloc(sizeof(linkqueue_node));
if(new==NULL)
{
puts("入队失败!");
return false;
}
//将数据存储在申请的空间
new->data=data;
//将new指向的结点插入到链式队列中
new->next=q->rear->next; //这里等价于new->next = NULL;
q->rear->next=new;
//让rear指针指向新的队尾结点
q->rear=q->rear->next; //等价于q->rear = new;
return true;
}
bool is_empty_linkqueue(link_pqueue q) //判断队列是否为空
{
if(q->rear == q->front)
return true;
else
return false;
}
//出队
bool out_linkqueue(link_pqueue q,datatype *D)
{
linkqueue_pnode t;
//判断队列是否空
if(is_empty_linkqueue(q)){
printf("队列已空!\n");
return false;
}
//出队
t=q->front;
q->front =q->front->next;
*D=q->front->data;
free(t);
return true;
}
void show_linkqueue(link_pqueue q) //依次打印队头到队尾的数据
{
linkqueue_pnode p;
if(is_empty_linkqueue(q))
return;
//非空时,从对头打印到队尾
for(p=q->front->next;p!=NULL;p=p->next)
{
printf("%d\t",p->data);
}
printf("\n");
}
void free_linkqueue(link_pqueue q) //释放队列
{
link_pqueue p;
p = q->front;
while(p)
{
q->front = q->front->next;
free(p);
p = q->front;
}
free(q);
}