【ADT】队列的基本C语言实现
queue.h
#ifndef _QUEUE_H_
#define _QUEUE_H_
#include <stdbool.h>
#define MAXQUEUE 10 // 定义队列类型
typedef int Item; // 队列的节点
typedef struct node
{
Item item;
struct node * next;
}Node; typedef struct queue
{
Node * front; // 记录队列的第一项
Node * rear; // 记录队列的最后一项
int items; // 记录项数
}Queue; void InitQueue(Queue * pq);
bool QueueIsFull(const Queue * pq);
bool QueueIsEmpty(const Queue * pq);
int QueueItemCount(const Queue * pq);
bool EnQueue(Item item, Queue * pq);
bool DeQueue(Item * pitem, Queue * pq);
void EmptyTheQueue(Queue * pq); #endif
use_q.c /*功能函数的实现*/
#include <stdio.h>
#include <stdlib.h>
#include "queue.h" static void CopyToNode(Item item, Node * pn) // 将内容复制到节点中
{
pn->item = item;
}
static void CopyToItem(Node * pn, Item * pi) //将一个项中的item内容复制给一个Item变量
{
*pi = pn->item;
} void InitQueue(Queue * pq) // 初始化队列
{
pq->front = pq->rear = NULL; // 将队列的首尾指针都初始化为NULL
pq->items = ;// 将项数初始化为0
}
bool QueueIsFull(const Queue * pq)
{
return pq->items == MAXQUEUE;
}
bool QueueIsEmpty(const Queue * pq)
{
return pq->items == ;
}
int QueueItemCount(const Queue * pq)
{
return pq->items;
}
bool EnQueue(Item item, Queue * pq) // 在队列最后添加项
{
Node * pnew; // 创建一个新的节点 if (QueueIsFull(pq))
return false;
pnew = (Node *)malloc(sizeof(Node)); // 为新节点申请空间
if (pnew == NULL)
{
fprintf(stderr, "Unable to allocate memory!\n");
exit(EXIT_FAILURE);
}
CopyToNode(item, pnew); // 把item内容复制到新节点中
pnew->next = NULL; // 将新节点的next成员置为NULL,以表明这是当前队列的最后一项
if (QueueIsEmpty(pq)) // 如果队列是空的,将新节点作为队列的头项
pq->front = pnew;
else // 否则将新节点的地址放在队列尾项的next成员中
pq->rear->next = pnew;
pq->rear = pnew; // 将新节点作为队列的尾项
pq->items++; return true;
} bool DeQueue(Item * pitem, Queue * pq)
{
Node * pt;
// 这里的 pitem 和 pt 都用来存放删除项的内容
if (QueueIsEmpty(pq))
return false;
// 将删除项的内容复制给临时指针中
CopyToItem(pq->front, pitem);
pt = pq->front; pq->front = pq->front->next;
free(pt);
pq->items--;
if (pq->items == ) // 在删除最后一项时,要将尾指针和头指针同时设为NULL。
pq->rear = NULL;
return true;
}
void EmptyTheQueue(Queue * pq)
{
Item dummy;
while (!QueueIsEmpty(pq))
DeQueue(&dummy, pq);
}
main.c /* 用户接口 */
#include <stdio.h>
#include "queue.h" int main(void)
{
Queue line;
Item temp;
char ch; InitQueue(&line);
puts("Testing the Queue interface.Type a to add a value,");
puts("type d to delete a value,and type q to quit.");
while ((ch = getchar()) != 'q')
{
if (ch != 'a'&&ch != 'd')
continue;
if (ch == 'a')
{
printf("Interger to add:");
scanf("%d", &temp);
if (!QueueIsFull(&line))
{
printf("Putting %d into queue\n", temp);
EnQueue(temp, &line);
}
else
puts("Queue is full!");
}
else
{
if (QueueIsEmpty(&line))
puts("Nothing to delete!");
else
{
DeQueue(&temp, &line);
printf("%Removing %d from queue\n", temp);
}
}
printf("%d items in queue\n", QueueItemCount(&line));
puts("Type a to add,d to delete,q to quit:");
}
EmptyTheQueue(&line);
puts("Bye!"); return ;
}
【ADT】队列的基本C语言实现的更多相关文章
- 优化后队列的实现(C语言实现)
上一篇中的队列的定义与实现(C语言实现) 中.不管是顺序队列还是链式队列,在尾加和删除头部的操作时.总有一个时间复杂度让人不惬意. 比方在顺序队列中,删除头部的操作后,总要将后面全部的结点都向前移动一 ...
- ADT队列/FIFO表
队列是一种特殊的表,只在表首进行删除,只在表尾进行插入,按照先进先出原则操作(First In First Out),又称为FIFO表: 队列的指针实现代码: #include<cstdio&g ...
- C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...
- C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...
- C语言数据结构-队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-队列的实现-C语言 //队列的存储结构 #define MAXSIZE 100 typedef struct { int* base; //基地址 int _front; //头指针 i ...
- 3.6 栈 ADT - 3.7 队列 ADT
3.6 栈 ADT 栈是限制插入和删除只能在一个位置上进行的表,叫做栈的顶部.对栈的基本操作有进栈和出栈,进栈在顶部插入元素,出栈删除最后插入的元素. 栈是一个表,因此任何实现表的方法都能实现栈.显然 ...
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
- rabbitmq学习(九) —— 关于消息队列的选型
转自http://cmsblogs.com/?p=3846 在IM这种讲究高并发.高消息吞吐的互联网场景下,MQ消息中间件是个很重要的基础设施,它在IM系统的服务端架构中担当消息中转.消息削峰.消息交 ...
- 用Python实现的数据结构与算法:队列
一.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操作在队首(front)进行. 二.ADT 队列ADT(抽象数据类型)一般提供以下接口: Qu ...
随机推荐
- 【.NET】Repeater控件简单的数据绑定(有bool,日期,序号)
前述: 讲的是Repeater,使用的是XML文件读取,没用ADO.NET ,而分页有很多方法,比如用PagedDataSource,或者通过参数在数据源写SQL语句来实现. 页面: <%@ I ...
- C# 实现客户端程序自动更新
看到一篇不错的帖子,可能以后会用到,果断收藏 文章来源 博客园jenry(云飞扬)http://www.cnblogs.com/jenry/archive/2006/08/15/477302.html ...
- ModelState.IsValid一直为false的原因
一,问题:ModelState.IsValid一直为false 二,解决方法和原因, 由于这个方法中传过来的RegisterForm模型的字段,某一个为空值,则会造成这个验证验证为false,去注释掉 ...
- java中的反编译
使用JD-GUI工具 支持mac os 和 windows 地址为:http://jd.benow.ca
- ajax中的stasus错误详解
一.英文版解析 0: (Uninitialized) the send( ) method has not yet been invoked. 1: (Loading) the send( ) met ...
- 【锋利的Jquery】读书笔记三
DOM操作 三个方面;DOM core html-dom css-dom 注意点: 删除事件中 三种删除节点的方法 remove detach empty remove不解释 de ...
- MSSQL2008 中文乱码问题 (引自ljg888的专栏)
PHP向MSSQL2008中写入数据,中文乱码 首先:查看SQLserver编码格式的SQL语句为: SELECT COLLATIONPROPERTY('Chinese_PRC_Stro ...
- flask安装首页显示
参考:http://flask.pocoo.org/1.安装和测试[root@node1 flask]#pip install flaskd[root@node1 flask]# cat app.py ...
- EFI、GPT和BIOS、MBR
用了数十年的PC机主板架构是BIOS模式.但在2004年,微软和英特尔共同推出一种名为可扩展固件接口(EFI)的主板升级换代方案.EFI,即可扩展固件接口(Extensible Firmware In ...
- 转:drupal使用superfish建立下拉菜单
参考地址:1. http://www.drupalla.com/project/superfish 2.http://drupalchina.cn/node/1798 但是按照这个做出来,我的主菜单和 ...