循环队列的双循环链表结构
来源:互联网 发布:怎么在知乎提问 编辑:程序博客网 时间:2024/06/06 08:30
运行环境Visual studio 2017
运行平台Windows 7
list.h
#pragma oncetypedef int Elemtype;typedef enum{OK=1,ERROR=0}Status;typedef struct coord { int x;/*abscissa(横坐标)*/ int y;/*ordinate(纵坐标)*/}Coord;enum Direction{up = 1,down ,left ,right };typedef struct elements { Coord coord;/*坐标*/ enum Direction direction;/*下一步的方向*/};typedef struct list{ Elemtype data; struct list* prev; struct list* next;}List, *Ptrlist;typedef struct queue{ Ptrlist front; Ptrlist tail; int cursize;}Queue;Status Initqueue(Queue &Lq);Status Clear(Queue &Lq);Status Destroy(Queue &Lq);bool Queueempty(Queue &Lq);int Queuelength(Queue &Lq);Status Getfront(Queue &Lq,Elemtype &x);Status Gettail(Queue &Lq,Elemtype &x);Status push_front(Queue &Lq, Elemtype x);Status push_tail(Queue &Lq, Elemtype x);void Showqueue(Queue &Lq);
list.cpp
#include "list.h"#include <stdlib.h>#include <stdio.h>#include <string.h>#include <stdbool.h>void Freenode(Ptrlist p){ free(p); p = NULL;}Ptrlist Buynode(){ Ptrlist s = (Ptrlist)malloc(sizeof(List)); if (s == NULL) exit(0); memset(s, 0, sizeof(List)); return s;}Status Initqueue(Queue &Lq){ Lq.cursize = 0; Lq.tail = NULL; Lq.front = Lq.tail; return OK;}Status Clear(Queue &Lq){ while (Lq.front->next != Lq.front->prev) { Ptrlist p = Lq.front; Freenode(p); Lq.front = Lq.front->next; } Ptrlist q = Lq.front; Freenode(q); Lq.front = Lq.tail = NULL; Lq.cursize = 0; return OK;}Status Destroy(Queue &Lq){ Clear(Lq); Freenode(Lq.front); Freenode(Lq.tail); return OK;}bool Queueempty(Queue &Lq){ return (Lq.cursize == 0);}int Queuelength(Queue &Lq){ return Lq.cursize;}Status Getfront(Queue &Lq,Elemtype &x){ if (Queueempty(Lq)) { return ERROR; } else { x = Lq.front->data; return OK; }}Status Gettail(Queue &Lq,Elemtype &x){ if (Queueempty(Lq)) { return ERROR; } else { x = Lq.tail->data; return OK; }}Status push_front(Queue &Lq, Elemtype x){ Ptrlist s = Buynode(); if (Lq.front == NULL) { Lq.front = s; Lq.tail = Lq.front; Lq.tail->next = Lq.front; Lq.tail->prev = Lq.front; Lq.front->next = Lq.tail; Lq.front->prev = Lq.tail; s->data = x; Lq.cursize++; return OK; } s->prev = Lq.front->prev; Lq.front->prev->next = s; Lq.front->prev = s; s->next = Lq.front; s->data = x; Lq.cursize++; Lq.front = s; return OK;}Status push_tail(Queue &Lq, Elemtype x){ Ptrlist s = Buynode(); if (Lq.tail == NULL) { Lq.tail = s; Lq.front = Lq.tail; Lq.tail->next = Lq.front; Lq.tail->prev = Lq.front; Lq.front->next = Lq.tail; Lq.front->prev = Lq.tail; s->data = x; Lq.cursize++; return OK; } s->prev = Lq.front->prev; Lq.front->prev->next = s; Lq.front->prev = s; s->next = Lq.front; s->data = x; Lq.cursize++; Lq.tail = s; return OK;}Status Pop_front(Queue &Lq){ if (Queueempty(Lq)) { return ERROR; } Ptrlist p = Lq.front; Lq.front->next->prev = Lq.front->prev; Lq.front->prev->next = Lq.front->next; Lq.front = Lq.front->next; Freenode(p); Lq.cursize--; return OK;}Status Pop_tail(Queue &Lq){ if (Queueempty(Lq)) { return ERROR; } Ptrlist p = Lq.tail; Lq.tail->prev->next = Lq.tail->next; Lq.tail->next->prev = Lq.tail->prev; Lq.tail = Lq.tail->prev; Freenode(p); Lq.cursize--; return OK;}void Showqueue(Queue &Lq){ Ptrlist p = Lq.front; while (p->next != Lq.tail) { printf("%d,", p->data); } printf("\n");}
主函数(对于函数模块可以自己添加进去进行测试)
main.c
#include "list.h"#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ Queue myq; Initqueue(myq); Elemtype data[3] = { 11,22,33 }; Elemtype out[3] ; push_front(myq, data[0]); push_tail(myq, data[1]); push_front(myq, data[2]); Status Getfront(myq,out[0]); Status Gettail(myq,out[1]); Status Getfront(myq,out[2]); return 0;}
阅读全文
0 0
- 循环队列的双循环链表结构
- 循环链表之双循环链表
- 双循环链表的一些操作
- 双循环链表的相关算法
- 双循环链表的逆置
- 双循环链表的实现及其功能!!!
- 双循环链表的一些操作。。
- 双循环链表
- 双循环链表
- 数据结构-双循环链表
- 双循环链表
- 尹成 双循环链表
- 顺序结构的循环队列
- 数据结构_链表实现无限循环的"环"结构/循环队列
- 队列的顺序存储结构---循环队列
- 队列的顺序存储结构(循环队列)
- 双循环链表之分离
- 数据结构之双循环链表
- 每天一道LeetCode-----回文链表
- 171019—循环语句实际操作
- 百度云搜索引擎网站
- 【安全牛学习笔记】python装饰器
- 树状数组学习笔记
- 循环队列的双循环链表结构
- 大数【加减乘除】算法
- 2017-10-19 远光软件Java开发面试+达达京东到家笔试总结
- 每天一个linux命令(12):more命令
- PHP预定义变量 PHP_EOL
- SVN与Git的区别
- Netfilter编程实现HTTP协议传输账号密码的抓取
- node.js学习笔记(一)
- memset