数据结构C语言版(五)队列
2020-07-12 17:29
148 查看
1. 队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
2. 链式队列实现
头文件声明
#pragma once #include<stdio.h> #include<string.h> #include<stdlib.h> #ifdef __cplusplus extern "C"{ #endif //队列先进先出,所以队列的头为链表头,头部抛出,尾部压入 //不支持遍历和随插随取 struct QueueNode { struct QueueNode * next; }; struct LinkQueue { struct QueueNode header; int size;//村粗 struct QueueNode * last;//尾指针,指向链表的最后一个结点 }; typedef void * queueelement; //初始化 queueelement Init_queue(); //插入 void push_queue(queueelement queue,void * data); //抛出 void pop_queue(queueelement queue); //队列首元素 void * first_queue(queueelement queue); //队列尾元素 void * last_queue(queueelement queue); //队列元素个数 int size_queue(queueelement queue); //销毁队列 void Destroy_queue(queueelement queue); #ifdef __cplusplus } #endif
#include"linkqen.h" //struct QueueNode // { // struct QueueNode * next; // }; // struct LinkQueue // { // struct QueueNode header; // int size;//存储 // struct QueueNode * last;//尾指针,指向链表的最后一个结点 // }; // typedef void * queueelement; //初始化 queueelement Init_queue() { struct LinkQueue * que = (struct LinkQueue *)malloc(sizeof(struct LinkQueue)); if (NULL ==que) return NULL; que->header.next = NULL; que->size =0; que->last = &(que->header); return que; } //插入 void push_queue(queueelement queue,void * data) { if(NULL == queue) return; if(NULL == data) return; struct LinkQueue * que=(struct LinkQueue *)queue; struct QueueNode * node = (struct QueueNode *)data; que->last->next = node; node->next = NULL; que->last = node; que->size++; } //抛出 void pop_queue(queueelement queue) { if(NULL == queue) return; struct LinkQueue * que=(struct LinkQueue *)queue; if (que->size == 0) return; if(que->size == 1) { que->header.next = NULL; que->last=&(que->header); que->size =0; return; } struct QueueNode * node = que->header.next; que->header.next = node->next; que->size--; } //队列首元素 void * first_queue(queueelement queue) { if(NULL == queue) return NULL; struct LinkQueue * que=(struct LinkQueue *)queue; return que->header.next; } //队列尾元素 void * last_queue(queueelement queue) { if(NULL == queue) return NULL; struct LinkQueue * que=(struct LinkQueue *)queue; return que->last; } //队列元素个数 int size_queue(queueelement queue) { if(NULL == queue) return -1; struct LinkQueue * que=(struct LinkQueue *)queue; return que->size; } //销毁队列 void Destroy_queue(queueelement queue) { if(NULL == queue) return; free(queue); }
#include"linkqen.h" //struct QueueNode // { // struct QueueNode * next; // }; // struct LinkQueue // { // struct QueueNode header; // int size;//存储 // struct QueueNode * last;//尾指针,指向链表的最后一个结点 // }; // typedef void * queueelement; struct person { struct QueueNode header; char name[64]; int age; }; void test() { person p1={NULL,"a",10}; person p2={NULL,"b",20}; person p3={NULL,"c",30}; person p4={NULL,"d",40}; person p5={NULL,"e",50}; queueelement q = Init_queue(); push_queue(q,&p1); push_queue(q,&p2); push_queue(q,&p3); push_queue(q,&p4); push_queue(q,&p5); person * l =(person *) last_queue(q); printf("队尾元素:name:%s age: %d\n",l->name,l->age); while(size_queue(q)>0) { person * f = (person *)first_queue(q); printf("name:%s age: %d\n",f->name,f->age); pop_queue(q); } printf("%d\n",size_queue(q)); Destroy_queue(q); } void main() { test(); }
相关文章推荐
- 多级队列反馈调度算法
- 数据结构— 数组循环队列C++
- HDU 1434幸福列车——优先队列的应用
- 循环队列实现(C++) Ring Buffer
- 数据结构之队列(三)——循环队列
- 数据结构之线性结构---队列 链式储存
- [luoguP1440] 求m区间内的最小值(单调队列 || 线段树)
- BZOJ1342 单调队列
- 用两个栈实现队列
- 用队列实现栈
- 中断服务下半部之工作队列详解
- 双端队列
- 分别用数组和链表实现队列
- 循环顺序队列(初始化、入队、出队、判空)
- 1.5 实现优先级队列
- 队列的链式建立和操作
- 栈和队列的应用——数制转换软件
- KafkaOffsetMonitor:监控消费者和延迟的队列
- poj 2823 Sliding Window (单调队列)
- 4 款消息队列软件产品大比拼