C语言---队列(详解)---数据结构

队列所需要的头文件

先给类型重命名 意义前几篇有讲

队列要用到的两个结构体

第一个结构体里面有 1.存储数据的 a 2.指向下一个节点的指针

 重命名为Queue(这里的名字需要记一下,等会需要分辨两个结构体,结构体两个的功能是不一样的)

第二个结构体里面有 1.指向头的头指针 2.指向尾的尾指针

重命名尾Qnene

 队列实现的函数功能有: 1.初始化队列 2.队尾入数据 3.队头出数据 4.获取队列的有效元素个数 5.判断队列是否为空 6.获取队列头部数据 7.获取队列尾部数据 8.销毁队列

1.初始化队列

初始化我们直接把头和尾置尾空(第一个结构体是包含着第二个结构体的,所以初始化第二个结构体就可以了)

2.队尾入数据

因为是要入数据,所以我们要先申请一个空间(并且把数据放入到新空间中)

入数据是有两种情况

1.第一次入,队列是没有数据的,所以我们要先进行单独处理

直接在头和尾的位置入数据(因为第一次没数据,头和尾是重叠在一起的

2.已经入过了,队列中已经存在其他的数据,所以我们直接在队尾后面入数据

 3.队头出数据

1.若这个队列中只剩下一个数据了,那么我们可以直接删除数据后,并且释放掉整个队列

2.若队列中不止一个数据,那么先存储一个队头的下一个数据,再释放掉对头,再让对头的指针指向存储的数据

 4.获取队列中有效的数据个数

 这把我们使用遍历的方法

1.先定义一个size,用来计算队列中的个数

2.先从队头开始,每次都++size,直接空。

3.最后返回size的个数

 5.判断队列是否为空

用bool类型来返回

我们判断队头是否为空就可以了

 6.获取队头的数据

返回队头用来存储数据的a

7.获取队尾的数据 

返回队尾用来存储数据的a

 8.销毁队列

先创建一个存放队头的(命名为tist),再来一个存放对头的下一个数据(命名为cur)。

先释放tist,再把cur给tist。就此循环

最后把头和尾的指针置空

9.队列的打印

 这里不需要用到单独的函数实现,置需要把前几个实现的函数结合起来用

1.先判断队列是否为空

2.再打印返回的头元素

3.再掉头元素

 这样队列的全部功能就实现了!

接下来是源码,需要自取

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

typedef int STDataType;

typedef struct Quene
{
	struct Quene* next;
	STDataType a;
}Queue;

typedef struct Qnene
{
	Queue* head;
	Queue* tail;
}Qnene;

//初始化
void QueueInit(Qnene* q)
{
	assert(q);

	q->head = q->tail = NULL;
}

void QueuePush(Qnene* q, STDataType data)
{
	assert(q);

	Queue* newnode = (Queue*)malloc(sizeof(Queue));
	newnode->a = data;
	newnode->next = NULL;

	//如果队列没有数据要做单独处理
	if (q->tail == NULL)
	{
		q->head = q->tail = newnode;
	}
	//如果队列已经有数据了
	else
	{
		q->tail->next = newnode;
		q->tail = newnode;
	}
}

void QueuePop(Qnene* q)
{
	assert(q);

	
	//如果队列中只有一个数据,那么删除这个数据就是空了
	if (q->head->next == NULL)
	{
		free(q->head);
		q->head = q->tail = NULL;
	}
	else
	{
		Queue* tist = q->head->next;
		free(q->head);
		q->head = tist;
	}

}

STDataType QueueFront(Qnene* q)
{
	assert(q);

	return q->head->a;
}

STDataType QueueBack(Qnene* q)
{
	assert(q);
	
	return q->tail->a;
}

int QueueSize(Qnene* q)
{
	assert(q);

	int size = 0;
	
	Queue* tist = q->head;
	while (tist)
	{
		++size;
		tist = tist->next;
	}
	return size;
}

bool QueueEmpty(Qnene* q)
{
	assert(q);

	return q->head == NULL;
}

void QueueDestroy(Qnene* q)
{
	assert(q);

	Queue* tist = q->head;
	while (tist)
	{
		Queue* cur = tist->next;
		free(tist);
		tist = cur;
	}
	q->head = q->tail = NULL;
}

void Intenode()
{
	Qnene st;
	 初始化队列 
	QueueInit(&st);
	 队尾入队列 
	QueuePush(&st, 1);
	QueuePush(&st, 2);
	QueuePush(&st, 3);
	QueuePush(&st, 4);
		
	 获取队列队尾元素 
	int size= QueueSize(&st);
	printf("队列中有%d个数据\n", size);

	 检测队列是否为空
	while (!QueueEmpty(&st))
	{
		 获取队列头部元素 
		printf("%d ", QueueFront(&st));
		 队头出队列 
		QueuePop(&st);
	}
	
	//获取队列尾部元素
	//QueueBack(&st);
	
	 销毁队列 
	QueueDestroy(&st);
}

  • 12
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值