队列
2015-07-27 09:19
197 查看
队列也是常用的数据结构之一,下面给出一个链式队列的实现~~
#ifndef Queue_H #define Queue_H typedef int Item; typedef struct node * PNode; typedef struct node { Item data; PNode next; }Node; typedef struct { PNode front; PNode rear; int size; }Queue; /*构造一个空队列*/ Queue *InitQueue(); /*销毁一个队列*/ void DestroyQueue(Queue *pqueue); /*清空一个队列*/ void ClearQueue(Queue *pqueue); /*判断队列是否为空*/ int IsEmpty(Queue *pqueue); /*返回队列大小*/ int GetSize(Queue *pqueue); /*返回队头元素*/ PNode GetFront(Queue *pqueue,Item *pitem); /*返回队尾元素*/ PNode GetRear(Queue *pqueue,Item *pitem); /*将新元素入队*/ PNode EnQueue(Queue *pqueue,Item item); /*队头元素出队*/ PNode DeQueue(Queue *pqueue,Item *pitem); /*遍历队列并对各数据项调用visit函数*/ void QueueTraverse(Queue *pqueue,void (*visit)()); #endif #include"Queue.h" #include<malloc.h> #include<stdio.h> /*构造一个空队列*/ Queue *InitQueue() { Queue *pqueue = (Queue *)malloc(sizeof(Queue)); if(pqueue!=NULL) { pqueue->front = NULL; pqueue->rear = NULL; pqueue->size = 0; } return pqueue; } /*销毁一个队列*/ void DestroyQueue(Queue *pqueue) { if(IsEmpty(pqueue)!=1) ClearQueue(pqueue); free(pqueue); } /*清空一个队列*/ void ClearQueue(Queue *pqueue) { while(IsEmpty(pqueue)!=1) { DeQueue(pqueue,NULL); } } /*判断队列是否为空*/ int IsEmpty(Queue *pqueue) { if(pqueue->front==NULL&&pqueue->rear==NULL&&pqueue->size==0) return 1; else return 0; } /*返回队列大小*/ int GetSize(Queue *pqueue) { return pqueue->size; } /*返回队头元素*/ PNode GetFront(Queue *pqueue,Item *pitem) { if(IsEmpty(pqueue)!=1&&pitem!=NULL) { *pitem = pqueue->front->data; } return pqueue->front; } /*返回队尾元素*/ PNode GetRear(Queue *pqueue,Item *pitem) { if(IsEmpty(pqueue)!=1&&pitem!=NULL) { *pitem = pqueue->rear->data; } return pqueue->rear; } /*将新元素入队*/ PNode EnQueue(Queue *pqueue,Item item) { PNode pnode = (PNode)malloc(sizeof(Node)); if(pnode != NULL) { pnode->data = item; pnode->next = NULL; if(IsEmpty(pqueue)) { pqueue->front = pnode; } else { pqueue->rear->next = pnode; } pqueue->rear = pnode; pqueue->size++; } return pnode; } /*队头元素出队*/ PNode DeQueue(Queue *pqueue,Item *pitem) { PNode pnode = pqueue->front; if(IsEmpty(pqueue)!=1&&pnode!=NULL) { if(pitem!=NULL) *pitem = pnode->data; pqueue->size--; pqueue->front = pnode->next; free(pnode); if(pqueue->size==0) pqueue->rear = NULL; } return pqueue->front; } /*遍历队列并对各数据项调用visit函数*/ void QueueTraverse(Queue *pqueue,void (*visit)()) { PNode pnode = pqueue->front; int i = pqueue->size; while(i--) { visit(pnode->data); pnode = pnode->next; } } #include"Queue.h" #include<stdio.h> void print(Item i) { printf("该节点元素为%d\n",i); } main() { Queue *pq = InitQueue(); int i,item; printf("0-9依次入队并输出如下:\n"); for(i=0;i<10;i++) { EnQueue(pq,i); GetRear(pq,&item); printf("%d ",item); } printf("\n从队头到队尾遍历并对每个元素执行print函数:\n"); QueueTraverse(pq,print); printf("队列中元素依次出队列并输出如下:\n"); for(i=0;i<10;i++) { DeQueue(pq,&item); printf("%d ",item); } ClearQueue(pq); if(IsEmpty(pq)) printf("\n将队列置空成功\n"); DestroyQueue(pq); printf("队列已被销毁\n"); }
相关文章推荐
- hdu 2159 FATE
- 做项目过程一点心得
- Python logging模块详解
- 安卓游戏 收集钱袋(自制)
- 转:栈和队列小知识【STL用法】
- 3、ACE-实用生活口语---讲打电话Talking on the phone
- 改变与适应
- 第6章 服务模式 在 .NET 中实现 Service Gateway(服务网关)
- 机房收费之查看数据库代码
- 使用Storyboards开发的10个小技巧
- wireshark on mac :::no interface can be used for capturing in this system with the current configura
- HDOJ题目2196 Computer(树的直径)
- 仿QQ空间图片放缩查看
- hihocoder 挑战赛13A 组合数学中的帕斯卡公式
- 1611 - Crane(贪心)
- Android Fragment 生命周
- 哈尔小波变换实例分析
- url schemes格式错误
- 第6章 服务模式 在 .NET 中实现 Service Gateway(服务网关)
- springMVC和Struts异同