链式队列(Linked Queue)

.h文件

#ifndef __LINKQUEUE_H_
#define __LINKQUEUE_H__

#include <stdio.h>
#include <stdlib.h>

//数据类型
typedef int * ElemType;

//数据节点
typedef struct QueueNode
{
	ElemType data;

	//指针域
	struct QueueNode *next;	//指向栈中上一个数据节点的地址
}QueueNode;

typedef struct LinkQueue
{
	QueueNode *front;	//栈顶指针
	QueueNode *rear;	//栈底指针
	int count;	//数据节点个数(元素个数)
}LinkQueue;

//初始化一个队
LinkQueue *Init_LinkQueue();

//清空一个链式队
void Clear_LinkQueue(LinkQueue *lq);

//销毁一个链式队
void Destroy_LinkQueue(LinkQueue *lq);

//判断一个链式队是否为空
int isEmpty(LinkQueue *lq);

//入队(队尾)
int EnQueue(LinkQueue *lq,ElemType data);

//出队(队头)
int DeQueue(LinkQueue *lq, ElemType *data);

//获取对头元素
int getHead(LinkQueue *lq, ElemType *data); 

#endif

.c文件

#include "linkQueue.h"

//初始化一个队
LinkQueue *Init_LinkQueue()
{
	LinkQueue *lq = (LinkQueue *)malloc(sizeof(LinkQueue));
	lq->count = 0;
	lq->front = NULL;
	lq->rear = NULL;
}

//清空一个链式队
void Clear_LinkQueue(LinkQueue *lq)
{
	if(lq == NULL)
	{
		return ;
	}
	ElemType data;
	while(!isEmpty(lq))
	{
		DeQueue(lq, &data);
		//通用栈存的是一个地址,清空栈的时候需要释放
		free(data);
	}
}

//销毁一个链式队
void Destroy_LinkQueue(LinkQueue *lq)
{
	if(lq == NULL)
	{
		return ;
	}
	Clear_LinkQueue(lq);
	free(lq);
}

//判断一个链式队是否为空
int isEmpty(LinkQueue *lq)
{
	if(lq == NULL)
	{
		return -1;
	}

	return (lq->count == 0 ? 1:0);
}

//入队(队尾)
int EnQueue(LinkQueue *lq,ElemType data)
{
	if(lq == NULL)
	{
		return -1;
	}

	//创建节点保存
	QueueNode *p = (QueueNode *)malloc(sizeof(QueueNode));
	p->data = data;
	p->next = NULL;
	printf(" %d ",*data);
	//入队
	//队中没有元素
	if(lq->front == NULL)
	{
		lq->front = p;
	}
	else //至少有一个元素 尾插法
	{
		lq->rear->next = p;
	}
	lq->rear = p;
	lq->count++;

	return 0;
}

//出队(队头)
int DeQueue(LinkQueue *lq, ElemType *data)
{
	//安全检查
	if(lq == NULL || lq->count == 0)
	{
		return -1;
	}

	//队头的值
	*data =	lq->front->data;

	printf(" %d ",**data);
	
	//删除队头 front指向接下来的一个节点
	QueueNode *pt = lq->front;
	lq->front = pt->next;
	
	//如果队头没有元素了 队尾也要为空
	if(lq->front == NULL)
	{
		lq->rear == NULL;
	}
	lq->count--;
	pt->next = NULL;

	free(pt);
	return 0;
}

//获取对头元素
int getHead(LinkQueue *lq, ElemType *data)
{
	//安全检查
	if(lq == NULL || lq->count == 0)
	{
		return -1;
	}
	
	*data = lq->front->data;

	return 0;
}

main.c --> 测试代码

#include "linkQueue.h"

int main(void)
{
	LinkQueue *queue = Init_LinkQueue();
	int data;
	int *p = NULL;
	while(1)
	{
		scanf("%d",&data);
		if(data == 0)
		{
			break;
		}
		p = (int *)malloc(sizeof(int));
		*p = data;		
		EnQueue(queue, (ElemType)p);	
	}
	printf("\n");
	printf("队列中元素个数为 %d\n",queue->count);

	Clear_LinkQueue(queue);
	printf("\n");
	printf("队列中元素个数为 %d\n",queue->count);
	return 0;
}

在这里插入图片描述

总结
我有些地方可能写的不好,代码还需要完善,仅供参考(学习),有大错误也可以向我反馈。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_60265426

都是好兄弟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值