数据结构—队列的顺序和链式存储
来源:互联网 发布:Linux解压并新建文件夹 编辑:程序博客网 时间:2024/06/06 20:48
队列的顺序存储
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
队列的特点:先进先出
queue.h
#pragma once#include<stdio.h>#include<stdlib.h>#define MAX_SIZE 1024typedef struct QUEUE{struct QUEUE* Data[MAX_SIZE];//创建队列容器1024int size;//统计队列数据}Queue;typedef void* Sequence_Queue;//初始化Sequence_Queue Init_Queue();//入队void Push_Queue(Sequence_Queue SeqQueue, void* data);//出队void Pop_Queue(Sequence_Queue SeqQueue);//获得队头元素void* Front_Queue(Sequence_Queue SeqQueue);//获得队尾元素void* Back_Queue(Sequence_Queue SeqQueue);//获得队列长度int Size_Queue(Sequence_Queue SeqQueue);//销毁队列void Destroy_Queue(Sequence_Queue SeqQueue);
queue.c
#include"queue.h"//初始化Sequence_Queue Init_Queue(){Queue* SeqQueue = (Queue*)malloc(sizeof(Queue));if (NULL == SeqQueue){printf("Init_Queue SeqQueue malloc error\n");return NULL;}int i = 0;for (; i < MAX_SIZE; ++i){SeqQueue->Data[i] = NULL;}SeqQueue->size = 0;return SeqQueue;}//入队void Push_Queue(Sequence_Queue SeqQueue, void* data){if (NULL == SeqQueue){printf("Push_Queue SeqQueue is NULL\n");return;}if (NULL == data){printf("Push_Queue data is NULL\n");return;}Queue* seqqueue = (Queue*)SeqQueue;//选择最下标最大的为头端队列if (seqqueue->size == MAX_SIZE){return;}int i = seqqueue->size-1;for (; i >=0; --i){seqqueue->Data[i + 1] = seqqueue->Data[i];}seqqueue->Data[0] = data;++seqqueue->size;}//出队void Pop_Queue(Sequence_Queue SeqQueue){if (NULL == SeqQueue){printf("Pop_Queue SeqQueue is NULL\n");return;}Queue* seqqueue = (Queue*)SeqQueue;if (seqqueue->size == 0){return;}--seqqueue->size;}//获得队头元素void* Front_Queue(Sequence_Queue SeqQueue){if (NULL == SeqQueue){printf("Front_Queue SeqQueue is NULL\n");return NULL;}Queue* seqqueue = (Queue*)SeqQueue;if (seqqueue->size == 0){return NULL;}return seqqueue->Data[seqqueue->size - 1];}//获得队尾元素void* Back_Queue(Sequence_Queue SeqQueue){if (NULL == SeqQueue){printf("Back_Queue SeqQueue is NULL\n");return NULL;}Queue* seqqueue = (Queue*)SeqQueue;if (seqqueue->size == 0){return NULL;}return seqqueue->Data[0];}//获得队列长度int Size_Queue(Sequence_Queue SeqQueue){if (NULL == SeqQueue){printf("Size_Queue SeqQueue is NULL\n");return -1;}Queue* seqqueue = (Queue*)SeqQueue;return seqqueue->size;}//销毁队列void Destroy_Queue(Sequence_Queue SeqQueue){if (NULL == SeqQueue){printf("Destroy_Queue SeqQueue is NULL\n");}free(SeqQueue);}main.c
#include"queue.h"typedef struct STUDENT{char name[64];int age;}student;int main(){student s1 = { "student1", 10 };student s2 = { "student2", 20 };student s3 = { "student3", 30 };student s4 = { "student4", 40 };student s5 = { "student5", 50 };Queue* SeqQueue=Init_Queue();Push_Queue(SeqQueue, &s1);Push_Queue(SeqQueue, &s2);Push_Queue(SeqQueue, &s3);Push_Queue(SeqQueue, &s4);Push_Queue(SeqQueue, &s5);//获取队列长度int size = Size_Queue(SeqQueue);printf("Size:%d\n", size);//获取队列尾部student* SBack = (student*)Back_Queue(SeqQueue);printf("Name:%s,Age:%d\n", SBack->name, SBack->age);printf("------------------------\n");//获取队列的每个元素while (SeqQueue->size>0){student* s = (student*)Front_Queue(SeqQueue);printf("Name:%s,Age:%d\n",s->name,s->age);Pop_Queue(SeqQueue);}Destroy_Queue(SeqQueue);getchar();return 0;}
打印结果
队列的链式存储
queue_link.h
#pragma once#include<stdlib.h>#include<stdio.h>//链式队列节点typedef struct QUEUENODE{struct QUEUENODE* next;}QueueNode;//队列typedef struct LINKQUEUE{QueueNode header;int size;}LinkQueue;typedef void* LQueue;//初始化LQueue Init_LinkQueue();//入队void Push_LinkQueue(LQueue queue, QueueNode* data);//出队void Pop_LinkQueue(LQueue queue);//获得队头元素void* Front_LinkQueue(LQueue queue);//获得队尾元素void* Back_LinkQueue(LQueue queue);//队列大小int Size_LinkQueue(LQueue queue);//销毁队列void Destroy_LinkQueue(LQueue queue);
#include"queue_link.h"//初始化LQueue Init_LinkQueue(){LinkQueue* lqueue = (LinkQueue*)malloc(sizeof(LinkQueue));if (NULL == lqueue){printf("Init_LinkQueue lqueue malloc error\n");}lqueue->header.next = NULL;lqueue->size = 0;return lqueue;}//入队void Push_LinkQueue(LQueue queue, QueueNode* data){if (NULL == queue){printf("Push_LinkQueue queue is NULL\n");return;}if (NULL == data){printf("Push_LinkQueue data is NULL\n");return;}LinkQueue* lqueue = (LinkQueue*)queue;//辅助指针,找到最后一个元素QueueNode* Pcurrent = &(lqueue->header);int i=0;for (; i < lqueue->size; ++i){Pcurrent = Pcurrent->next;}//新元素入队列data->next = Pcurrent->next;Pcurrent->next = data;++lqueue->size;}//出队void Pop_LinkQueue(LQueue queue){if (NULL == queue){printf("Pop_LinkQueue queue is NULL\n");return;}LinkQueue* lqueue = (LinkQueue*)queue;if (lqueue->size == 0){return;}//辅助指针QueueNode* Pcurrent = lqueue->header.next;lqueue->header.next = Pcurrent->next;--lqueue->size;}//获得队头元素void* Front_LinkQueue(LQueue queue){if (NULL == queue){printf("Front_LinkQueue queue is NULL\n");return NULL;}LinkQueue* lqueue = (LinkQueue*)queue;if (lqueue->size == 0){return NULL;}return lqueue->header.next;}//获得队尾元素void* Back_LinkQueue(LQueue queue){if (NULL == queue){printf("Back_LinkQueue queue is NULL\n");return NULL;}LinkQueue* lqueue = (LinkQueue*)queue;if (lqueue->size == 0){return NULL;}QueueNode* Pcurrent = &(lqueue->header);int i = 0;for (; i < lqueue->size; ++i){Pcurrent = Pcurrent->next;}return Pcurrent;}//队列大小int Size_LinkQueue(LQueue queue){if (NULL == queue){printf("Size_LinkQueue queue is NULL\n");return -1;}LinkQueue* lqueue = (LinkQueue*)queue;return lqueue->size;}//销毁队列void Destroy_LinkQueue(LQueue queue){if (NULL == queue){printf("Destroy_LinkQueue queue is NULL\n");return;}free(queue);}
main.c
#include"queue_link.h"typedef struct STUDENT2{QueueNode header;//前四个字节存放下一个节点的地址(指向下一个节点)char name[64];int age;}student;int main(){student s1 = { NULL, "aaaa", 10 };student s2 = { NULL, "aaaa", 20 };student s3 = { NULL, "aaaa", 30 };student s4 = { NULL, "aaaa", 40 };student s5 = { NULL, "aaaa", 50 };LQueue lqueue = Init_LinkQueue();Push_LinkQueue(lqueue, &s1);Push_LinkQueue(lqueue, &s2);Push_LinkQueue(lqueue, &s3);Push_LinkQueue(lqueue, &s4);Push_LinkQueue(lqueue, &s5);//获得队列大小LinkQueue* queue = (LinkQueue*)lqueue;int size = queue->size;printf("Size=%d\n",size);//获得队尾元素student* Back = (student*)Back_LinkQueue(lqueue);printf("Name:%s,Age:%d\n", Back->name, Back->age);printf("-------------------------------------\n");//取出所有队列元素while (queue->size>0){student* s = (student*)Front_LinkQueue(lqueue);printf("Name:%s,Age:%d\n",s->name,s->age);Pop_LinkQueue(lqueue);}Destroy_LinkQueue(lqueue);getchar();return 0;}
打印结果
阅读全文
0 0
- 数据结构—队列的顺序和链式存储
- 队列的顺序存储和链式存储
- 数据结构存储的顺序和链式对比
- 数据结构存储的顺序和链式对比
- 数据结构存储的顺序和链式对比
- Python 数据结构 之 队列 的顺序、链式存储结构
- 栈和队列的顺序存储和链式存储
- 队列的顺序存储结构和链式存储结构
- 队列的顺序存储实现和链式存储实现
- 数据结构-【栈】的链式存储和顺序存储
- 数据结构-栈的顺序存储和链式存储
- 队列的链式存储与顺序存储
- 数据结构(队列):队列的链式存储结构
- 数据结构存储,顺序和链式比较d
- 数据结构---队列---链式存储
- 数据结构之队列(顺序队列和链式队列)
- 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)
- 数据结构——队列的链式存储结构以及实现
- 字符串拼接与java常用基础
- 2017 年最流行的 15 个数据科学 Python 库
- Redis学习-Sets
- 程序媛:数据库操作之封装为函数(sqlite3 )
- PAT——1019数字黑洞
- 数据结构—队列的顺序和链式存储
- linux内核源码中max和min的宏实现
- c++のstatic静态成员、对象的动态创建和释放
- LeetCode 23. Merge k Sorted Lists
- 类的六个默认成员函数总结(一)
- GreenPlum之日常SQL脚本笔记(一)
- nodejs的主要框架express的安装
- HTTP长连接与短连接
- Java中Set的contains()方法 —— hashCode与equals方法的约定及重写原则