赞
踩
队列是c语言中一个重要的数据结构之一,下面就是实现队列建立、插入、删除、清空、销毁等操作的代码。
头文件 Queue.h
- #ifndef QUEUE_H_
- #define QUEUE_H_
-
- typedef int Item;
-
- typedef struct node
- {
- Item data;
- struct node* next;
- }Node,*PNode;
-
- 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 DelQueue(Queue* pqueue,Item *pitem);
-
-
-
- /*遍历队列,并对各项数据调用visit函数*/
- void QueueTraverse(Queue* pqueue,void (*visit)(PNode));
-
-
- #endif
Queue.c
- #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)
- {
- DelQueue(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 DelQueue(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;
- }
-
- /*遍历队列*/
- void QueueTraverse(Queue* pqueue,void (*visit)(PNode))
- {
-
- PNode pnode = pqueue->front;
- int i = pqueue->size;
- while(i--)
- {
- visit(pnode);
- pnode = pnode->next;
- }
-
- }
-
-
测试程序test.c
- #include "Queue.h"
- #include <stdio.h>
- void visit(PNode pq)
- {
-
- printf("该节点的元素为: %d\n",pq->data);
-
- }
-
- int main()
- {
-
- Queue* pq = InitQueue();
- int i,item;
-
- printf("输入0-9共10个数字入队\n");
-
- for(i =0; i < 10; i++)
- {
- EnQueue(pq,i);
- GetRear(pq,&item);
- printf("%d ",item);
-
- }
- printf("\n");
-
-
-
- printf("遍历这个队列,并执行visit函数:\n");
-
- QueueTraverse(pq,&visit);
- printf("队列元素出队并依次输出如下: \n");
- for(i = 0; i < 10 ; i++)
- {
- DelQueue(pq,&item);
- printf("%d",item);
-
- }
- ClearQueue(pq);
- if(IsEmpty(pq))
- printf("成功将队列置为空\n");
- DestroyQueue(pq);
- printf("队列已被销毁\n");
- return 0;
-
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。