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语言实现的更多相关文章

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

    上一篇中的队列的定义与实现(C语言实现) 中.不管是顺序队列还是链式队列,在尾加和删除头部的操作时.总有一个时间复杂度让人不惬意. 比方在顺序队列中,删除头部的操作后,总要将后面全部的结点都向前移动一 ...

  2. ADT队列/FIFO表

    队列是一种特殊的表,只在表首进行删除,只在表尾进行插入,按照先进先出原则操作(First In First Out),又称为FIFO表: 队列的指针实现代码: #include<cstdio&g ...

  3. C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...

  4. C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...

  5. C语言数据结构-队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-队列的实现-C语言 //队列的存储结构 #define MAXSIZE 100 typedef struct { int* base; //基地址 int _front; //头指针 i ...

  6. 3.6 栈 ADT - 3.7 队列 ADT

    3.6 栈 ADT 栈是限制插入和删除只能在一个位置上进行的表,叫做栈的顶部.对栈的基本操作有进栈和出栈,进栈在顶部插入元素,出栈删除最后插入的元素. 栈是一个表,因此任何实现表的方法都能实现栈.显然 ...

  7. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  8. rabbitmq学习(九) —— 关于消息队列的选型

    转自http://cmsblogs.com/?p=3846 在IM这种讲究高并发.高消息吞吐的互联网场景下,MQ消息中间件是个很重要的基础设施,它在IM系统的服务端架构中担当消息中转.消息削峰.消息交 ...

  9. 用Python实现的数据结构与算法:队列

    一.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操作在队首(front)进行. 二.ADT 队列ADT(抽象数据类型)一般提供以下接口: Qu ...

随机推荐

  1. Chapter 2 Open Book——33

    My chin raised a fraction. 我的下巴抬起来了一点. 我略微抬起下颚. "No, she did not send me here. I sent myself.&q ...

  2. [Q]pdfFactory打印机纸张方向设置为横向

    不推荐更改pdfFactory打印机默认纸张方向(默认为横向),更改后可能导致不必要的麻烦(pdfFactory要求所定义的纸张方向与实际的纸张方向需一致,因此若更改为横向,则纸张宽度的定义需大于纸张 ...

  3. [SOJ] DAG?

    Description 输入一个有向图,判断该图是否是有向无环图(Directed Acyclic Graph). Input 输入的第一行包含两个整数n和m,n是图的顶点数,m是边数.1<=n ...

  4. C#代码篇:代码产生一个csv文件调用有两个核心的坑

    忙活了半天终于可以开工了,a物品到底要不要放进去取决于两个因素,第一是a有4kg重,只有背包大于等于4kg的时候才能装进去(也就是说当i=1,k<4时f[i,k]=0):第二是当背包的重量大于等 ...

  5. html 页面太长滚动时,固定页面菜单标签,或者导航标签的位置,fixed/stickUp the position

    有时你曾经需要把页面上的某些东西当页面太长发滚动的时候保留置顶位置显示,或许你有别的实现方式,我这个仅供参考, 源代码: /*global $, jQuery, alert*/ (function ( ...

  6. TCP和UDP报文分片的区别

    搞了三年网络,今天才知道这个细节,汗,总结下: MTU大家都知道,是链路层中的网络对数据帧的一个限制,依然以以太网为例,MTU为1500个字节.一个IP数据报在以太网中 传输,如果它的长度大于该MTU ...

  7. google浏览器图标显示不正常怎么办

    taskkill /f /im explorer.exe rem 清理系统图标缓存数据库 attrib -h -s -r "%userprofile%\AppData\Local\IconC ...

  8. open()的模块

    对文件操作流程: 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 mode can be: *  'r' 只读. * 'w' 写入,如果之前有就覆盖 * 'a' ...

  9. Android原生Cling演化的覆盖层

    package com.example.demotest; import android.content.Context; import android.graphics.Paint; import ...

  10. 2017-1-15-libubox analysis

    2017-1-15-libubox analysis libubox utils.h utils.h 提供了一些简单的实用工具函数.比如大小端转换,位图操作,编译器属性的封装,连续内存申请函数call ...