数据结构算法C语言实现(十一)--- 3.4队列的链式表示和实现

  一.简介

  FIFO。

  二.头文件

  1 //3_4_part1.h
  2 /**
  3 author:zhaoyu
  4 email:[email protected]
  5 date:2016-6-9
  6 note:realize my textbook <<数据结构(C语言版)>>
  7 */
  8 //Page 61
  9 #include <cstdio>
 10 #include "head.h"
 11 #define QElemType int
 12 //----单链队列:队列的链式存储结构----
 13 typedef struct QNode{
 14     QElemType data;
 15     struct QNode *next;
 16 }QNode, *QueuePtr;
 17 typedef struct{
 18     QueuePtr front;//队列头指针
 19     QueuePtr rear;//队列尾指针
 20 }LinkQueue;
 21 //基本操作的声明及实现
 22 Status InitQueue(LinkQueue &Q)
 23 {
 24     //构造一个空队列
 25     Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
 26     if (!Q.front)
 27     {
 28         exit(OVERFLOW);
 29     }
 30     Q.front->next = NULL;
 31     return OK;
 32 }
 33 Status DestroyQueue(LinkQueue &Q)
 34 {
 35     //销毁队列 Q ,Q 不存在
 36     while (Q.front)
 37     {
 38         Q.rear = Q.front->next;
 39         free(Q.front);
 40         Q.front = Q.rear;
 41     }
 42     return OK;
 43 }
 44 Status ClearQueue(LinkQueue &Q)
 45 {
 46     //将 Q 清为空队列
 47 }
 48 Status QueueEmpty(LinkQueue Q)
 49 {
 50     //若队列 Q 为空,则返回 TRUE,否则返回 FALSE
 51 }
 52 int QueueLength(LinkQueue Q)
 53 {
 54     //返回 Q 的元素个数
 55 }
 56 Status GetHead(LinkQueue Q, QElemType &e)
 57 {
 58     //若队列不空,则用 e 返回 Q 的队列头元素, 并返回 OK,
 59     //否则返回 ERROR
 60
 61 }
 62 Status EnQueue(LinkQueue &Q, QElemType e)
 63 {
 64     //插入 e 为 Q 的新的队尾元素
 65     QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
 66     if (!p)
 67     {
 68         exit(OVERFLOW);
 69     }
 70     p->data = e;
 71     p->next = NULL;
 72     Q.rear->next = p;
 73     Q.rear = p;
 74     return OK;
 75 }
 76 Status DeQueue(LinkQueue &Q, QElemType &e)
 77 {
 78     //若队列不空,则删除 Q 的队头元素,用 e 返回其值,
 79     //并返回 OK,否则返回 ERROR
 80     if (Q.front == Q.rear)
 81     {
 82         return ERROR;
 83     }
 84     QueuePtr p = Q.front->next;
 85     e = p->data;
 86     Q.front->next = p->next;
 87     if (Q.rear == p)
 88     {
 89         Q.rear = Q.front;
 90     }
 91     free(p);
 92     return OK;
 93 }
 94 void visit(void)
 95 {
 96
 97 }
 98 Status QueueTraverse(LinkQueue Q, void visit())
 99 {
100
101 }
102 void PrintQueue(LinkQueue Q)
103 {
104     //QueuePtr p = Q.front;注意头结点、头指针
105     QueuePtr p = Q.front->next;
106     while (p)
107     {
108         printf("%d\t", p->data);
109         if (p == Q.rear)
110         {
111             break;
112         }
113         p = p->next;
114     }
115     printf("\n");
116 }

3_4_part1.h

  三.CPP文件

 1 #include "3_4_part1.h"
 2 int main(int argc, char const *argv[])
 3 {
 4     LinkQueue Q;
 5     InitQueue(Q);
 6     for (int i = 1; i < 10; i++)
 7     {
 8         EnQueue(Q, i);
 9     }
10     PrintQueue(Q);
11     int e;
12     for (int i = 0; i < 5; ++i)
13     {
14         DeQueue(Q, e);
15         printf("%d\t", e);
16     }
17     return 0;
18 }

3_4_part1.cpp

  四.测试

  

时间: 2024-10-03 01:18:52

数据结构算法C语言实现(十一)--- 3.4队列的链式表示和实现的相关文章

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

数据结构-队列-顺序链式存储

定义 队列(Queue):队列简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除.向队列中插入元素称为入队或进队:删除元素称为出队或离队. 队列的操作 队列不可以读取对中间的元素. 队列的存储结构 顺序存储 链式存储 顺序存储 队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针front 和rear分别指示队头元素和队尾元素的位置. 设队头指针指向队头元素,队尾指针指向队尾 元素的下一个位置(也可以让rear指向队尾元素,front指向队头元

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

一.简述 [暂无] 二.头文件 1 #ifndef _2_3_part1_H_ 2 #define _2_3_part1_H_ 3 //2_3_part1.h 4 /** 5 author:zhaoyu 6 email:[email protected] 7 date:2016-6-4 8 note:realize my textbook <<数据结构(C语言版)>> 9 */ 10 //----线性表的单链表存储结构---- 11 /** 12 My Code 13 to mak

数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 1 抽象数据类型一元多项式的定义 2 ADT Polyomail{ 3 数据对象:D = {a[i]|a[i]属于TermSet, i = 1,2,3...,m,m>=0 4 TermSet中每个元素包含一个表示系数的实数和表示指数的整数} 5 数据关系 6 基本操作: 7 CreatPolyn(&P, m) 8 操作结果:输入 m 项的系数和指数,建立一元

数据结构算法C语言实现(十)--- 3.3栈与递归的实现

一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二.CPP文件 1 //3_3.cpp 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-8 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 54 9

数据结构算法C语言实现(七)--- 3.1 的线性实现及应用举例

一.简述 栈,LIFO.是操作受限的线性表,和线性表一样有两种存储表示方法.下面以顺序存储为例,实现. 二.ADT 暂无. 三.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 46 9 10 #ifndef _3_1_H_ 11 #define _3_1_H_ 12

数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈及相关操作是第三章实现的,但数据类型做了更改. 二.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>&g

数据结构算法C语言实现(十二)--- 3.4循环队列&amp;队列的顺序表示和实现

一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 1 //3_4_part1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-9 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 64 9 #include <cstdio