C语言队列的实现

队列是常用的数据结构之一,下面给出一个链式队列的实现:

头文件Queue.h

 1 #ifndef Queue_H
 2 #define Queue_H
 3 
 4 typedef int Item;
 5 typedef struct node * PNode;
 6 typedef struct node
 7 {
 8     Item data;
 9     PNode next;
10 }Node;
11 
12 typedef struct
13 {
14     PNode front;
15     PNode rear;
16     int size;
17 }Queue;
18 
19 /*构造一个空队列*/
20 Queue *InitQueue();
21 
22 /*销毁一个队列*/
23 void DestroyQueue(Queue *pqueue);
24 
25 /*清空一个队列*/
26 void ClearQueue(Queue *pqueue);
27 
28 /*判断队列是否为空*/
29 int IsEmpty(Queue *pqueue);
30 
31 /*返回队列大小*/
32 int GetSize(Queue *pqueue);
33 
34 /*返回队头元素*/
35 PNode GetFront(Queue *pqueue,Item *pitem);
36 
37 /*返回队尾元素*/
38 PNode GetRear(Queue *pqueue,Item *pitem);
39 
40 /*将新元素入队*/
41 PNode EnQueue(Queue *pqueue,Item item);
42 
43 /*队头元素出队*/
44 PNode DeQueue(Queue *pqueue,Item *pitem);
45 
46 /*遍历队列并对各数据项调用visit函数*/
47 void QueueTraverse(Queue *pqueue,void (*visit)());
48 
49 #endif

实现代码Queue.c如下:

  1 #include"Queue.h"
  2 #include<malloc.h>
  3 #include<stdio.h>
  4 
  5 /*构造一个空队列*/
  6 Queue *InitQueue()
  7 {
  8     Queue *pqueue = (Queue *)malloc(sizeof(Queue));
  9     if(pqueue!=NULL)
 10     {
 11         pqueue->front = NULL;
 12         pqueue->rear = NULL;
 13         pqueue->size = 0;
 14     }
 15     return pqueue;
 16 }
 17 
 18 /*销毁一个队列*/
 19 void DestroyQueue(Queue *pqueue)
 20 {
 21     if(IsEmpty(pqueue)!=1)
 22         ClearQueue(pqueue);
 23     free(pqueue);
 24 }
 25 
 26 /*清空一个队列*/
 27 void ClearQueue(Queue *pqueue)
 28 {
 29     while(IsEmpty(pqueue)!=1)
 30     {
 31         DeQueue(pqueue,NULL);
 32     }
 33 
 34 }
 35 
 36 /*判断队列是否为空*/
 37 int IsEmpty(Queue *pqueue)
 38 {
 39     if(pqueue->front==NULL&&pqueue->rear==NULL&&pqueue->size==0)
 40         return 1;
 41     else
 42         return 0;
 43 }
 44 
 45 /*返回队列大小*/
 46 int GetSize(Queue *pqueue)
 47 {
 48     return pqueue->size;
 49 }
 50 
 51 /*返回队头元素*/
 52 PNode GetFront(Queue *pqueue,Item *pitem)
 53 {
 54     if(IsEmpty(pqueue)!=1&&pitem!=NULL)
 55     {
 56         *pitem = pqueue->front->data;
 57     }
 58     return pqueue->front;
 59 }
 60 
 61 /*返回队尾元素*/
 62 
 63 PNode GetRear(Queue *pqueue,Item *pitem)
 64 {
 65     if(IsEmpty(pqueue)!=1&&pitem!=NULL)
 66     {
 67         *pitem = pqueue->rear->data;
 68     }
 69     return pqueue->rear;
 70 }
 71 
 72 /*将新元素入队*/
 73 PNode EnQueue(Queue *pqueue,Item item)
 74 {
 75     PNode pnode = (PNode)malloc(sizeof(Node));
 76     if(pnode != NULL)
 77     {
 78         pnode->data = item;
 79         pnode->next = NULL;
 80         
 81         if(IsEmpty(pqueue))
 82         {
 83             pqueue->front = pnode;
 84         }
 85         else
 86         {
 87             pqueue->rear->next = pnode;
 88         }
 89         pqueue->rear = pnode;
 90         pqueue->size++;
 91     }
 92     return pnode;
 93 }
 94 
 95 /*队头元素出队*/
 96 PNode DeQueue(Queue *pqueue,Item *pitem)
 97 {
 98     PNode pnode = pqueue->front;
 99     if(IsEmpty(pqueue)!=1&&pnode!=NULL)
100     {
101         if(pitem!=NULL)
102             *pitem = pnode->data;
103         pqueue->size--;
104         pqueue->front = pnode->next;
105         free(pnode);
106         if(pqueue->size==0)
107             pqueue->rear = NULL;
108     }
109     return pqueue->front;
110 }
111 
112 /*遍历队列并对各数据项调用visit函数*/
113 void QueueTraverse(Queue *pqueue,void (*visit)())
114 {
115     PNode pnode = pqueue->front;
116     int i = pqueue->size;
117     while(i--)
118     {
119         visit(pnode->data);
120         pnode = pnode->next;
121     }
122         
123 }

简单测试程序Test.c:

 1 #include"Queue.h"
 2 #include<stdio.h>
 3 void print(Item i)
 4 {
 5     printf("该节点元素为%d\n",i);
 6 }
 7 main()
 8 {
 9     Queue *pq = InitQueue();
10     int i,item;
11     printf("0-9依次入队并输出如下:\n");
12     for(i=0;i<10;i++)
13     {
14         EnQueue(pq,i);
15         GetRear(pq,&item);
16         printf("%d ",item);
17     }
18 
19     printf("\n从队头到队尾遍历并对每个元素执行print函数:\n");    
20     QueueTraverse(pq,print);
21 
22     printf("队列中元素依次出队列并输出如下:\n");
23     for(i=0;i<10;i++)
24     {
25         DeQueue(pq,&item);
26         printf("%d ",item);
27     }
28     ClearQueue(pq);
29     if(IsEmpty(pq))
30         printf("\n将队列置空成功\n");
31     DestroyQueue(pq);
32     printf("队列已被销毁\n");
33 }

 

 

posted @ 2013-11-06 23:09  stemon  阅读(1742)  评论(0编辑  收藏  举报