[数据结构]C语言队列的实现
我个人把链表、队列、栈分为一类,然后图、树分为一类。(串不考虑),分类的理由就是每一类有规律可循,即你能通过修改极少数的代码把链表变成队列、栈。(这里我们不考虑其他诸如设计模式等因素),因此本贴在讲完队列之后还会归纳一下这一类数据结构的规律,帮助大家更好理解数据结构
首先需要知道队列是什么,这里给一个定义:队列是只允许一段进行插入操作,一段进行删除操作的线性表,队列是先进先出的结构,允许插入成为队尾,允许删除成为队头
如上图就是一个队列,这里我相信你已经对队列有了一个概念了吧,于是就可以继续看下面了
队列同样存在插入删除操作,由于我们这里讨论的是链式队列的实现,所以不存在队列满的情况
学了这么多章数据结构我相信你能很容易的写出队列的结构了:
struct node{
char data;
struct node *next;
};
struct queue{
struct node *front;
struct node *rear;
};
就如上完成了一个队列的结构定义,然后是创建一个空队列:
struct queue *create_queue(){
struct queue *q=new queue;
q->front=NULL;
q->rear=NULL;
return q;
}
这没什么说的,队头队尾都指向NULL表示空队列。
然后来考虑入队操作:
如上图,我们希望把e节点插入到这个队列里面,其实细心的朋友可能已经发现了这其实就是链表的尾部插入,没错,等一下我会总结一下这些规律
,这里暂且不谈。
我们能很容易写出下面插入节点到队列的代码(如果不能你就要发反思是否认真学习了):
void en_queue(struct queue *q,char c){
struct node *e=new node;
if(!n){
return;
}
e->data=c;
e->next=NULL;
if(q->rear==NULL){
q->front=q->rear=e;
}else{
q->rear->next=e;
q->rear=e;
}
}
这里稍作解释,后面的if用于判断是否队列为空,如果为空就让队头等于队尾等于新节点,然后新节点为队尾。如果队列不是空就按链表式尾插法进行插入
然后出队:
看着上面的图片如果你能与链表联系起来并想到这就是链表的头插法的逆向,那就说明你真的学懂了
我们只需要把front的next指向a2,然后把,然后删除a1即可完成出队,同样,要想删除a1就应该创建一个临时变量
代码如下:
void out_queue(struct queue *q){
struct node * temp;
if(q->front==NULL)
return;
if(q->front==q->rear)
{
q->front=q->rear=NULL;
return;
}
temp=q->front;
q->front=temp->next;
delete temp;
}
这里也简单解释一下,首先判断如果队列为空就不存在出队了,所以直接返回,如果队头等于队尾,也就是只有一个元素,就让队头队尾指向NULL(其实这里还可以删除队头),最后返回
遍历操作也顺利成章:
void print(struct queue *q){
struct node *n=q->front;
while(n!=NULL){
std::cout<< n->data;
n=n->next;
}
}
至此队列结束,考虑到排版问题,对着三种结构的总结放到下面一片文章。
[数据结构]C语言队列的实现的更多相关文章
- C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- javascript数据结构与算法---队列
javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...
- C++数据结构之链式队列(Linked Queue)
C++数据结构之链式队列,实现的基本思想和链式栈的实现差不多,比较不同的一点也是需要注意的一点是,链式队列的指向指针有两个,一个是队头指针(front),一个是队尾指针(rear),注意指针的指向是从 ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- JavaScript数据结构和算法----队列
前言 队列和栈很像,只是用了不同的原则.队列是遵循先进先出(FIFO)原则的一组有序的的项,队列在尾部添加新元素,从顶部移除元素.最新添加的元素必须必须排队在队列的,末尾.可以想象食堂排队买饭的样子. ...
- 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
随机推荐
- Python 日志处理(三) 日志状态码分析、浏览器分析
在企业中,从日志中提取数据进行分析,可以帮助企业更加了解用户行为,用户最感兴趣的产品或者内容,分析得到数据后,可以决定企业在今后的走向. 从这些日志数据中,比较重要的有: 1. 用户访问最多的url, ...
- 《Linux命令行与shell脚本编程大全》第十四章 处理用户输入
有时还会需要脚本能够与使用者交互.bash shell提供了一些不同的方法来从用户处获得数据, 包括命令行参数,命令行选项,以及直接从键盘读取输入的能力. 14.1 命令行参数 就是添加在命令后的数据 ...
- SimpleMarkdown - 一款简单的Markdown编辑器
源码地址: https://github.com/zhuangZhou/SimpleMarkdown 预览地址: http://hawkzz.com:8000 作者网站:http://hawkzz.c ...
- C/S架构自动化测试入门
所谓C/S架构即Client/Server(客户端/服务器架构).虽然近年来C/S架构产品越来越少,大有被B/S(Browser/Server 浏览器/服务器)架构超越的趋势,但C/S还是有B/S不可 ...
- select into
IN 子句可用于向另一个数据库中拷贝表: SELECT * INTO Persons IN 'Backup.mdb' FROM Persons
- Qt颜色下拉框
上周为了用Qt写一个类似颜色下拉框的东西,查阅了网上的多数相关资料,依然没有我想要的.终于在周四的时候下定决心重写QCombobox类来实现功能,现在把它贴出来,望看到的人,批评指正.废话不多说,先上 ...
- 【转】【JAVA应用】多线程断点下载
[转自] 光仔December http://blog.csdn.net/acmman 问题:多线程下载的好处? 多线程下载比单线程下载快,主要的原因是采用多线程下载,可以抢占更多的服务器资源.抢占C ...
- java 之 建造者模式(大话设计模式)
建造者模式,在笔者看来比较试用于,定制一个业务流程,而流程的细节又不尽相同,每个细节又必不可少,这时应考虑使用建造者模式. 大话设计模式-类图 先看下笔者写的一个简单的例子. /** * 所有建造过程 ...
- poj1611 解题报告
并查集学习过之后做了几道相关联系,这里贴出1611 The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: ...
- 新一代 CI 持续集成工具 flow.ci 正式开源
很高兴地宣布 flow.ci 在 Apache-2.0 协议下正式开源了.flow.ci 是国内首套开源持续集成(CI) 解决方案,帮助企业团队实现开发流程(build-test-deploy)自动化 ...