队列的定义与实现(C语言实现)
小时候。我们做早操的时候或者军训的时候,都排成一列,有头有尾。如果你迟到了,仅仅能站到最后面一个。退场的时候。都是由第一个先走的。这就是队列雏形。
队列的定义
队列是一种特殊的线性表
队列仅在线性表的两端进行操作
队头(Front):取出数据元素的一端
队尾(Rear):插入数据元素的一端
队列不同意在中间部位进行操作!
队列实质上也就是线性表的一种特殊操作形式,在头部删除。获取,在尾部加入。
跟栈基本类似,换烫不换药。详细能够參考
与栈一样,队列相同具备线性和链式两种结构。分别例如以下:
======================================================================================================
队列的线性形式:
队列的线性形式本质上就是顺序线性表,这里相同採用代码复用的方式,关于顺序线性表的代码就不贴了,详细能够參阅顺序线性表的实现及操作(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语言实现)的更多相关文章
- C在宏定义中使用的语言可变参数
于C标准库的语言,printf.scanf.sscanf.sprintf.sscanf入输出函数,參数都是可变的.在调试程序时.我们可能希望定义一个參数可变的输出函数来记录日志,那么用可变參数的宏是一 ...
- 在源文件(.c)和头文件(.h)中声明和定义的区别——C语言
最近在看多文件编程的时候遇到的一个问题,本来以为理解了声明和定义的区别(然而并没有····),也算是重新认识了一次声明和定义,下面上代码 情形一:在源文件(.c)中 相信大部分读者对声明和定义的理解是 ...
- 预定义宏,C语言预定义的宏详解
1.预定义宏 对于预定义宏,相信大家并不陌生.为了方便处理一些有用的信息,预处理器定义了一些预处理标识符,也就是预定义宏.预定义宏的名称都是以"__"(两条下划线)开头和结尾的,如 ...
- makefile变量定义应用到c语言
makefile是为组织程序工程的,其定义的宏怎样应用到c程序中呢? 我们知道Makefile中可定义变量或导出变量,make命令可定义变量:编译器(如gcc)可通过CFLAGS定义宏. 但如何才能使 ...
- 宏定义(无参宏定义和带参宏定义),C语言宏定义详解
1.宏定义说明 宏定义是比较常用的预处理指令,即使用"标识符"来表示"替换列表"中的内容.标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏 ...
- 队列的链式实现(C语言)
/* Queue.h */ #ifndef QUEUE_H_INCLUDED #define QUEUE_H_INCLUDED #include <stdio.h> #include &l ...
- 使用链表实现队列------《数据结构与算法分析-C语言描述》
经过ubuntu的gcc验证 一.头文件 que_link.h #ifndef _QUE_LINK_H_ #define _QUE_LINK_H_ struct que_record; typedef ...
- 使用数组实现队列----《数据结构与算法分析---C语言描述》
一.h文件:my_que.h #ifndef _MY_QUE_H_ #define _MY_QUE_H_ struct QueRecord; typedef struct QueRecord* que ...
- 优化后队列的实现(C语言实现)
上一篇中的队列的定义与实现(C语言实现) 中.不管是顺序队列还是链式队列,在尾加和删除头部的操作时.总有一个时间复杂度让人不惬意. 比方在顺序队列中,删除头部的操作后,总要将后面全部的结点都向前移动一 ...
随机推荐
- DEV GridControl 小结(持续添加)
一.属性: 1.Views OptionsBehavior=>Editable:False 列表不可编辑 OptionsSelection=>EnableAppearanceFocuse ...
- Struts学习之值栈的理解
转自:http://blog.csdn.net/hanxuemin12345/article/details/38559979 页面一个请求发送过来,依次经过一系列拦截器(处理公共部分,如:往数据中心 ...
- jquery ajax 使用
异步刷新实现方式有多种,也可以借助JS的多种框架,下面是使用JQuery框架实现的AJAX 验证用户名是否存在 jQuery.ajax概述 HTTP 请求加载远程数据. 通过jQuery 底层 AJA ...
- perl5 第五章 文件读写
第五章 文件读写 by flamephoenix 一.打开.关闭文件二.读文件三.写文件四.判断文件状态五.命令行参数六.打开管道 一.打开.关闭文件 语法为open (filevar, file ...
- TableLayoutPanel 的使用
VS自带控件TableLayoutPanel的功能应用网上都有资料.下面是使用中的一些问题. 1.动态加载控件时使用SetRowSpan.SetColumnSpan方法会使得界面响应缓慢 解决方案: ...
- 首页 导航栏隐藏 下一级页面显示,pop回来遇到的问题
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationContr ...
- CF 191 div2
A.数据量很小,直接爆搞. #include <iostream> #include <cstdio> #include <algorithm> #include ...
- map的erase()释放内存
STL中的map调用erase(it),当value值为指针时,释放内存: #include <iostream> #include <map> #include <st ...
- 页面布局之BFC 微微有点坑
一.什么是BFC: 在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位 Box 是 CSS 布局的对象和基本单位, 直观点来说 ...
- ACE6.2.0下载HTTP服务器文件
#include "ace/Log_Msg.h" // ACE_DEBUG的宏定义在这里.#include "ace/OS.h"#include "a ...