c语言数据结构之队列
前言
不同于栈,队列是一个先进先出的数据结构,规定数据节点从队列尾插入,从队列头取出,禁止对头尾两端以外的数据进行操作。队列可以分为顺序队列和循环队列。
C语言数据结构之单链表
C语言数据结构之双向链表
c语言数据结构之栈
c语言数据结构之队列
C语言数据结构之树
1 顺序队列
1.1 队列结构
顺序队列并不是说内存地址连续的队列,它是通过链表的形式链接而成。Node结构体表示一个节点,包括数据域和指针域;Queue结构体定义front、near指针分别指向节点的头和尾。
typedef struct _NODE {int data;struct _NODE *next;
}Node,*Nodelist;typedef struct _QUEUE {Node * front; //队首指针Node * near; //队尾指针
}Queue,*Queuep;
1.2 队列判空
队列需要有个判断是否为空的操作,以便更好的进行入、出队列操作。
front、near指向NULL为空队列。
int queue_empty(Queuep que)
{if(que->front == NULL){return 0;}return 1;
}
1.3 队列创建
很简单,将队列front、near指针初始化为NULL,然后函数返回一个创建的队列地址值即可。
Queuep queue_create()
{Queuep que = (Queuep )malloc(sizeof(Queue));if(que == NULL){printf("malloc error.\n");exit(-1);}que->front = NULL;que->near = NULL;return que;
}
1.4 入队列操作
将新节点加入队列尾部中,需要注意以下几点:
①队列为空:将front和near指向新节点;
②队列非空:将队列尾节点的next指向新节点,然后队列尾指针near指向新节点。
void queue_push(Queuep que)
{int data = 0;Node *p = NULL;printf("please input Node data: ");scanf("%d",&data);p = add_node(data);if(queue_empty(que) == 0){que->front = que->near = p;}else{que->near->next = p;que->near = p;}
}
1.5 出队列操作
从非空队列的头部取出数据,然后将front指向下个节点处,释放掉取消节点的内存空间。出队列时需要对队列进行判空操作,空队列直接返回。
如果取出前只有一个数据节点了,取出后将front、near指向NULL表示队列为空了。
void queue_pop(Queuep que)
{Node *p = NULL;if(queue_empty(que) == 0){printf("queue is empty.\n");return ;}else{printf("pop queue data :%d\n",que->front->data);if(que->front == que->near){ p = que->front;free(p);que->front = NULL;que->near = NULL;}else{p = que->front;que->front = que->front->next;free(p);}printf("\n");}
}
1.6 示例程序
/****************************************
Fuction:C语言实现顺序队列
Time:9/25/2022
Author:Qurry
****************************************/#include <stdio.h>
#include <stdlib.h>typedef struct _NODE {int data;struct _NODE *next;
}Node,*Nodelist;typedef struct _QUEUE {Node * front; //队首指针Node * near; //队尾指针
}Queue,*Queuep;/****** 创建队列 ******/
Queuep queue_create()
{Queuep que = (Queuep)malloc(sizeof(Queue));if(que == NULL){printf("malloc error.\n");exit(-1);}que->front = NULL;que->near = NULL;return que;
}/****** 添加新节点 ******/
Nodelist add_node(int data)
{Node * p = (Nodelist)malloc(sizeof(Node));if(p == NULL){printf("malloc error.\n");exit(-1);} p->data = data;p->next = NULL;return p;
}/******* 判断队列是否为空 ********* return :0 空* 1 非空* **********************************/
int queue_empty(Queuep que)
{if(que->front == NULL){return 0;}return 1;
}/******* 入队列 *********/
void queue_push(Queuep que)
{int data = 0;Node *p = NULL;printf("please input Node data: ");scanf("%d",&data);p = add_node(data);if(queue_empty(que) == 0){que->front = que->near = p;}else{que->near->next = p;que->near = p;}
}/******* 出队列 **********/
void queue_pop(Queuep que)
{Node *p = NULL;if(queue_empty(que) == 0){printf("queue is empty.\n");return ;}else{printf("pop queue data :%d\n",que->front->data);if(que->front == que->near){ p = que->front;free(p);que->front = NULL;que->near = NULL;}else{p = que->front;que->front = que->front->next;free(p);}printf("\n");}
}/******** 遍历打印队列 ***********/
void queue_print(Queuep que)
{Node *p = NULL;if(queue_empty(que) == 0){printf("queue is empty.\n");return ;}else{p = que->front;printf("queue data,front to near: ");while(1){printf("%d\t",p->data);if(p->next == NULL){break;}p = p->next;}printf("\n");}
}/*********** 选择菜单 **************/
int menu_select()
{int mode;printf("1:入队列 2:出队列 3:打印队列数据 0:退出\n");printf("Please input mode : ");scanf("%d",&mode);return mode;
}/************ 退出释放内存 ************/
void free_node(Queuep que)
{Node *p = NULL,*q = NULL;if(queue_empty(que) == 0){printf("queue is empty.\n");return ;}else{p = que->front;q = p;while(1){if(p->next == NULL){free(p);break; }else{p = p->next;free(q);q = p;}}}printf("Bye bye.\n");
}void main()
{int mode = 0;Queue *que = queue_create();while(1){mode = menu_select();switch (mode){case 0:free_node(que);return ;case 1:queue_push(que);break;case 2:queue_pop(que);break;case 3:queue_print(que);break;default:printf("input num error!\n");break;}}
}
1.7 测试结果
对创建、出、入队列操作的测试。
c语言数据结构之队列相关推荐
- GO语言数据结构之队列
https://www.cnblogs.com/zly-go/p/15472059.html 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队 ...
- C语言数据结构——环形队列
队列都有两个指针,分别指向队头和队尾,用于出队入队 这里使用顺序表来实现队列,设置头元素下标为front,指向队头,尾元素下标为rear,指向队尾的下一个节点.之所以不选择链表,是因为链表不便于查找队 ...
- c语言 数据结构 循环队列
#include<stdio.h> #include<stdlib.h> #define QueueSize 100 typedef char DataType; typede ...
- 数据结构环形队列学习(c语言)
数据结构环形队列学习(c语言) 实现效果 效果模型描述 代码设置队列长度为5,数组实际大小为6(队列长度加1) 黄色方格是队列头,灰色是未被使用内存,蓝色是队列元素 Example1: 当队列添加满元 ...
- C语言数据结构【手抄版】第三章 栈和队列
注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 注意:文中彩色代码均在Visual Studio 2022编译器中编 ...
- 一些可运行的C语言数据结构代码
网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...
- c++ 优先队列_C/C++数据结构:队列结构最全解析!带你零基础入门队列结构
前言 上一章节针对于C语言栈结构做了解析,不清楚的可以回顾一下. 本章节主要针对于C语言的基础数据结构队列做以解析. 数据结构之队列 队列是一种特殊的 线性表 ,特殊之处在于它只允许在表的前端(fro ...
- c语言中优先级队列_C ++中的优先级队列
c语言中优先级队列 A Priority Queue is a variant of a Queue such that it's elements are ordered based on thei ...
- C语言数据结构【手抄版】第五章 树和二叉树【上篇】
注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 5.1.树的基本概念和术语 1.树的定义 2.树的表示法 3.基本术 ...
最新文章
- 计算机桌面分页,电脑word文档怎么快速分页?
- 与MYSQL的零距离接触(数据类型) 慕课网
- 日常生活中怎样利用计算机的,数据存储与管理在日常生活中的三种方式
- 【学习笔记】JDBC:java提供的专门操纵数据库的API JDBC驱动程序的类型 JDBC常用的类与接口
- Java中的List
- 基于Verilog语言的伪随机码的编写
- RuoYi-Cloud 进阶篇_03( Seata 高可用集群与 NacosConfig配置中心整合)
- KDD2020 | 半监督迁移协同过滤推荐
- Codewar python训练题全记录——持续更新
- 计算机网络第七版第一章答案
- 一、传统能源仍具成长性
- iOS9 未受信任的企业级开发者
- make VERBOSE=1等的作用
- Mixpanel使用注意点
- 圆桌:满足客人空座需求,准备最少的椅子,合理安排客人入座圆桌
- android安装程序后缀,【单选题】Android安装包文件简称APK,其后缀名是()
A. .apk B. .exe C. .txt D. .app...
- yxy小菊蒻201203总结
- 【工具】Excel表格数据不能编辑
- ftp服务器匿名用户文件夹,ftp服务器匿名用户文件夹
- 直播|BIA Separations 和元生物两位大咖关于质粒DNA的制造工艺和质量控制