目录

  • Queue.h
  • Queue.c
  • test.c

Queue.h

#pragma once //采用带头节点的单链表实现队列typedef int DataType;typedef struct QueueNode
{   struct QueueNode* next;DataType data;
}QNode;typedef struct Queue
{QNode* front;QNode* back;
}Queue;//初始化
void QueueInit(Queue* q);//入队列
void QueuePush(Queue* q, DataType data);//出队列
void QueuePop(Queue* q);//获取队头元素
DataType QueueFront(Queue* q);//获取队尾元素
DataType QueueBack(Queue* q);//获取队列中有效元素的个数
int QueueSize(Queue* q);//检测队伍中是否为空
int QueueEmpty(Queue* q);//销毁
void QueueDestroy(Queue* q);

Queue.c

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>#include "Queue.h"QNode* NewQueueNode(DataType data)
{QNode* node = (QNode*)malloc(sizeof(QNode));if(NULL == node){assert(0);return NULL;}node->data = data;node->next = NULL;return node;
}//初始化
void QueueInit(Queue* q)
{assert(q);q->front = q->back = NewQueueNode(0); //创建头节点
}//入队列
void QueuePush(Queue* q, DataType data)
{assert(q);q->back->next = NewQueueNode(data); //将新数挂到最后面q->back = q->back->next; //将新数的节点变为最后一个节点
}//出队列
void QueuePop(Queue* q)
{assert(q);//需要判空if(QueueEmpty(q))return;QNode* delNode = q->front->next;q->front->next = delNode->next; //让下下个节点成为头节点的下一个节点(让头节点指向下下个节点)//队列中只有一个元素,将该元素删除之后,需要让back节点指向头节点的位置if(NULL == delNode->next)q->back = q->front;free(delNode);
}//获取队头元素
DataType QueueFront(Queue* q)
{assert(q);return q->front->next->data;
}//获取队尾元素
DataType QueueBack(Queue* q)
{assert(q);return q->back->data;
}//获取队列中有效元素的个数
int QueueSize(Queue* q)
{assert(q);//就是节点的个数(不包括头节点)int count = 0;QNode* cur = q->front->next;while(cur){++count;cur = cur->next;}return count;
}//检测队列是否为空
int QueueEmpty(Queue* q)
{assert(q);return NULL == q->front->next;
}//销毁队列  逐个删除节点
void QueueDestroy(Queue* q)
{assert(q);QNode* cur = q->front;while(cur){q->front = cur->next;free(cur);cur = cur->next;}q->front = q->back = NULL;
}

test.c

#include <stdio.h>#include "Queue.h"int main()
{Queue q;QueueInit(&q);QueuePush(&q,1);printf("%d\n",QueueSize(&q));printf("%d\n",QueueFront(&q));printf("%d\n",QueueBack(&q));QueuePush(&q,1);QueuePush(&q,2);QueuePush(&q,3);QueuePush(&q,4);printf("%d\n",QueueSize(&q));printf("%d\n",QueueFront(&q));printf("%d\n",QueueBack(&q));QueuePop(&q);QueuePop(&q);printf("%d\n",QueueSize(&q));printf("%d\n",QueueFront(&q));printf("%d\n",QueueBack(&q));if(QueueEmpty(&q))printf("NULL\n");else printf("error\n");QueuePop(&q);QueuePop(&q);QueuePop(&q);if(QueueEmpty(&q))printf("NULL\n");else printf("error\n");//QueueDestroy(&q);
}

【数据结构】8. 队列(带头节点的单链表实现)(完整代码实现:初始化、入队列、出队列、获取队头元素、获取队尾元素、获取队列中有效元素的个数、判空、销毁)相关推荐

  1. 【不带头节点的单链表】

    不带头节点的单链表 前言 一.结构体设计 二.函数实现 1. 初始化 2. 购买一个新节点 3. 头插 4. 尾插 5. 按位置插入 6. 头删 7. 尾删 8. 按位置删 总结 补充代码 前言 单链 ...

  2. 数据结构-带头节点的单链表(C语言)超详细讲解

    前面我们学到线性表的顺序存储结构(顺序表),发现它有着明显的缺点:插入和删除元素时需要频繁的移动元素,运算效率低.必须按事先估计的最大元素个数申请连续的存储空间.存储空间估计大了,造成浪费空间:估计小 ...

  3. java带头节点的单链表_自己实现集合框架(五):带头结点单链表的实现

    这是系列文章,每篇文章末尾均附有源代码地址.目的是通过模拟集合框架的简单实现,从而对常用的数据结构和java集合有个大概的了解.当然实现没有java集合的实现那么复杂,功能也没有那么强大,但是可以通过 ...

  4. 不带头节点的单链表如何头插(多图易懂)

    文章目录 缘起 带头节点的头插 不带头节点的头插 错误的代码 为什么错误 如何修改 返回新的头指针 二级指针 缘起 本文想说的是单向非循环链表的头插.单向非循环链表,可以是带头节点的,也可以是不带头节 ...

  5. 数据结构不带头节点跟带头节点的单链表区别,C语言代码展示

    单链表头插法 不带头结点 void FronttList1(List *L) {List p;ElemType x;printf_s("请输入一组数据,以'0'为结束符\n");s ...

  6. 头插法和尾插法建立带头节点的单链表

    有两种方法建立单链表,尾插法和头插法,他们的区别是:头插法是按照输入元素倒序建立,为尾插法为顺序插入,并且多一个尾节点,我们一般使用尾插法. 一.头插法 代码为: pCurr -> next = ...

  7. 带头节点的单链表逆置

    #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next ...

  8. 借助栈将一个带头节点的单链表倒置

    分析: 先理解倒置: 倒置前:1->2->3 倒置后:3->2->1 思路:先沿着链表从头到尾扫一遍 将链表的每个结点的data的值依次入栈;  在沿着链表扫一遍 将栈中的元素 ...

  9. 数据结构练习:运用单链表实现图书管理系统(c/c++)(内含带头结点的单链表的基本操作)

    数据结构练习:运用单链表实现图书管理系统 正文 注意 部分功能运行展示 所包含头文件及结构体的定义 自定义函数 主函数 完整代码 结束语 正文 本程序使用带头节点的单链表存储结构实现,共有六个基本功能 ...

最新文章

  1. 【知识图谱实战】 Neo4j入门与示例
  2. 10个关于文件操作的小功能(Python),都很实用~
  3. 已锁定计算机,计算机锁定怎么解除_计算机已锁定如何解除
  4. composer的简单使用
  5. QT5_chart_常见几种图形
  6. 《Reids 设计与实现》第七章 RDB 持久化
  7. python方差的代码_Python statistics pvariance()用法及代码示例
  8. 串口扫盲十三:接口技术的基本知识
  9. 推荐:“创建MOSS2007自定义字段类型实例”
  10. iOS 开发比较实用的框架总结(上)
  11. java定时任务插件_jfinal定时调度任务插件QuartzPlugin
  12. 修复小米路由器mini的USB口
  13. cad 打开硬件加速卡_CAD如何根据已知条件设计图形
  14. MySQL安全你不知道的事
  15. 睡眠十律 (BBC纪录片) -- 讲述10分钟获得好睡眠的方法
  16. GetLastError的使用和返回值定义大全
  17. Centos下安装FastDFS
  18. DP(Nietzsche)的hu测 T3(规律?主席树)
  19. QLabel实现超链接,设置超链接颜色,去掉超链接下划线方法
  20. DeepLearning花书阅读记录(1)

热门文章

  1. wazuh官方安装指南(中文译版本)
  2. Mathcad_excel数据处理
  3. 中间件选型标准和流程
  4. GPS 驯服时钟原理
  5. 输入一个3×3的整型矩阵,求该矩阵主对角线元素之和
  6. iptables防火墙和firewalld防火墙
  7. 阜阳有儿童计算机编程吗,终于明白儿童有必要学编程吗
  8. python基础笔试面试题_python基础面试常见题
  9. 支持百亿数据场景,海量高性能列式数据库HiStore技术架构解析
  10. 阿拉伯数字与中文数字的相互转换