队列的表示和基本操作的实现
2017-11-14 21:50
323 查看
//库函数头文件包含 #include <stdio.h> #include <stdlib.h> #include <malloc.h> //函数状态码的定义 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int QElemType; //------单链队列————队列的链式存储结构----------- typedef struct QNode{ QElemType data; struct QNode *next; }QNode, *QueuePtr; typedef struct{ QueuePtr Front; //队头指针 QueuePtr Rear; //队尾指针 }LinkQueue; //--------基本操作的函数的实现------------------ //构造一个空队列Q Status InitQueue(LinkQueue &Q){ Q.Front = Q.Rear = (QueuePtr)malloc(sizeof(QNode)); if(!Q.Front) exit(OVERFLOW); Q.Front->next = NULL; return OK; } //销毁队列Q,Q不再存在 Status DestroyQueue(LinkQueue &Q){ while(Q.Front){ Q.Rear = Q.Front->next; free(Q.Front); Q.Front = Q.Rear; } Q.Front = NULL; Q.Rear = NULL; return OK; } //将Q清为空队列 Status ClearQueue(LinkQueue &Q){ QueuePtr p, q; Q.Rear = Q.Front; p = Q.Front->next; Q.Front->next = NULL; while(p){ q = p; p = p->next; free(q); } return OK; } //判断队列是否为空 Status QueueEmpty(LinkQueue Q){ return Q.Front == Q.Rear; } //返回Q的元素个数,即为队列的长度 int QueueLength(LinkQueue Q){ int len = 0; if(Q.Front == Q.Rear) return len; QueuePtr p = Q.Front; while(p != Q.Rear){ p = p->next; ++len; } return len; } //返回队头元素 Status GetHead(LinkQueue Q, QElemType &e){ QueuePtr p; if(!Q.Front) return ERROR; p = Q.Front->next; e = p->data; return OK; } //在队尾插入元素(即入队) Status EnQueue(LinkQueue &Q, QElemType e){ QueuePtr p; p = (QueuePtr)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW); //储存分配失败 p->data = e; p->next = NULL; //(划重点) Q.Rear->next = p; Q.Rear = p; return OK; } //删除队头元素(即出队) Status DeQueue(LinkQueue &Q, QElemType &e){ if(Q.Front == Q.Rear) return ERROR; QueuePtr p; p = Q.Front->next; e = p->data; Q.Front->next = p->next; if(Q.Rear == p) Q.Rear = Q.Front; //队列中只有一个元素,修改尾指针指向的位置 free(p); return OK; } //visit()函数 Status Print(QElemType e){ printf("%d ", e); return OK; } //遍历队列 Status QueueTraverse(LinkQueue Q, Status (*visit)(QElemType)){ QueuePtr p = Q.Front->next; while(p){ if(!visit(p->data)) return ERROR; p = p->next; } return OK; } //主函数 int main(){ LinkQueue Q; QElemType a; InitQueue(Q); //初始化一个空队列 printf("输入5个数:\n"); for(int i = 0; i < 5; ++i){ scanf("%d", &a); EnQueue(Q, a); } printf("遍历队列:\n"); QueueTraverse(Q, Print); DeQueue(Q, a); printf("\n执行出队操作的结果:\n"); QueueTraverse(Q, Print); printf("\n获得队列长度操作的结果:\n%d", QueueLength(Q)); GetHead(Q, a); printf("\n获得队头元素操作的结果:\n%d", a); printf("\n判断队列是否为空:\n"); if(QueueEmpty(Q)) printf("YES"); else printf("NO"); printf("\n执行清空队列操作后队列是否为空:\n"); ClearQueue(Q); if(QueueEmpty(Q)) printf("YES"); else printf("NO"); DestroyQueue(Q); return 0; }
相关文章推荐
- 队列的顺序存储结构——基本操作的实现
- 实验三 栈和队列的基本操作实现及其应用
- 数据结构之队列的基本操作入队出队初始化删除-c++代码实现及运行实例结果
- 数据结构编程笔记十八:第七章 图 图的邻接矩阵存储表示及各基本操作的实现
- redis基本操作之实现线程队列
- 队列基本操作及银行简易排号的实现
- 数据结构之队列的基本操作入队出队初始化删除-c++代码实现及运行实例结果
- 链队列的(9个基本操作)实现
- 单链队列的基本操作实现
- 【队列】链式结构实现队列的基本操作
- 链表,顺序表的基本操作及其实现的栈与队列
- 数据结构之队列的基本操作入队出队初始化删除-c++代码实现及运行实例结果
- 循环队列的基本操作之代码实现_legend
- 链队列的基本操作实现
- c++ 队列基本操作实现
- 线性表----队列(顺序表示)的基本操作
- 实验3:栈和队列的基本操作实现及其应用——十进制转换为二进制
- 二叉树遍历非递归算法所用到的栈以及层次遍历所用到的队列的基本操作算法的实现
- 数据结构中队列的基本操作实现
- 数据结构之队列的基本操作入队出队初始化删除-c++代码实现及运行实例结果