基本概念


 

  队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。

   我们规定,允许删除的叫做队首“head”,允许插入的叫做队尾“tail”。

  

基本操作


  我们规定,一个结点包含数值域与指针域两部分,数值域存放链表所需要用到的非指针型数值,指针域用于存放数值以及指向下一个结点的next指针。

  

  /*定义链表队列*/

  struct Node{ int dota;struct Node *next}node;   //结构体存放结点

  struct linkqueue{struct Node *head;struct Node *tail}queue;  //存放队头指针和队尾指针,不存放在Node中是为了节省节点入队时占用的内存空间

  

   /* 初始化队列 */

  1.队头指针和队尾指针共同申请一个内存空间,我们假定申请到的内存地址是0X01

  2.结点下一结指向NULL

     注意:头结点的数据域为空

  PS:框框下头的&q、head、tail表示的是已串到0X01内存地址上的结点

  

   /* 入队操作 */

    1.申请新结点p,申请内存空间,我们规定申请到的内存空间地址为0X02

  2.输入的数据elem存放在新结点数据中

  3.新结点p的下一结指向NULL

  4.尾结点tail的下一结点指向新结点p,即把新结点p串到链表中

  5.队尾指针tail->next指向新结点,保证尾结点指针tail->next始终指向NULL

  

  

  

  /* 出队操作 */

  1.申请结点指针p,指向队头结点head,内存地址为0X01

  2.队头结点head传入下一结点,以免其被free();而失去了删除的这一端

  3.free();指针p指向的结点,原队头结点head所在的内存地址0X01

  4.p=NULL //避免野指针

  

  

  /* 打印操作 */

  1.若队头结点还位于内存地址0X01上,由于0X01内存地址上结点的数值域未写入,所以队头结点head应移入下一结点中,即head=head->next;

  2.申请一个结点p

  3.把结点p串入含有数值域的结点,即p=q->head->next,q是结构体queue类型的队列。

  4.遍历打印p=p->next,直到NULL。

  

源代码


  

/**********************************************************************
实现一个queue
输入: 7 6 8 6 6 7 0 4 1(队列) 9(出队的个数)
输出:The queue is empty!
**********************************************************************/
#include<stdio.h>
#include<stdlib.h> typedef struct Node
{
int data;
struct node *next;
}node;
/* 当链式队列的头尾节点指针定义成为一个单独的结构体,避免在新增节点时占用过多的空间 */
typedef struct list
{
struct Node *head;
struct Node *tail;
}queue; void queue_init(queue *q);
void queue_in(queue *q,int elem);
void queue_out(queue *q);
void queue_print(queue *q);
void queue_empty(queue *q); int main()
{
queue q;
queue_init(&q);
int elem;
printf("input:");
while(scanf("%d",&elem)!=EOF)
{
getchar();
queue_in(&q,elem);
}
queue_print(&q);
queue_out(&q);
queue_print(&q);
queue_empty(&q);
return 0;
} void queue_init(queue *q)
{
q->head=q->tail=(node*)malloc(sizeof(node)); //head,tail共同指向一个内存空间
q->tail->next=NULL; //队尾指针的next指针指向NULL,头结点head不变
return;
} void queue_in(queue *q,int elem)
{
node *p;
p=(node *)malloc(sizeof(node));
p->data=elem;
p->next=NULL;
q->tail->next=p;
q->tail=p;
return;
} void queue_out(queue *q)
{
node *p;
int i; //i==出队的数据个数
printf("The number of out queue:\n");
scanf("%d",&i);
while(i)
{
p=q->head;
q->head=q->head->next;
free(p);
p=NULL; //防止野指针
i--;
}
return;
} void queue_print(queue *q)
{ node *p;
p=q->head->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
return;
} void queue_empty(queue *q)
{
if(q->head->next==NULL)
{
printf("The queue is empty!\n");
}
return;
}

队列queue(2):链表实现队列的更多相关文章

  1. C++栈(stack)、队列(queue)、链表(list)的常用函数

    C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一 ...

  2. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  3. Java多线程总结之线程安全队列Queue

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非 ...

  4. Java数据结构——用双端链表实现队列

    //================================================= // File Name : LinkQueue_demo //---------------- ...

  5. 队列(Queue)--环形队列、优先队列和双向队列

    1. 队列概述 队列和堆栈都是有序列表,属于抽象型数据类型(ADT),所有加入和删除的动作都发生在不同的两端,并符合First In, First Out(先进先出)的特性. 特性: ·FIFO ·拥 ...

  6. STL中的单向队列queue

    转载自:http://blog.csdn.net/morewindows/article/details/6950917 stl中的queue指单向队列,使用时,包含头文件<queue>. ...

  7. 什么是队列(Queue)?

    类似于链表和堆栈,队列也是存储数据的结构.队列中数据进入队列的顺序很重要,一般来说,队列就是一群人或者事物按照排好的顺序等待接受服务或者处理. 定义:队列,又称为伫列(queue),是先进先出(FIF ...

  8. 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  9. java队列——queue详细分析

    Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Deque接 口.   Q ...

  10. java中队列Queue的使用

    1.在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.Queue接口与List.Set同一级别,都是继承了Collection接口.Queue使用时要尽量避免Colle ...

随机推荐

  1. 想使用Docker容器?先看看这些注意事项

    Docker容器无疑是最近十年来最引人注目的技术之一,因为有了它,对我们思考设计.开发和运维软件的方式产生了非常有益的影响. 但是就像每一个开发工具一样,为了充分利用这些工具,需要注意一些使用中问题, ...

  2. AutoCAD.net支持后台线程-Socket服务端

    最近因为公司项目的需求,CAD作为服务端在服务器中常驻运行,等待客户端远程发送执行任务的指令,最终确认用Socket-tcp通讯,CAD需要实时监听客户端发送的消息,这时就需要开启线程执行Socket ...

  3. python打包exe pyinstaller 简单使用

    源由 最近公司让做了一个小工具,使用python写的,写完之后要求能放在其它电脑上运行,于是就开始寻找方案; 按网上的说法 py2exe已经很久没更新了,资料也不多: 于是就采用pyinstaller ...

  4. Sublime Text 3 修改配色方案

    你可能会觉得 Sublime Text 配色方案的颜色(注释.背景色)看起来不习惯,其他都满意.此时我们可以自己修改这些配色,不需要更换整个配色方案. 需要安装 PackageResourceView ...

  5. java虚拟机概述

    java 虚拟机是什么?       java虚拟机是一个将字节码指令映射为对应物理操作系统指令的程序.       java程序的运行需要事先安装 jdk,而在jdk内部的jre中其核心就是 jvm ...

  6. Function Programming - First Class(一等公民function)

    引用外界一等公民的定义:"在JavaScript世界中函数却是一等公民,它不仅拥有一切传统函数的使用方式(声明和调用),而且可以做到像简单值一样赋值.传参.返回,这样的函数也称之为第一级函数 ...

  7. springboot学习(二)——springmvc配置使用

    以下内容,如有问题,烦请指出,谢谢 上一篇讲解了springboot的helloworld部分,这一篇开始讲解如何使用springboot进行实际的应用开发,基本上寻着spring应用的路子来讲,从s ...

  8. Java中的回调

    又忙了一周,事情差不多解决了,终于有可以继续写我的博客了(各位看官久等了). 这次我们来谈一谈Java里的一个很有意思的东西--回调. 什么叫回调,一本正经的来讲,在计算机程序设计中,回调函数是指通过 ...

  9. spring中的自定义标签

    为了给系统提供可配置化支持,一般会用原生态的方式去解析定义好的XML文件,然后转化为配置对象.这种方式对于简单.单一的配置文件,或者是XML配置格式固定的配置文件,比较容易处理.但是对于一些配置非常复 ...

  10. 关于xampp集成开发环境的建立与初步认识

    针对于xampp集成开发环境的建立主要分大步骤:         1.把xampp的压缩包压缩到一个盘中,比如c盘:然后点击中间的那个图标开始安装,由于这个软件是配置基本已经OK了,故可以直接next ...