C語言一個佇列的實現
阿新 • • 發佈:2019-01-03
佇列也是常用的資料結構之一,下面給出一個鏈式佇列的實現~~
標頭檔案Queue.h
[cpp] view plain copy- #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
實現程式碼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)
- {
- 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;
- }
- }
簡單測試程式Test.c
- #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");
- }