算法(4)—— 队列的链表实现

1. 队列的链表实现EnQueue 在尾节点,DeQueue 在首节点。

  1 #include  "fatal.h"
  2
  3 typedef int ElementType ;
  4 typedef struct QueueNode * Queue;
  5 typedef struct QueueNode * Position;
  6
  7 #define MAXSIZE (6)
  8
  9
 10 struct QueueNode  {
 11   ElementType data;
 12   Position Next;
 13   Position Rear;
 14   Position Front;
 15   int size;
 16 };
 17
 18 void DeleteQueue  (Queue Q);
 19 Queue MakeEmpty(Queue Q);
 20 int  IsEmpty  (Queue Q);
 21 int  IsFull (Queue Q);
 22 void EnQueue  (ElementType X, Queue Q);
 23 void DeQueue  (Queue Q);
 24 ElementType FrontAndDequeue (Queue);
 25
 26
 27
 28 int main(int argc, char *argv[])  {
 29   Queue Q;
 30   Q = MakeEmpty (NULL);
 31
 32   EnQueue (1,Q);
 33   EnQueue (2,Q);
 34
 35   ElementType X = 12 ;
 36
 37   while ( !IsEmpty(Q))  {
 38     printf ("%d ", Q->Front->data);
 39     DeQueue (Q);
 40   }
 41   printf("\n");
 42   printf("Empty = %c\n",IsEmpty(Q)?‘Y‘:‘N‘ );
 43
 44   Q = MakeEmpty (NULL);
 45   EnQueue (X,Q);
 46   EnQueue (21,Q);
 47   EnQueue (X,Q);
 48   printf("Queue is: ");
 49
 50   Position P = Q -> Front;
 51   while (P)  {
 52     printf ("%d ",P->data);
 53     P = P->Next;
 54   }
 55   printf("\n");
 56
 57   printf ("Front and Rear:%d %d  ",Q->Front->data,Q->Rear->data);
 58   printf("\n");
 59
 60   ElementType Y = FrontAndDequeue (Q);
 61   printf ("Del and Front:%d %d ", Y,Q->Front->data);
 62
 63   printf("\n");
 64   Y = FrontAndDequeue (Q);
 65   printf ("Del and Front:%d %d ", Y,Q->Front->data);
 66   printf("\n");
 67
 68   Y = FrontAndDequeue (Q);
 69   printf ("Del and Front:%d %d\n", Y,(Q->Front == Q?0:Q->Front->data));
 70
 71   DeQueue (Q);    //do not Del any node
 72   DeQueue (Q);
 73
 74   printf("size = %d\n",Q->size);
 75
 76   return 0;
 77
 78 }
 79
 80
 81 void Delete (Queue Q)  {
 82   if ( Q = NULL)
 83     Error ("Out of space.");
 84   Position P, tmp;
 85   P = Q->Next;
 86   Q -> Next = NULL;
 87
 88   while ( P != NULL)  {
 89     tmp = P -> Next;
 90     free (P);
 91     P = tmp;
 92   }
 93 }
 94
 95 Queue MakeEmpty (Queue Q)  {
 96   if ( Q != NULL)
 97     Delete (Q);
 98
 99   Q = malloc (sizeof (struct QueueNode));
100   if ( Q == NULL)  Error ("Out of memory.");
101   Q -> Next = NULL;
102   Q -> Rear = Q;
103   Q -> Front = Q->Next;
104   Q-> size = 0;
105   return Q;
106 }
107
108 int IsFull (Queue Q)  {
109   return Q->size == MAXSIZE;
110 }
111
112 int IsEmpty (Queue Q)  {
113   return Q->size == 0;
114 }
115
116 void EnQueue  (ElementType X, Queue Q)  {
117   if ( Q == NULL ) Error ("Out of space.");
118
119   Position tmp;
120   tmp = malloc (sizeof (struct QueueNode));
121   if (tmp == NULL)  Error ("Out of space,");
122
123   tmp -> data = X;
124   Q -> Rear -> Next = tmp;
125   Q -> Rear = tmp;
126   Q -> Rear -> Next = NULL;
127   Q -> Front = Q -> Next;
128   Q->size++;
129
130   if (Q -> size > MAXSIZE)  Error ("Too large.");
131
132 }
133
134 void DeQueue  (Queue Q)  {
135   if (IsEmpty(Q))  Error ("Empty Queue.");
136
137   Position tmp = Q -> Front;
138   Q -> Next = tmp -> Next;
139    free(tmp);
140   if (Q -> Front == Q->Rear)  { Q->Front = Q;}
141   else {   Q -> Front = Q->Next;  }
142   Q->size--;
143 }
144
145 ElementType FrontAndDequeue ( Queue Q)  {
146   ElementType X;
147   if (IsEmpty (Q))  Error ("Empty Queue.");
148
149   X = Q ->Front->data;
150   Position t = Q->Front;
151   Q -> Next = t-> Next;
152   if (Q -> Front == Q->Rear)  { Q->Front = Q;}
153   else {   Q -> Front = Q->Next;  }
154   free (t);
155   Q -> size--;
156
157   return X;
158 }
时间: 2024-12-19 02:14:47

算法(4)—— 队列的链表实现的相关文章

算法导论第十章 栈队列和链表

本章讲述的是基本的数据结构,如栈.队列和链表.这些都是最最基本的数据结构,具体的就不再啰嗦.然后本章也没有什么需要特别注意的点,哦,有一个小节:指针和对象的实现,可以认真看一下,大概就是用其他的实现方式来代替指针和对象的实现,因为有些语言不支持指针和对象数据类型,那在实现这种链式的数据结构就无法表示,本节介绍的方法就是利用数组和数组下标来构造对象和指针,说白了,就是利用数组来表示链式对象.个人感觉意义不大,权当了解得了. 结合一些常见的笔试面试题,我就用3个习题来总结这一章吧. 1.习题10.1

《啊哈算法》——栈、队列、链表

通过题目我们可以看出这篇文章将介绍什么,栈.队列.链表本质上是数据结构中的东西,通过这章的学习能够给今后数据结构的学习打下一点基础. 队列: 我们通过一个简单的谜题来引入队列的概念,给出一串9位的加密QQ号,对于这串数字,删除第一位数字,然后将第二位数字放到这串数字的最后.反复操作,直到这一串数字的所有数字都被删除.在这个过程中,按照数字删除先后顺序排列的9位数字的便是解密后的QQ号,请问解密后的QQ号是多少? 其实从数学原理的角度,这个问题并没有什么难度,非常好理解,但关键在于,如何通过程序来

FIFO 队列的链表和数组实现

FIFO (First-in, First-out,先进先出)队列:当执行delete操作时删除那些呆在队列中时间最长的元素. FIFO 队列是这样一个ADT,包含两个基本操作:插入(put)一个新的项.删除(get)一个最早插入的项. 一.FIFO队列的链表实现 FIFO 队列和下堆栈的区别在于新项的插入是在尾部,而不是在头部.因此实现程序要保存一个指向链表最后一个节点的尾指针tail ,因此当Put操作时,将tail 指针指向的next 指向新节点,然后更新tail指针,让它指向那个新的节点

洛谷P1160 队列安排 链表

洛谷P1160 队列安排   链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std

队列(二)——队列的链表实现方式

1.队列的单向链表的实现方法 return只可以返回一个值,单向循环链表来实现队列的时候可以只保留一个指针,因为保留rear指针能够很方便的表示出front指针,所以保留rear指针. 另外由于链表的第一个结点处理比较特殊,所以在初始化的时候需要单独处理.链表实现的队列思想也是第一个单元作为头结点,不存放数据,rear指针指向的总是尾结点(在循环链表中也就是头结点的上一个结点). 2.实现方法 用带表头的单向循环链表来实现 #include <stdio.h> #include <mal

009实现一个算法来删除单链表中的一个结点,只给出指向那个结点的指针(keep it up)

呵呵,这个题不能直接删除已知的结点,因为是单链表,不知道前驱,只知道 后继结点,直接删除会使链表断开.不过我们可以删除已知结点的后继结点, 把后继结点的值赋值给已知结点. #include <iostream> struct Node { int data; Node* next; }; bool removeNode(Node* vNode) { if (vNode == NULL || vNode->next == NULL) return false; Node* pNext =

实现一个算法从一个单链表中返回倒数第n个元素(keep it up)

我们维护两个指针, 它们之间的距离为n.然后,我将这两个指针同步地在这个单链表上移动,保持它们的距离 为n不变.那么, 当第二个指针指到空时,第一个指针即为所求. #include <iostream> struct Node { int data; Node* next; }; void initList(Node* vNode) { for (int i=0; i < 20; ++i) { Node* TempNode = new Node; TempNode->data =

数据结构之自建算法库——循环双链表

本文针对数据结构基础系列网络课程(2):线性表中第13课时循环链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:cdlinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef CDLINKLIST_H_INCLUDED #define CDLINKLIST_H_INCLUDED //循环双链表基本运算函数 typedef int E

数据结构之自建算法库——循环单链表

本文针对数据结构基础系列网络课程(2):线性表中第13课时双链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:clinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef CLINKLIST_H_INCLUDED #define CLINKLIST_H_INCLUDED //循环单链表基本运算函数 typedef int ElemT