1. 程式人生 > >C語言一個佇列的實現

C語言一個佇列的實現

佇列也是常用的資料結構之一,下面給出一個鏈式佇列的實現~~

標頭檔案Queue.h

[cpp]  view plain copy
  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如下:

[cpp]  view plain copy
  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

[cpp]  view plain copy
  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. }