队列的链式存储结构设计与实现
1、概念
队列也是一种特殊的线性表;可以用线性表的链式存储来模拟队列的链式存储。
2、实现
(1)linkqueue.h
#ifndef _MY_LINKQUEUE_H_ #define _MY_LINKQUEUE_H_ typedef void LinkQueue; LinkQueue* LinkQueue_Create(); void LinkQueue_Destory(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
(2)linkqueue.c(linklist.h链接)
#include <stdlib.h> #include <stdio.h> #include <string.h> #include "linkqueue.h" #include "linklist.h" //队列是特殊的线性表 //队列的业务结点的数据结构 typedef struct _tag_LinkQueueNode { LinkListNode node; void* item; }TLinkQueueNode; //创建链式存储的队列 相当于 创建链式存储的线性表 LinkQueue* LinkQueue_Create() { return LinkList_Create(); } //销毁队列 相当于 销毁线性表 //涉及结点的内存管理 void LinkQueue_Destory(LinkQueue* queue) { LinkQueue_Clear(queue); LinkList_Destory(queue); } //清空队列 相当于 清空线性表 //涉及结点的内存管理,需要释放每一个结点 void LinkQueue_Clear(LinkQueue* queue) { while (LinkQueue_Length(queue) > 0) { LinkQueue_Retrieve(queue); } LinkList_Clear(queue); } //向队列中添加元素 相当于 向线性表尾部添加元素 int LinkQueue_Append(LinkQueue* queue, void* item) { int ret = 0; TLinkQueueNode *tmp = NULL; tmp = (TLinkQueueNode *)malloc(sizeof(TLinkQueueNode)); if (tmp == NULL) { ret = -1; printf("func LinkQueue_Append() malloc() err:%d\n", ret); return ret; } memset(tmp, 0, sizeof(TLinkQueueNode)); tmp->item = item; //需要把栈的item(栈的业务结点) 转化成 链表的业务结点LinkListNode ret = LinkList_Insert(queue, (LinkListNode*)tmp, LinkList_Length(queue)); if (ret != 0) { printf("func LinkList_Insert() err:%d\n", ret); if (tmp != NULL) { free(tmp); } return ret; } return ret; } //从队列中删除元素 相当于 从线性表的头部删除元素 void* LinkQueue_Retrieve(LinkQueue* queue) { TLinkQueueNode *tmp = NULL; void *ret = NULL;//队列的业务结点 tmp = (TLinkQueueNode *)LinkList_Delete(queue, 0); if (tmp == NULL) { printf("func LinkQueue_Retrieve() LinkList_Delete() err!\n"); return NULL; } //删除之前先缓存 ret = tmp->item; if (ret != NULL) { free(tmp); } return ret; } //获取队列头部元素 相当于 从线性表的0号位置拿数据 void* LinkQueue_Header(LinkQueue* queue) { TLinkQueueNode *tmp = NULL; tmp = (TLinkQueueNode *)LinkList_Get(queue, 0); if (tmp == NULL) { printf("func LinkQueue_Header() LinkList_Get() err!"); return NULL; } return tmp->item; } //求队列的长度 相当于 求线性表的长度 int LinkQueue_Length(LinkQueue* queue) { return LinkList_Length(queue); }
(3)具体实现
#include <stdlib.h> #include <stdio.h> #include <string.h> #include "linkqueue.h" void maindm009() { int ret = 0; int a[10]; //创建队列 LinkQueue* queue = NULL; queue = LinkQueue_Create(); if (queue == NULL) { ret = -1; printf("func LinkQueue_Create() err:%d\n", ret); return ; } //插入元素 printf("The Queue is: "); for (int i = 0; i < 5; i++) { a[i] = i + 1; ret = LinkQueue_Append(queue, &a[i]); printf("%d ", ret); } printf("\n"); //打印队列长度 printf("The Queue's Length:%d\n", LinkQueue_Length(queue)); //打印队列对头元素 printf("The Queue's Header:%d\n", *((int*)LinkQueue_Header(queue))); //出队列 while (LinkQueue_Length(queue) > 0) { int tmp = *((int *)LinkQueue_Retrieve(queue)); printf("tmp:%d ", tmp); } printf("\n"); //销毁队列 LinkQueue_Destory(queue); system("pause"); return; }