数据结构—队列的顺序和链式存储

来源:互联网 发布: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);


queue_link.c

#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
原创粉丝点击