数据结构-队列1
来源:互联网 发布:淘宝怎么看旺旺号 编辑:程序博客网 时间:2024/05/20 15:11
定义:队列是一种特殊的线性表,队列仅在线性表的两端进行操作
队头(Front) : 取出数据元素的一端
队尾(Rear) : 插入数据元素的一端
队列不允许在中间部位进行操作 !
性质:先进先出( (FIFO FIFO) )
操作:
创建队列
销毁队列
清空队列
进队列
出队列
获取队头元素
获取队列的长度
两种实现方式:
1.顺序存储实现
2.链式存储实现
先写下顺序存储实现的代码
首先是链式线性表的实现,由于之前的博客已经多次写到该是实现原理及代码就直接贴代码了
头文件LinkList.h
#ifndef _LINKLIST_H_#define _LINKLIST_H_typedef void LinkList;typedef struct _tag_LinkListNode LinkListNode;struct _tag_LinkListNode{ LinkListNode* next;};LinkList* LinkList_Create();void LinkList_Destroy(LinkList* list);void LinkList_Clear(LinkList* list);int LinkList_Length(LinkList* list);int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);LinkListNode* LinkList_Get(LinkList* list, int pos);LinkListNode* LinkList_Delete(LinkList* list, int pos);#endif实现文件LinkList.c
#include <stdio.h>#include <malloc.h>#include "LinkList.h"typedef struct _tag_LinkList{ LinkListNode header; int length;} TLinkList;LinkList* LinkList_Create() // O(1){ TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList)); if( ret != NULL ) { ret->length = 0; ret->header.next = NULL; } return ret;}void LinkList_Destroy(LinkList* list) // O(1){ free(list);}void LinkList_Clear(LinkList* list) // O(1){ TLinkList* sList = (TLinkList*)list; if( sList != NULL ) { sList->length = 0; sList->header.next = NULL; }}int LinkList_Length(LinkList* list) // O(1){ TLinkList* sList = (TLinkList*)list; int ret = -1; if( sList != NULL ) { ret = sList->length; } return ret;}int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) // O(n){ TLinkList* sList = (TLinkList*)list; int ret = (sList != NULL) && (pos >= 0) && (node != NULL); int i = 0; if( ret ) { LinkListNode* current = (LinkListNode*)sList; for(i=0; (i<pos) && (current->next != NULL); i++) { current = current->next; } node->next = current->next; current->next = node; sList->length++; } return ret;}LinkListNode* LinkList_Get(LinkList* list, int pos) // O(n){ TLinkList* sList = (TLinkList*)list; LinkListNode* ret = NULL; int i = 0; if( (sList != NULL) && (0 <= pos) && (pos < sList->length) ) { LinkListNode* current = (LinkListNode*)sList; for(i=0; i<pos; i++) { current = current->next; } ret = current->next; } return ret;}LinkListNode* LinkList_Delete(LinkList* list, int pos) // O(n){ TLinkList* sList = (TLinkList*)list; LinkListNode* ret = NULL; int i = 0; if( (sList != NULL) && (0 <= pos) && (pos < sList->length) ) { LinkListNode* current = (LinkListNode*)sList; for(i=0; i<pos; i++) { current = current->next; } ret = current->next; current->next = ret->next; sList->length--; } return ret;}队列的头文件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 <malloc.h>#include "LinkList.h"#include "LinkQueue.h"typedef struct _tag_LinkQueueNode{ LinkListNode header; void* item;} TLinkQueueNode;LinkQueue* LinkQueue_Create() // O(1){ return LinkList_Create();}void LinkQueue_Destroy(LinkQueue* queue) // O(n){ 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) // O(n){ 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) // O(1){ 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) // O(1){ TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Get(queue, 0); void* ret = NULL; if( node != NULL ) { ret = node->item; } return ret;}int LinkQueue_Length(LinkQueue* queue) // O(1){ return LinkList_Length(queue);}测试文件main.c:
#include <stdio.h>#include <stdlib.h>#include "LinkQueue.h"/* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char *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); return 0;}
运行结果:
0 0
- 数据结构-队列1
- 数据结构--单链表实现队列1
- 数据结构(1)队列(C语言版)
- 数据结构---队列
- 数据结构--队列
- 数据结构队列
- 数据结构---队列
- 数据结构(队列)
- 数据结构-队列
- 数据结构---->队列
- 数据结构---队列
- 【数据结构】队列
- 数据结构--队列
- 【数据结构】 队列
- 数据结构 -- 队列
- 数据结构--队列
- 数据结构:队列
- 数据结构 队列
- Linux/unix 配置java环境变量
- 设计模式(二十)之设计模式之 Interpreter(解释器)
- mybatis三种传值方式
- 黑马程序员——Java基础--集合框架(1)
- C++标准库介绍
- 数据结构-队列1
- 简单 js 验证
- POJ 1000 A+B Problem
- 085 Maximal Rectangle [Leetcode]
- leetcode 21_Merge Two Sorted Lists & leetcode_258 Add Digits & leetcode_66plus one
- hdu1796 How many integers can you find 容斥原理
- GDOI2016模拟8.16总结
- HBase介绍
- UIViewConroller(控制器)间关系