C语言链式队列代码实现

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);
}

猜你喜欢

转载自blog.csdn.net/weixin_39148042/article/details/80979077