数据结构:链表队列的实现

快速开始

  队列是一种和栈相反的,遵循先进先出原则的线性表。此文章使用链表来实现队列。

  

  如上图所示,就像一个自来水管,先进入水管的水先从水龙头出来,即Front位置的元素最先出队列,因为它们是最先入队列的。

  

2、实现队列

  本代码是严蔚敏教授的数据结构书上面的伪代码的C语言实现代码。

  一定要多思考,多问为什么!

  首先我们定义了一些常量:

#include <stdio.h>
#include <stdlib.h> #define OK 1
#define ERROR 0 typedef int QElemtype;
typedef int status;

2.1、对队列和节点的结构定义

  既然底层是链表,那么每个节点不仅要保存当前值,还要指向下一个节点的地址。

  对于队列来说,每次插入值都是在队尾(rear),每次取出值都是在队首(head),所以,我们一定是有两个变量来指向队头与队尾的。

  

  综上所述,我们结构定义代码如下:

typedef struct QNode //对节点的结构定义
{
QElemtype data;
struct QNode *next;
}QNode,*QueuePtr; typedef struct{ //对队列的结构定义
QueuePtr head;
QueuePtr rear;
}LinkQueue; 

2.2、队列初始化

  初始化主要是对为队列中的两个重要节点分配空间,这里我们需要注意的是初始化时头指针和尾指针指向同一个节点。

  代码如下:

status initQueue(LinkQueue* que) //初始化队列
{
que->head=que->rear=(QueuePtr)malloc(sizeof(QNode));
if(!que->head) //这段代码对队列里面的用户自定义数据类型进行了初始化
return ERROR;
return OK;
}

2.3、入队操作

  一定要搞清指针的概念。

  首先rear和head指向同一个元素。然后,我们使rear的next指向新元素,这样rear指向的元素(即1)的next就是新元素了。最后,我们让rear指向新元素。这样一个入队操作就完成了。

  

  代码如下:

status enQueue(LinkQueue* que,QElemtype e)
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p) //若未能申请到空间,便退出
return ERROR;
p->data=e;
p->next=NULL; que->rear->next = p;
que->rear=p;
return OK;
}

  

2.4、出队操作

  我们来思考这个过程,在下图队列中,我们出队的第一个元素是元素A,不是1。(因为1不是插入进来了的,而是我们初始化时就有的)。我们首先让*t等于head的next,即元素A。然后修改head的next指向为元素A的next。

这样head的next就会指向元素B。出队操作就完成了。

  代码如下:

status delQueue(LinkQueue* que,QElemtype *t)
{
if(que->rear==que->head)
return ERROR; //队列为空 QueuePtr p = que->head->next;
*t=p->data; que->head->next=p->next;
if(que->rear==p) //这个判断是 确保在清空队列的时候,让rear指针归位。
que->rear=que->head;
free(p);
return OK;
}

  

2.5、回收队列

  回收可以快速取消队列,方法是让头尾碰面即可。

status destoryQueue(LinkQueue* que) //回收队列
{
if(que->head)
{
que->rear = que->head->next;
free(que->head);
que->head=que->rear;
}
return OK;
}

2.6、遍历队列和测试方法

  提供一个简单的方法来测试链表队列。

status viewQueue(LinkQueue* que)
{
if(que->rear == que->head)
return ERROR; QueuePtr p =que->head->next;
while(p)
{
printf("val:%d",p->data);
p=p->next;
}
return OK;
} int main(int argc, char **argv)
{
LinkQueue myQueue;
initQueue(&myQueue);
for(int i=1;i<=5;i++)
enQueue(&myQueue,i);
viewQueue(&myQueue); QElemtype a;
for(int i=0;i<5;i++)
{
delQueue(&myQueue,&a);
printf("%d\n",a);
}
destoryQueue(&myQueue);
printf("fuck !");
return 0;
}    

数据结构:C_链表队列的实现的更多相关文章

  1. java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表

    java实现 数据结构:链表. 栈. 队列.优先级队列.哈希表   数据结构javavector工作importlist 最近在准备找工作的事情,就复习了一下java.翻了一下书和网上的教材,发现虽然 ...

  2. java:数据结构复习(三)链表队列

    @TOC 和栈一样,队列也是表,但是使用队列的特点是先进先出. 队列模型 队列的基本操作是入队,它是在表的末端插入一个元素,和出队,它是删除在表开头的一个元素 graph LR A[<kbd&g ...

  3. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  4. [数据结构]C语言队列的实现

    我个人把链表.队列.栈分为一类,然后图.树分为一类.(串不考虑),分类的理由就是每一类有规律可循,即你能通过修改极少数的代码把链表变成队列.栈.(这里我们不考虑其他诸如设计模式等因素),因此本贴在讲完 ...

  5. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  6. javascript数据结构与算法---队列

    javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...

  7. C语言 复杂队列(链表队列)

    //复杂的队列二 --链表队列 #include<stdio.h> #include<stdlib.h> #define datatype int struct queueli ...

  8. C++数据结构之链式队列(Linked Queue)

    C++数据结构之链式队列,实现的基本思想和链式栈的实现差不多,比较不同的一点也是需要注意的一点是,链式队列的指向指针有两个,一个是队头指针(front),一个是队尾指针(rear),注意指针的指向是从 ...

  9. linux内核数据结构之链表

    linux内核数据结构之链表 1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该 ...

随机推荐

  1. python基础之day2

    python基本数据类型 1.数字 int(整型)      在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647  在64位系统 ...

  2. DSY2748*音量调节

    Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...

  3. select2的相关问题

    在弹出框中无法使用select2的问题: 通常情况下,使用select2只需要在加载相关js和css后,添加如下代码即可: $("#selectId").select2(); 但如 ...

  4. console对象-转

    console对象 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 开发者工具 console对象 console.log() console.debug() ...

  5. $Host.Runspace.ThreadOptions = “ReuseThread”有神马用?

    $Host.Runspace.ThreadOptions = “ReuseThread” 在很多PowerShell的脚本中你都会看到这个语句被用来开头,那它的作用是什么呢? 答:这个设置可以提高对内 ...

  6. DotNet Core 介绍

    前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...

  7. Linux 部署ASP.NET SQLite 应用 的坎坷之旅 附demo及源码

    Linux 部署ASP.NET SQLite 应用 的坎坷之旅.文章底部 附示例代码. 有一台闲置的Linux VPS,尝试着部署一下.NET 程序,结果就踏上了坑之路,不过最后算是完美解决问题,遂记 ...

  8. 使用Guava EventBus构建publish/subscribe系统

    Google的Guava类库提供了EventBus,用于提供一套组件内publish/subscribe的解决方案.事件总线EventBus,用于管理事件的注册和分发.在系统中,Subscribers ...

  9. [ASP.NET MVC 小牛之路]08 - Area 使用

    ASP.NET MVC允许使用 Area(区域)来组织Web应用程序,每个Area代表应用程序的不同功能模块.这对于大的工程非常有用,Area 使每个功能模块都有各自的文件夹,文件夹中有自己的Cont ...

  10. Bower是什么?

    一.简介 Bower是一个客户端技术的软件包管理器,它可用于搜索.安装和卸载如JavaScript.HTML.CSS之类的网络资源.其它一些建立在Bower基础之上的开发工具,如YeoMan和Grun ...