链队列
2016-05-07 00:03
274 查看
//链队列 #include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef struct LinkQueue { QueuePtr front, rear; }LinkQueue; bool InitQueue(LinkQueue *q); //队列的初始化 void QueueEmpty(LinkQueue q); //判断队列是否为空 int QueueLength(LinkQueue q); //求队列长度 bool EnQueue(LinkQueue *q,int e);//插入元素e 为q的新的队尾元素 bool QueueTraverse(LinkQueue *q); //输出队列元素 bool GetHead(LinkQueue q,int *e); //输出队头元素 bool DeQueue(LinkQueue *q,int *e); //删除队头元素,并将队头元素赋给e bool ClearQueue(LinkQueue *q); //清空队列 bool DestoryQueue(LinkQueue *q); //销毁队列 int main() { int d, length; int val; //删除的队头元素 int h; //队头元素 LinkQueue q; InitQueue(&q); if(InitQueue(&q)) printf("成功地构造了一个空队列!\n"); QueueEmpty(q); //判断队列是否为空 length = QueueLength(q); printf("队列的长度为%d\n",length); EnQueue(&q,-5); //插入队头元素 EnQueue(&q,5); EnQueue(&q,10); length = QueueLength(q); //队列元素的长度 printf("队列的长度为%d\n",length); QueueEmpty(q); //判断队列是否为空 printf("队列元素依次为: "); QueueTraverse(&q); //输出队列各个元素 GetHead(q,&h); //得到队头元素 printf("队头元素h = %d\n",h); DeQueue(&q,&d); printf("删除的队头元素d = %d\n",d); GetHead(q,&h); printf("队头元素h = %d\n",h); ClearQueue(&q); printf("清空队列后:q.front = %d q.rear = %d q.front->next = %d\n",q.front,q.rear,q.front->next); DestoryQueue(&q); printf("销毁队列后 q.front = %d q.rear = %d\n",q.front,q.rear); return 0; } bool InitQueue(LinkQueue *q)//队列的初始化 { q->front = (QueuePtr)malloc(sizeof(QNode)); if(q->front == NULL) { printf("内存分配失败 程序终止"); exit(-1); } q->rear = q->front; q->front->next = NULL; return true; } void QueueEmpty(LinkQueue q)//判断队列是否为空 { if(q.front == q.rear) printf("队列为空!\n"); else printf("队列不为空!\n"); } int QueueLength(LinkQueue q)//求队列长度 { int i = 0; QueuePtr p; p = q.front; while(q.rear != p) { i++; p = p->next; } return i; } bool EnQueue(LinkQueue *q,int e)//插入元素e 为q的新的队尾元素 { QueuePtr p; p = (QueuePtr)malloc(sizeof(QNode)); if(p == NULL) { printf("内存分配失败,程序终止!\n"); exit(-1); } p->data = e; p->next= NULL; q->rear->next = p; q->rear = p; return true; } bool QueueTraverse(LinkQueue *q) //输出队列元素 { QueuePtr p; p = q->front->next; while(p != NULL) { printf("%d ",p->data); p = p->next; } printf("\n"); return true; } bool GetHead(LinkQueue q,int *e) //输出队头元素 { QueuePtr p; if(q.front == q.rear) return false; p = q.front->next; *e = p->data; return true; } bool DeQueue(LinkQueue *q,int *e) //删除队头元素,并将队头元素赋给e { QueuePtr p; if(q->front == q->rear) return false; p = q->front->next; *e = p->data; q->front->next = p->next; if(q->rear == p) //一般情况下 删除队列头元素时仅需修改头结点中的指针 q->rear = q->front; //但当队列中最后一个元素被删除后 队列尾指针也丢失了,依次需要对队尾指针重新赋值(指向头结点) free(p); return true; } bool ClearQueue(LinkQueue *q) //清空队列 { QueuePtr m, n; q->rear = q->front; m = q->front->next; q->front->next = NULL; while(m != NULL) { n = m; m = m->next; free(n); } return true; } bool DestoryQueue(LinkQueue *q) //销毁队列 { //销毁时,无论空否,均可销毁 while(q->front) { q->rear = q->front->next; free(q->front); q->front = q->rear; } return true; }
相关文章推荐
- 成员变量和局部变量
- 4、js内置函数
- Ubuntu 16.04中安装Chromium浏览器
- 页面缓存:内存和文件之间的那些事
- Python实现Mysql数据库连接池实例详解
- 上古时代 Objective-C 中哈希表的实现
- 一个可以查看 Linux 当前缓存了哪些大文件的小工具
- 在ASP.NET 2.0中操作数据之十七:研究插入、更新和删除的关联事件
- 在ASP.NET 2.0中操作数据之十八:在ASP.NET页面中处理BLL/DAL层的异常
- 在ASP.NET 2.0中操作数据之十九:给编辑和新增界面增加验证控件
- 在ASP.NET 2.0中操作数据之二十:定制数据修改界面
- 在ASP.NET 2.0中操作数据之二十一:实现开放式并发
- 在ASP.NET 2.0中操作数据之二十二:为删除数据添加客户端确认
- 在ASP.NET 2.0中操作数据之二十三:基于用户对修改数据进行限制
- 在ASP.NET 2.0中操作数据之二十四:分页和排序报表数据
- 在ASP.NET 2.0中操作数据之二十五:大数据量时提高分页的效率
- 在ASP.NET 2.0中操作数据之二十六:排序自定义分页数据
- Python的dict字典结构操作方法学习笔记
- Python编写电话薄实现增删改查功能
- Python环境下安装使用异步任务队列包Celery的基础教程