队列是常用的数据结构之一,下面给出一个链式队列的实现:

头文件Queue.h

 #ifndef Queue_H
#define Queue_H typedef int Item;
typedef struct node * PNode;
typedef struct node
{
Item data;
PNode next;
}Node; typedef struct
{
PNode front;
PNode rear;
int size;
}Queue; /*构造一个空队列*/
Queue *InitQueue(); /*销毁一个队列*/
void DestroyQueue(Queue *pqueue); /*清空一个队列*/
void ClearQueue(Queue *pqueue); /*判断队列是否为空*/
int IsEmpty(Queue *pqueue); /*返回队列大小*/
int GetSize(Queue *pqueue); /*返回队头元素*/
PNode GetFront(Queue *pqueue,Item *pitem); /*返回队尾元素*/
PNode GetRear(Queue *pqueue,Item *pitem); /*将新元素入队*/
PNode EnQueue(Queue *pqueue,Item item); /*队头元素出队*/
PNode DeQueue(Queue *pqueue,Item *pitem); /*遍历队列并对各数据项调用visit函数*/
void QueueTraverse(Queue *pqueue,void (*visit)()); #endif

实现代码Queue.c如下:

 #include"Queue.h"
#include<malloc.h>
#include<stdio.h> /*构造一个空队列*/
Queue *InitQueue()
{
Queue *pqueue = (Queue *)malloc(sizeof(Queue));
if(pqueue!=NULL)
{
pqueue->front = NULL;
pqueue->rear = NULL;
pqueue->size = ;
}
return pqueue;
} /*销毁一个队列*/
void DestroyQueue(Queue *pqueue)
{
if(IsEmpty(pqueue)!=)
ClearQueue(pqueue);
free(pqueue);
} /*清空一个队列*/
void ClearQueue(Queue *pqueue)
{
while(IsEmpty(pqueue)!=)
{
DeQueue(pqueue,NULL);
} } /*判断队列是否为空*/
int IsEmpty(Queue *pqueue)
{
if(pqueue->front==NULL&&pqueue->rear==NULL&&pqueue->size==)
return ;
else
return ;
} /*返回队列大小*/
int GetSize(Queue *pqueue)
{
return pqueue->size;
} /*返回队头元素*/
PNode GetFront(Queue *pqueue,Item *pitem)
{
if(IsEmpty(pqueue)!=&&pitem!=NULL)
{
*pitem = pqueue->front->data;
}
return pqueue->front;
} /*返回队尾元素*/ PNode GetRear(Queue *pqueue,Item *pitem)
{
if(IsEmpty(pqueue)!=&&pitem!=NULL)
{
*pitem = pqueue->rear->data;
}
return pqueue->rear;
} /*将新元素入队*/
PNode EnQueue(Queue *pqueue,Item item)
{
PNode pnode = (PNode)malloc(sizeof(Node));
if(pnode != NULL)
{
pnode->data = item;
pnode->next = NULL; if(IsEmpty(pqueue))
{
pqueue->front = pnode;
}
else
{
pqueue->rear->next = pnode;
}
pqueue->rear = pnode;
pqueue->size++;
}
return pnode;
} /*队头元素出队*/
PNode DeQueue(Queue *pqueue,Item *pitem)
{
PNode pnode = pqueue->front;
if(IsEmpty(pqueue)!=&&pnode!=NULL)
{
if(pitem!=NULL)
*pitem = pnode->data;
pqueue->size--;
pqueue->front = pnode->next;
free(pnode);
if(pqueue->size==)
pqueue->rear = NULL;
}
return pqueue->front;
} /*遍历队列并对各数据项调用visit函数*/
void QueueTraverse(Queue *pqueue,void (*visit)())
{
PNode pnode = pqueue->front;
int i = pqueue->size;
while(i--)
{
visit(pnode->data);
pnode = pnode->next;
} }

简单测试程序Test.c:

 #include"Queue.h"
#include<stdio.h>
void print(Item i)
{
printf("该节点元素为%d\n",i);
}
main()
{
Queue *pq = InitQueue();
int i,item;
printf("0-9依次入队并输出如下:\n");
for(i=;i<;i++)
{
EnQueue(pq,i);
GetRear(pq,&item);
printf("%d ",item);
} printf("\n从队头到队尾遍历并对每个元素执行print函数:\n");
QueueTraverse(pq,print); printf("队列中元素依次出队列并输出如下:\n");
for(i=;i<;i++)
{
DeQueue(pq,&item);
printf("%d ",item);
}
ClearQueue(pq);
if(IsEmpty(pq))
printf("\n将队列置空成功\n");
DestroyQueue(pq);
printf("队列已被销毁\n");
}

C语言队列的实现的更多相关文章

  1. C语言 队列 链式结构 实现

    一个C语言链式结构实现的队列 mQueue (GCC编译). /** * @brief C语言实现的链式队列 * @author wid * @date 2013-10-31 * * @note 若代 ...

  2. C语言 队列 顺序结构 实现

    一个能够自动扩容的顺序结构的队列 ArrQueue (GCC编译). /** * @brief C语言顺序结构队列的实现 * @author wid * @date 2013-10-30 * * @n ...

  3. [数据结构]C语言队列的实现

    我个人把链表.队列.栈分为一类,然后图.树分为一类.(串不考虑),分类的理由就是每一类有规律可循,即你能通过修改极少数的代码把链表变成队列.栈.(这里我们不考虑其他诸如设计模式等因素),因此本贴在讲完 ...

  4. C语言队列(数组内核)

    #include <stdio.h>#include <stdbool.h>#include <stdlib.h>struct Queue{ int *pBase; ...

  5. GO 语言队列实现

    队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的t(First In First Out)的线性表,简称FIFO.允许插入的一端为队尾,允许删除的一 ...

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

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

  7. InfoQ 趋势报告:架构和设计领域技术演变详解

    https://www.infoq.cn/article/R7lWXd0R4VFf3E0bB*38 本文概述了我们对当前“架构和设计”领域的看法,这个领域侧重于基础设施模式.技术框架模式的实现,以及软 ...

  8. 二级C复习

    二级C语言 队列 计算队列中元素个数 种 : rear > front ,直接减 第二种: rear < front 上面两种综合一起,求元素个数公式 :(r - f + maxsize) ...

  9. 数据结构(c语言第2版)-----了解链表,栈,队列,串

    关于链表我觉得这都是最基本的东西,但是不常见,在实际的应用中很少的使用,了解它会用就OK,不需要研究的那么深,除非做那种内存压缩,存储方面工作. C语言中动态申请空间 malloc() q=(dlin ...

随机推荐

  1. R基础

    R的对象类型包括数值型(numeric),复数型(complex),逻辑型(logical),字符型(character)和原味型(raw),列表(list)递归结构:函数(function)和表达式 ...

  2. T-SQL索引

    索引 使用索引可以提高查询速度,不是越多越好,会损耗存储空间.应用于出现在where子句中的列建立索引.可以使用sql server 内置工具Profiler捕捉在SQL Server实例上执行的活动 ...

  3. asp.net访问母版页控件方法

    一.使用多种方式为内容页加载母版页默认情况下是给单个内容页指定一个母版页加载,当多个内容页需加载到同一个母版页时,我们可以通过配置文件为多个内容页批量加载母版页,另外,还可以在PreInit事件中动态 ...

  4. js糟粕

    正在看<javascript语言精粹>,遇到明显的特点就记录下来,以防看了白看(噗噗~) 为了不误导,形成错误印象,文中 ‘错误设计‘ 写成 ‘现有设计’,’正确设计‘ 写成 ’期待设计‘ ...

  5. HDU 1021 - Fibonacci Again

    找规律,分析让 F[N] 每一项对 3 取余的余数: 1,2,0, 2,2,1,0, 1,1,2,0, 2,2,1,0, 1,1,2,0, 2,2,1,0 ......... 显然循环了 #inclu ...

  6. Basic Calculator,Basic Calculator II

    一.Basic Calculator Total Accepted: 18480 Total Submissions: 94750 Difficulty: Medium Implement a bas ...

  7. web app变革之rem(转载)

    rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了.但是我对rem综合评价是用来做web app它绝对是最合适的人选之一. ...

  8. php 日期 - 计算2个日期的差值

    /** * 日期-计算2个日期的差值 * @return int */ public function get_difference($date, $new_date) { $date = strto ...

  9. struts2笔记09-动态方法调用

    1.action配置 <action name="testDynamic" class="com.test.actions.TestAction"> ...

  10. 【转】Python中执行cmd的三种方式

    原文链接:http://blog.csdn.net/menglei8625/article/details/7494094 目前我使用到的python中执行cmd的方式有三种: 1. 使用os.sys ...