博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一步一步学数据结构之1--1(队列--单链表实现--含队头尾指针)
阅读量:6414 次
发布时间:2019-06-23

本文共 3153 字,大约阅读时间需要 10 分钟。

 

        在前面,相信大家也已经感觉到,如果用单链表实现队列,不含队头队尾指针,每次入队操作都要遍历单链表,所以极不方便。那么在这里,就给大家介绍下含有队头队尾指针的队列(单链表实现)。

 

        如图

 

 

 

        这里介绍双向链表的常用操作:

 

l 创建队列

l 销毁队列

l 清空队列

l 入队

l 出队

l 返回队首元素

l 返回队的大小

 

 

   代码总分为三个文件:

LinkQueue.h : 放置功能函数的声明,以及表的声明 

LinkQueue.c : 放置功能函数的定义,以及表的定义,表结点的定义

Main.c     : 主函数,使用功能函数完成各种需求,一般用作测试

 

   整体结构图为:

 

 

   这里详细说下入队操作,出队操作和返回队首元素操作:

 

入队操作:

 

 如图:

  

出队操作:

 

 如图:

 

返回队首元素:

 

如图:

 

 

 

OK! 上代码:

 

LinkQueue.h : 

#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

 

LinkQueue.c : 

#include 
#include
#include "LinkQueue.h"typedef struct _tag_LinkQueueNode TLinkQueueNode;struct _tag_LinkQueueNode{ TLinkQueueNode* next; void* item; };typedef struct _tag_LinkQueue{ TLinkQueueNode* front; TLinkQueueNode* rear; int length; }TLinkQueue;LinkQueue* LinkQueue_Create(){ TLinkQueue* ret = (TLinkQueue*)malloc(sizeof(TLinkQueue)); if(NULL != ret) { ret->front = NULL; ret->rear = NULL; ret->length= 0; } return ret;}void LinkQueue_Destroy(LinkQueue* queue){ LinkQueue_Clear(queue); free(queue);}void LinkQueue_Clear(LinkQueue* queue){ while(LinkQueue_Length(queue) > 0) { LinkQueue_Retrieve(queue); }}int LinkQueue_Append(LinkQueue* queue, void* item){ TLinkQueue* sQueue = (TLinkQueue*)queue; TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode)); int ret = (NULL!=sQueue) && (NULL!=item) && (NULL!=node); if(ret) { node->item = item; if(0 < sQueue->length) { sQueue->rear->next = node; sQueue->rear = node; node->next = NULL; } else { sQueue->front = node; sQueue->rear = node; node->next = NULL; } sQueue->length++; } if(!ret) { free(node); } return ret;}void* LinkQueue_Retrieve(LinkQueue* queue){ TLinkQueue* sQueue = (TLinkQueue*)queue; TLinkQueueNode* node = NULL; void* ret = NULL; if((NULL != sQueue) && (0 < sQueue->length)) { node = sQueue->front; sQueue->front = node->next; ret = node->item; free(node); sQueue->length--; if(0 == sQueue->length) { sQueue->front = NULL; sQueue->rear = NULL; } } return ret;}void* LinkQueue_Header(LinkQueue* queue){ TLinkQueue* sQueue = (TLinkQueue*)queue; void* ret = NULL; if((NULL!=sQueue)&&(0
length)) { ret = sQueue->front->item; } return ret;}int LinkQueue_Length(LinkQueue* queue){ TLinkQueue* sQueue = (TLinkQueue*)queue; int ret = -1; if(NULL != sQueue) { ret = sQueue->length; } return ret;}

 

Main.c     :

 

#include 
#include
#include "LinkQueue.h"int main(void){ LinkQueue* queue = LinkQueue_Create(); int a[10]; 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\n", LinkQueue_Length(queue)); //LinkQueue_Clear(queue); while(LinkQueue_Length(queue) > 0) { printf("Retrieve: %d\n", *(int*)LinkQueue_Retrieve(queue)); } LinkQueue_Destroy(queue); return 0;}

 

你可能感兴趣的文章
重构之美-走在Web标准化设计的路上[复杂表单]3 9 Update
查看>>
linux中的优先搜索树的实现--prio_tree【转】
查看>>
转载: 打造自己的asp.net验证控件
查看>>
重构之美-跨越Web标准,触碰语义网[开门见山:Microformat]
查看>>
git入门与实践【转】
查看>>
WPF 虚拟键盘
查看>>
储存卡无法打开专家教您怎么数据恢复
查看>>
彼得原理
查看>>
如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库...
查看>>
[20171113]修改表结构删除列相关问题3.txt
查看>>
特征选择
查看>>
在Winform程序中设置管理员权限及为用户组添加写入权限
查看>>
RTMP直播到FMS中的AAC音频直播
查看>>
多能互补提速 加快我国能源转型和现代能源体系建设
查看>>
《JavaScript设计模式》——2.5 多种调用方式——多态
查看>>
Redis开发运维实践高可用和集群架构与实践(二)
查看>>
程序员的常见“谎话”:对,这是一个已知 Bug
查看>>
如何侦查SQL执行状态
查看>>
CentOS 7 命令行如何连接无线网络
查看>>
Ubuntu 12.04上享用新版本Linux的功能
查看>>