【C语言】链式队列的封装框架

头文件

queueLink.h

#ifndef _QUEUELINK_H
#define _QUEUELINK_H
#include <stdio.h>
#include <stdlib.h>

typedef int DataType;

typedef struct node
{
	union
	{
		int len;  		//头结点的数据域
	 	DataType data; 	//普通结点的数据域
	};
	struct node *next;
}Node;
//定义一个链式队列的结构体类型
typedef struct queLink
{
	Node *head; 	//记录对头
	Node *tail; 	//记录队尾
}queueLink,*queueLinkPtr;

//创建
queueLinkPtr create_queueLink();

//判空
int empty_queueLink(queueLinkPtr Q);

//入队(单链尾插)
int push(queueLinkPtr Q,DataType e);

//遍历
void show(queueLinkPtr Q);

//出队(单链头删)
int pop(queueLinkPtr Q);

//队列长度
int size_queueLink(queueLinkPtr Q);

//销毁
void free_queueLink(queueLinkPtr Q);

#endif

源文件

queueLink.c

#include "queueLink.h"

//创建
queueLinkPtr create_queueLink()
{
	//申请链式队列结构体堆区空间
	queueLinkPtr Q=(queueLinkPtr)malloc(sizeof(queueLink));
	if(NULL==Q)
	{
		printf("失败:create_queueLink申请链式队列结构体堆区空间失败\n");
		return NULL;
	}
	//申请链式队列结点堆区空间
	Q->head=(Node*)malloc(sizeof(Node));
	if(NULL==Q->head)
	{
		printf("失败:create_queueLink申请链式队列结点堆区空间失败\n");
		free(Q);
		Q=NULL;
		return NULL;
	}
	//给链表头结点赋初始值
	Q->head->len=0;
	Q->head->next=NULL;
	Q->tail=Q->head; 		//空链式队列的队尾是链式队列的头结点
	printf("成功:create_queueLink创建链式队列成功\n");
	return Q;
}

//判空
int empty_queueLink(queueLinkPtr Q)
{
	if(NULL==Q)
	{
		printf("失败:empty_queueLink判空失败\n");
		return -1;
	}
	return Q->head==Q->tail;
}

//入队(单链尾插)
int push(queueLinkPtr Q,DataType e)
{
	if(NULL==Q)
	{
		printf("失败:push入队失败\n");
		return 0;
	}
	//申请结点 封装数据
	Node *p=(Node*)malloc(sizeof(Node));
	if(NULL==p)
	{
		printf("失败:push入队失败\n");
		return 0;
	}
	p->data=e; 			//空间申请成功,封装数据
	p->next=NULL; 		//入队元素没有后继结点
	Q->tail->next=p; 	//队尾元素的后继指针指向入队元素
	Q->tail=p; 			//链式队列的队尾指向入队元素

	Q->head->len++; 	//队列长度自增

	printf("成功:push入队成功\n");
	return 1;
}

//遍历
void show(queueLinkPtr Q)
{
	if(NULL==Q||empty_queueLink(Q))
	{
		printf("失败:show遍历失败\n");
		return;
	}
	//定义遍历指针
	Node *p=Q->head;
	while(p->next!=NULL)
	{
		p=p->next; 				//向后遍历一个元素
		//输出链式队列每个元素的数据
		printf("%d ",p->data);
	}
	putchar(10); 	//回车
}

//出队(单链头删)
int pop(queueLinkPtr Q)
{
	if(NULL==Q||empty_queueLink(Q))
	{
		printf("失败:pop出队失败\n");
		return 0;
	}
	//提取第一个结点
	Node *p=Q->head->next;
	Q->head->next=p->next;
	printf("%d出队\n",p->data);
	//判断是否出队的是最后一个元素
	if(Q->tail==p)
	{
		Q->tail=Q->head; 	//队尾元素被删了要重新指向初始值
	}
	free(p); 				//释放出队元素
	p=NULL; 				//防止野指针
	Q->head->len--; 		//队列长度自减
	return 1;
}

//队列长度
int size_queueLink(queueLinkPtr Q)
{
	//判断传入队列是否合法
	if(NULL==Q)
	{
		printf("失败:size_queueLink获取队列长度失败\n");
		return -1;
	}
	return Q->head->len;
}

//销毁
void free_queueLink(queueLinkPtr Q)
{
	if(NULL==Q)
	{
		printf("失败:free_queueLink销毁失败\n");
		return;
	}
	//队列里面有元素时不能直接销毁队列指针,要先把所有元素销毁
	while(!empty_queueLink(Q))
	{
		printf("--销毁出队:");
		pop(Q);
	}
    //销毁头结点
    free(Q->head);
    Q->head=NULL;
    Q->tail=NULL;
	//销毁队列指针
	free(Q);
	Q=NULL; 		//防止野指针
	printf("成功:free_queueLink销毁成功\n");
}

主函数文件(测试函数功能)

main.c

#include "queueLink.h"

int main(int argc, const char *argv[])
{
	queueLinkPtr QL=create_queueLink();

	printf("判空:%d\n",empty_queueLink(QL));

	push(QL,1);
	push(QL,2);
	push(QL,3);
	push(QL,4);
	push(QL,5);

	show(QL);

	pop(QL);
	show(QL);
	pop(QL);
	show(QL);
	pop(QL);
	show(QL);
	pop(QL);
	show(QL);
	pop(QL);
	show(QL); 		//此时队列为空,会遍历失败

	//获取队列长度
	printf("队列长度:%d\n",size_queueLink(QL));

	push(QL,1);
	push(QL,2);
	push(QL,3);
	push(QL,4);
	push(QL,5);

	//销毁链式队列
	free_queueLink(QL);

	return 0;
}

编译测试结果

编译指令:

gcc *.c
运行指令:

./a.out

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值