小时候。我们做早操的时候或者军训的时候,都排成一列,有头有尾。如果你迟到了,仅仅能站到最后面一个。退场的时候。都是由第一个先走的。这就是队列雏形。

队列的定义

队列是一种特殊的线性表

队列仅在线性表的两端进行操作

队头(Front):取出数据元素的一端

队尾(Rear):插入数据元素的一端

队列不同意在中间部位进行操作!

队列实质上也就是线性表的一种特殊操作形式,在头部删除。获取,在尾部加入。

跟栈基本类似,换烫不换药。详细能够參考

栈的实现与操作(C语言实现) 

与栈一样,队列相同具备线性和链式两种结构。分别例如以下:

======================================================================================================

队列的线性形式:

队列的线性形式本质上就是顺序线性表,这里相同採用代码复用的方式,关于顺序线性表的代码就不贴了,详细能够參阅顺序线性表的实现及操作(C语言实现)  

头文件:

#ifndef _SEQQUEUE_H_
#define _SEQQUEUE_H_ typedef void SeqQueue; SeqQueue* SeqQueue_Create(int capacity); void SeqQueue_Destroy(SeqQueue* queue); void SeqQueue_Clear(SeqQueue* queue); int SeqQueue_Append(SeqQueue* queue, void* item); void* SeqQueue_Retrieve(SeqQueue* queue); void* SeqQueue_Header(SeqQueue* queue); int SeqQueue_Length(SeqQueue* queue); int SeqQueue_Capacity(SeqQueue* queue); #endif

源文件:

// 线性队列.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"
#include "SeqList.h"
#include "SeqQueue.h"
#include <stdlib.h> SeqQueue* SeqQueue_Create(int capacity)
{
return SeqList_Create(capacity);
} void SeqQueue_Destroy(SeqQueue* queue)
{
SeqList_Destroy(queue);
} void SeqQueue_Clear(SeqQueue* queue)
{
SeqList_Clear(queue);
} //在尾部插入
int SeqQueue_Append(SeqQueue* queue, void* item)
{
return SeqList_Insert(queue, item, SeqList_Length(queue));
} //删除头部
void* SeqQueue_Retrieve(SeqQueue* queue)
{
return SeqList_Delete(queue, 0);
} //获得头部
void* SeqQueue_Header(SeqQueue* queue)
{
return SeqList_Get(queue, 0);
} int SeqQueue_Length(SeqQueue* queue)
{
return SeqList_Length(queue);
} int SeqQueue_Capacity(SeqQueue* queue)
{
return SeqList_Capacity(queue);
} int _tmain(int argc, _TCHAR* argv[])
{
SeqQueue* queue = SeqQueue_Create(20);
int a[10] = {0};
int i = 0; for(i=0; i<10; i++)
{
a[i] = i + 1; SeqQueue_Append(queue, a + i);
} printf("Header: %d\n", *(int*)SeqQueue_Header(queue));
printf("Length: %d\n", SeqQueue_Length(queue));
printf("Capacity: %d\n", SeqQueue_Capacity(queue)); while( SeqQueue_Length(queue) > 0 )
{
printf("Retrieve: %d\n", *(int*)SeqQueue_Retrieve(queue));
} SeqQueue_Destroy(queue); system("pause");
return 0;
}

执行结果:

Header: 1
Length: 10
Capacity: 20
Retrieve: 1
Retrieve: 2
Retrieve: 3
Retrieve: 4
Retrieve: 5
Retrieve: 6
Retrieve: 7
Retrieve: 8
Retrieve: 9
Retrieve: 10
请按随意键继续. . .

======================================================================================

队列的链式实现:

相同。队列的链式实现本质上就是链式线性表,关于链表的代码请參阅:链表的实现与操作(C语言实现)

头文件:

#ifndef _LINKQUEUE_H_
#define _LINKQUEUE_H_ typedef void LinkQueue; LinkQueue* LinkQueue_Create(); void LinkQueue_Destroy(LinkQueue* queue); void LinkQueue_Clear(LinkQueue* queue); int LinkQueue_Append(LinkQueue* queue, void* item); void* LinkQueue_Retrieve(LinkQueue* queue); void* LinkQueue_Header(LinkQueue* queue); int LinkQueue_Length(LinkQueue* queue); #endif

源文件:

// 链式队列.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "LinkList.h"
#include "LinkQueue.h"
#include <malloc.h>
#include <stdlib.h> int _tmain(int argc, _TCHAR* argv[])
{ LinkQueue* queue = LinkQueue_Create();
int a[10] = {0};
int i = 0; for(i=0; i<10; i++)
{
a[i] = i + 1; LinkQueue_Append(queue, a + i);
} printf("Header: %d\n", *(int*)LinkQueue_Header(queue));
printf("Length: %d\n", LinkQueue_Length(queue)); while( LinkQueue_Length(queue) > 0 )
{
printf("Retrieve: %d\n", *(int*)LinkQueue_Retrieve(queue));
} LinkQueue_Destroy(queue); system("pause"); return 0;
} typedef struct _tag_LinkQueueNode
{
LinkListNode header;
void* item;
} TLinkQueueNode; LinkQueue* LinkQueue_Create()
{
return LinkList_Create();
} void LinkQueue_Destroy(LinkQueue* queue)
{
LinkQueue_Clear(queue);
LinkList_Destroy(queue);
} void LinkQueue_Clear(LinkQueue* queue) // O(n)
{
while( LinkQueue_Length(queue) > 0 )
{
LinkQueue_Retrieve(queue);
}
} //在尾部加入
int LinkQueue_Append(LinkQueue* queue, void* item)
{
TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));
int ret = (item != NULL) && (node != NULL); if( ret )
{
node->item = item; ret = LinkList_Insert(queue, (LinkListNode*)node, LinkList_Length(queue));
} if( !ret )
{
free(node);
} return ret;
} //删除头部
void* LinkQueue_Retrieve(LinkQueue* queue)
{
TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Delete(queue, 0);
void* ret = NULL; if( node != NULL )
{
ret = node->item; free(node);
} return ret;
} //获得头
void* LinkQueue_Header(LinkQueue* queue)
{
TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Get(queue, 0);
void* ret = NULL; if( node != NULL )
{
ret = node->item;
} return ret;
} int LinkQueue_Length(LinkQueue* queue)
{
return LinkList_Length(queue);
}

执行结果:

Header: 1
Length: 10
Retrieve: 1
Retrieve: 2
Retrieve: 3
Retrieve: 4
Retrieve: 5
Retrieve: 6
Retrieve: 7
Retrieve: 8
Retrieve: 9
Retrieve: 10
请按随意键继续. . .

如有错误。望不吝指出。

队列的定义与实现(C语言实现)的更多相关文章

  1. C在宏定义中使用的语言可变参数

    于C标准库的语言,printf.scanf.sscanf.sprintf.sscanf入输出函数,參数都是可变的.在调试程序时.我们可能希望定义一个參数可变的输出函数来记录日志,那么用可变參数的宏是一 ...

  2. 在源文件(.c)和头文件(.h)中声明和定义的区别——C语言

    最近在看多文件编程的时候遇到的一个问题,本来以为理解了声明和定义的区别(然而并没有····),也算是重新认识了一次声明和定义,下面上代码 情形一:在源文件(.c)中 相信大部分读者对声明和定义的理解是 ...

  3. 预定义宏,C语言预定义的宏详解

    1.预定义宏 对于预定义宏,相信大家并不陌生.为了方便处理一些有用的信息,预处理器定义了一些预处理标识符,也就是预定义宏.预定义宏的名称都是以"__"(两条下划线)开头和结尾的,如 ...

  4. makefile变量定义应用到c语言

    makefile是为组织程序工程的,其定义的宏怎样应用到c程序中呢? 我们知道Makefile中可定义变量或导出变量,make命令可定义变量:编译器(如gcc)可通过CFLAGS定义宏. 但如何才能使 ...

  5. 宏定义(无参宏定义和带参宏定义),C语言宏定义详解

    1.宏定义说明 宏定义是比较常用的预处理指令,即使用"标识符"来表示"替换列表"中的内容.标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏 ...

  6. 队列的链式实现(C语言)

    /* Queue.h */ #ifndef QUEUE_H_INCLUDED #define QUEUE_H_INCLUDED #include <stdio.h> #include &l ...

  7. 使用链表实现队列------《数据结构与算法分析-C语言描述》

    经过ubuntu的gcc验证 一.头文件 que_link.h #ifndef _QUE_LINK_H_ #define _QUE_LINK_H_ struct que_record; typedef ...

  8. 使用数组实现队列----《数据结构与算法分析---C语言描述》

    一.h文件:my_que.h #ifndef _MY_QUE_H_ #define _MY_QUE_H_ struct QueRecord; typedef struct QueRecord* que ...

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

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

随机推荐

  1. Migration data on SQL

    从表里面导出数据XML: -- export declare @xml xml set @xml = (select * from ( select TableName = 'Schema', xml ...

  2. spring jar包冲突

    在用Spring+Hibernate做项目时候遇到java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit 网上查得答案 环境 ...

  3. [Jobdu] 题目1517:链表中倒数第k个结点

    给出一个链表的头指针,要求找到倒数第k个节点,并输出这个节点的值 例子: 先看一个例子,链表为:1 2 3 4 5 6,倒数第2个节点就是5,倒数第一个节点就是6,以此类推.这里的链表有头节点,就是说 ...

  4. 5.4.1 RegExp实例属性

    RegExp的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息.        1.global:布尔值,表示是否设置了 g 标志.        2.ignoreCase:布尔值,表示 ...

  5. Android 学习开发笔记《Service 与 Thread 的区别 》

    很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下. 1). Thread:Thre ...

  6. 利用fitnesse实现api接口自动化测试

    上午在园子里乱逛,看了不少小伙伴们分享的接口测试方面的知识,仔细想想,我做接口测试也有几个年头了,大家所叙述到的一些经验或多或少,我也曾遇到过,突然意识到知识的点滴积累是多么的重要,我记得我最早接触接 ...

  7. https tomcat 证书搭建

    首先生成证书说明 keytool -genkey -alias castest -keyalg RSA -keystore c:/keys/caskey 先让输入密码,密码必须记住,下面会用到 其中“ ...

  8. 设置windows密码只存在NTLM-Hash下

    修改注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 下添加名为"NoLMHash"的DWORD值,并设置为1 ...

  9. c#第五次作业---正文提取

    1.正文文本 1.正文文本 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFC ...

  10. 禁用Visual Studio 2013的Browser Link功能

    禁用Visual Studio 2013的Browser Link功能 GET http://localhost:37478/7fd25f8af33f443494e765be19be6240/brow ...