前言

不同于栈,队列是一个先进先出的数据结构,规定数据节点从队列尾插入,从队列头取出,禁止对头尾两端以外的数据进行操作。队列可以分为顺序队列循环队列

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语言数据结构之队列相关推荐

  1. GO语言数据结构之队列

    https://www.cnblogs.com/zly-go/p/15472059.html 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队 ...

  2. C语言数据结构——环形队列

    队列都有两个指针,分别指向队头和队尾,用于出队入队 这里使用顺序表来实现队列,设置头元素下标为front,指向队头,尾元素下标为rear,指向队尾的下一个节点.之所以不选择链表,是因为链表不便于查找队 ...

  3. c语言 数据结构 循环队列

    #include<stdio.h> #include<stdlib.h> #define QueueSize 100 typedef char DataType; typede ...

  4. 数据结构环形队列学习(c语言)

    数据结构环形队列学习(c语言) 实现效果 效果模型描述 代码设置队列长度为5,数组实际大小为6(队列长度加1) 黄色方格是队列头,灰色是未被使用内存,蓝色是队列元素 Example1: 当队列添加满元 ...

  5. C语言数据结构【手抄版】第三章 栈和队列

    注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 注意:文中彩色代码均在Visual Studio 2022编译器中编 ...

  6. 一些可运行的C语言数据结构代码

    网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...

  7. c++ 优先队列_C/C++数据结构:队列结构最全解析!带你零基础入门队列结构

    前言 上一章节针对于C语言栈结构做了解析,不清楚的可以回顾一下. 本章节主要针对于C语言的基础数据结构队列做以解析. 数据结构之队列 队列是一种特殊的 线性表 ,特殊之处在于它只允许在表的前端(fro ...

  8. c语言中优先级队列_C ++中的优先级队列

    c语言中优先级队列 A Priority Queue is a variant of a Queue such that it's elements are ordered based on thei ...

  9. C语言数据结构【手抄版】第五章 树和二叉树【上篇】

    注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 5.1.树的基本概念和术语 1.树的定义 2.树的表示法 3.基本术 ...

最新文章

  1. 计算机桌面分页,电脑word文档怎么快速分页?
  2. 与MYSQL的零距离接触(数据类型) 慕课网
  3. 日常生活中怎样利用计算机的,数据存储与管理在日常生活中的三种方式
  4. 【学习笔记】JDBC:java提供的专门操纵数据库的API JDBC驱动程序的类型 JDBC常用的类与接口
  5. Java中的List
  6. 基于Verilog语言的伪随机码的编写
  7. RuoYi-Cloud 进阶篇_03( Seata 高可用集群与 NacosConfig配置中心整合)
  8. KDD2020 | 半监督迁移协同过滤推荐
  9. Codewar python训练题全记录——持续更新
  10. 计算机网络第七版第一章答案
  11. 一、传统能源仍具成长性
  12. iOS9 未受信任的企业级开发者
  13. make VERBOSE=1等的作用
  14. Mixpanel使用注意点
  15. 圆桌:满足客人空座需求,准备最少的椅子,合理安排客人入座圆桌
  16. android安装程序后缀,【单选题】Android安装包文件简称APK,其后缀名是() A. .apk B. .exe C. .txt D. .app...
  17. yxy小菊蒻201203总结
  18. 【工具】Excel表格数据不能编辑
  19. ftp服务器匿名用户文件夹,ftp服务器匿名用户文件夹
  20. 直播|BIA Separations 和元生物两位大咖关于质粒DNA的制造工艺和质量控制

热门文章

  1. Java、JSP银行账目管理系统
  2. Unity入门 ---- unity2D基础知识
  3. wangeditor 最大字数_我为什么要做富文本编辑器【wangEditor5个月总结】
  4. SSH免密登陆节点互信
  5. Chirp信号研究中的基础问题
  6. 几种常见的黑客攻击手段
  7. IOS7.X完美越狱解决被安装太极助手的方法
  8. UG7.5三四五轴编程+后处理讲解视频教程
  9. 一步步教你轻松学逻辑回归模型算法
  10. php绕过refer,绕过referer检测url跳转