赞
踩
队列所需要的头文件
先给类型重命名 意义前几篇有讲
队列要用到的两个结构体
第一个结构体里面有 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);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。