【ADT】队列的基本C语言实现

queue.h

 1 #ifndef _QUEUE_H_
 2 #define _QUEUE_H_
 3 #include <stdbool.h>
 4 #define MAXQUEUE 10
 5
 6 // 定义队列类型
 7 typedef int Item;
 8
 9 // 队列的节点
10 typedef struct node
11 {
12     Item item;
13     struct node * next;
14 }Node;
15
16 typedef struct queue
17 {
18     Node * front; // 记录队列的第一项
19     Node * rear; // 记录队列的最后一项
20     int items; // 记录项数
21 }Queue;
22
23 void InitQueue(Queue * pq);
24 bool QueueIsFull(const Queue * pq);
25 bool QueueIsEmpty(const Queue * pq);
26 int QueueItemCount(const Queue * pq);
27 bool EnQueue(Item item, Queue * pq);
28 bool DeQueue(Item * pitem, Queue * pq);
29 void EmptyTheQueue(Queue * pq);
30
31 #endif

use_q.c /*功能函数的实现*/

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include "queue.h"
 4
 5 static void CopyToNode(Item item, Node * pn) // 将内容复制到节点中
 6 {
 7     pn->item = item;
 8 }
 9 static void CopyToItem(Node * pn, Item * pi) //将一个项中的item内容复制给一个Item变量
10 {
11     *pi = pn->item;
12 }
13
14 void InitQueue(Queue * pq) // 初始化队列
15 {
16     pq->front = pq->rear = NULL; // 将队列的首尾指针都初始化为NULL
17     pq->items = 0;// 将项数初始化为0
18 }
19 bool QueueIsFull(const Queue * pq)
20 {
21     return pq->items == MAXQUEUE;
22 }
23 bool QueueIsEmpty(const Queue * pq)
24 {
25     return pq->items == 0;
26 }
27 int QueueItemCount(const Queue * pq)
28 {
29     return pq->items;
30 }
31 bool EnQueue(Item item, Queue * pq) // 在队列最后添加项
32 {
33     Node * pnew; // 创建一个新的节点
34
35     if (QueueIsFull(pq))
36         return false;
37     pnew = (Node *)malloc(sizeof(Node)); // 为新节点申请空间
38     if (pnew == NULL)
39     {
40         fprintf(stderr, "Unable to allocate memory!\n");
41         exit(EXIT_FAILURE);
42     }
43     CopyToNode(item, pnew); // 把item内容复制到新节点中
44     pnew->next = NULL; // 将新节点的next成员置为NULL,以表明这是当前队列的最后一项
45     if (QueueIsEmpty(pq)) // 如果队列是空的,将新节点作为队列的头项
46         pq->front = pnew;
47     else // 否则将新节点的地址放在队列尾项的next成员中
48         pq->rear->next = pnew;
49     pq->rear = pnew; // 将新节点作为队列的尾项
50     pq->items++;
51
52     return true;
53 }
54
55 bool DeQueue(Item * pitem, Queue * pq)
56 {
57     Node * pt;
58     // 这里的 pitem 和 pt 都用来存放删除项的内容
59     if (QueueIsEmpty(pq))
60         return false;
61     // 将删除项的内容复制给临时指针中
62     CopyToItem(pq->front, pitem);
63     pt = pq->front;
64
65     pq->front = pq->front->next;
66     free(pt);
67     pq->items--;
68     if (pq->items == 0) // 在删除最后一项时,要将尾指针和头指针同时设为NULL。
69         pq->rear = NULL;
70     return true;
71 }
72 void EmptyTheQueue(Queue * pq)
73 {
74     Item dummy;
75     while (!QueueIsEmpty(pq))
76         DeQueue(&dummy, pq);
77 }

main.c /* 用户接口 */

 1 #include <stdio.h>
 2 #include "queue.h"
 3
 4 int main(void)
 5 {
 6     Queue line;
 7     Item temp;
 8     char ch;
 9
10     InitQueue(&line);
11     puts("Testing the Queue interface.Type a to add a value,");
12     puts("type d to delete a value,and type q to quit.");
13     while ((ch = getchar()) != ‘q‘)
14     {
15         if (ch != ‘a‘&&ch != ‘d‘)
16             continue;
17         if (ch == ‘a‘)
18         {
19             printf("Interger to add:");
20             scanf("%d", &temp);
21             if (!QueueIsFull(&line))
22             {
23                 printf("Putting %d into queue\n", temp);
24                 EnQueue(temp, &line);
25             }
26             else
27                 puts("Queue is full!");
28         }
29         else
30         {
31             if (QueueIsEmpty(&line))
32                 puts("Nothing to delete!");
33             else
34             {
35                 DeQueue(&temp, &line);
36                 printf("%Removing %d from queue\n", temp);
37             }
38         }
39         printf("%d items in queue\n", QueueItemCount(&line));
40         puts("Type a to add,d to delete,q to quit:");
41     }
42     EmptyTheQueue(&line);
43     puts("Bye!");
44
45     return 0;
46 }
时间: 2024-12-15 07:09:20

【ADT】队列的基本C语言实现的相关文章

优化后队列的实现(C语言实现)

上一篇中的队列的定义与实现(C语言实现) 中,无论是顺序队列还是链式队列,在尾加和删除头部的操作时,总有一个时间复杂度让人不满意.比如在顺序队列中,删除头部的操作后,总要将后面所有的结点都向前移动一位,这里消耗的较大的:又如在在链式队列中,尾加结点时,为了寻找到最后一位结点,要遍历整个队列,时间复杂度同样是O(n). 为此,这里需要做出一些改变.其中严蔚敏老师的数据结构书中就是这么干的. 循序队列的优化方案: 定义front使其始终代表队头的下标  出队时将队头元素返回,且 且front++

探究一种定长队列操作(C语言版本)

一 问题来源:南京烽火通信面试 二 问题: 现有一种定长队列,长度为2的n次方,此队列可被多线程访问,但必须确保线程级安全,即在任意时刻,队列的长度保持不变. 三 笔者分析 1. 队列的存储结构--链式和顺序均可. 2. 长度为2的n次方--便于移动队头和队尾指针,假设队列长度为size,那么rear = (rear + 1) & (size - 1),&运算比算术求模运算效率高.为此,笔者使用了顺序队列. 3. 怎么确保线程级安全 笔者认为此系统一定同时存在多个读者和写者,读者是读取队头

队列的顺序存储结构(循环队列)(C语言实现)

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define OK 1 5 #define ERR 2 6 #define TRUE 1 7 #define FALSE 0 8 #define MAXSIZE 4 //定义队列的最大长度 9 10 typedef int status; //定义函数返回的状态,OK & ERR 11 typedef char datatype; //定义队列中每个元素的数据类型,这里暂定为字符

利用栈实现队列(C语言实现)

在上一篇优化后队列的实现(C语言实现)  中,虽然我们对队列的时间复杂度进行了优化,但是却让代码的可读性变差了,代码显得略微臃肿(当然,这些话你看看就好,主要是为了奉承这篇博文的). 这里主要实现的是:利用栈来实现队列 基本思路: 1,创建两个栈 2,两个栈合并起来组装成一个队列,分别取名为instack,outstack,用于进队列,出队列 3,比如有1,2,3,4,5 需要进入队列,先将这一串数压入instack栈中,假设压入顺序为1,2,3,4,5(1为栈底),再将instack中的数据移

队列queue

队列是一种特殊的线性表 队列仅在线性表的两端进行操作 队头(Front):取出数据元素的一端 队尾(Rear):插入数据元素的一端 队列不允许在中间部位进行操作! queue常用操作 销毁队列 清空队列 进队列 出队列 获取队头元素 获取队列的长度 C语言描述=====>队列的设计与实现  人生财富库积累 #ifndef _MY_QUEUE_H_ #define _MY_QUEUE_H_ typedef void Queue; Queue* Queue_Create(); void Queue_

数据结构之队列【转】

转自http://www.cnblogs.com/kaituorensheng/archive/2013/02/28/2937865.html 队列特性:先进先出(FIFO)——先进队列的元素先出队列.来源于我们生活中的队列(先排队的先办完事). 队列有下面几个操作: InitQueue() ——初始化队列 EnQueue()        ——进队列 DeQueue()        ——出队列 IsQueueEmpty()——判断队列是否为空 IsQueueFull()    ——判断队列是

【数据结构】队列的基本概念

1. 队列的定义 (1) 定义 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. (2) 抽象数据类型 ADT 队列(Queue)Data 同线性表.元素具有相同的类型,相邻元素具有前驱和后继关系.Operation InitQueue(*Q):初始化操作,建立一个空队列Q: DestoryQueue(*Q):若队列Q存在,则销毁它: ClearQueue(*Q):将队列Q清空: QueueEmpty(Q):若队列Q为空,返回true,否则返回false: GetH

09.循环队列与链队列

一.队列与循环队列 1.队列 (1)队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.队列是一种先进先出(Fiirst In First Out)的线性表,简称FIFO.允许插入的一端称为队尾,允许删除的一端称为队头. 从队列的定义可知,队列的入队操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为O(1).队列的删除操作,与栈不同的是,队列元素的出列是在队头,即小标为0的位置,若要删除一个元素的话,需要移动队列的所有元素,因此事件复杂度为O(n).

数据结构看书笔记(四)--栈与队列

栈与队列 栈是限定尽在表尾进行插入和删除操作的线性表  队列是只允许在一端进行插入操作.而在另一端进行删除操作的线性表栈的定义: 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表 其中允许插入的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈.栈又称为先进后出(Last In First Out)的线性表,简称为LIFO结构. 特殊之处在与限制了这个线性表的插入和删除位置只能是在栈顶.  栈的插入操作,叫做进栈,也称为压栈.入栈. 栈的删除操作,叫做出