連結串列不限定元素的長度,可以動態分配元素並新增,另外經常的增刪是連結串列優於其他資料結構的特點.
今天我們用連結串列來實現一個佇列.
linkList.h
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define new(type) (type *)malloc(sizeof(type)) #define FREE(p) \ if (p != NULL) {\ free(p);\ p = NULL;\ } typedef struct Node{ int data; struct Node *next; }ListNode, *pListNode; typedef struct _Queue{ int size; pListNode headLink; pListNode tailLink; }Queue, *pQueue; pQueue CreatedQueue(void); pListNode CreateNode(int value); pListNode popQueue(pQueue); void pushQueue(pQueue queue, pListNode node); void DestroyQueue(pQueue *queue); void DestroyListNode(pListNode *node); int LengthOfQueue(pQueue queue); void ShowQueue(pQueue queue);
這裡引進size對佇列進行計數,
api中並沒有判斷empty 或者 full,直接用這個size即可.
linkList.c
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <assert.h> #include "linkList.h" //建立佇列時,頭尾指標均指向data域為0的節點. pQueue CreatedQueue(void){ pQueue pq = new(Queue); assert(pq != NULL); //pListNode pn = CreateNode(0); //assert(pn != NULL); pq->size = 0; pq->headLink = NULL; //pn; pq->tailLink = NULL; //pn; return pq; } pListNode CreateNode(int value){ pListNode pn= new(ListNode); assert(pn != NULL); pn->data = value; pn->next = NULL; return pn; } //刪除節點是刪除headLink指向的節點,改變headLink指向 pListNode popQueue(pQueue queue){ assert(queue != NULL); if(queue->size == 0) return NULL; pListNode pn = queue->headLink; queue->headLink = pn->next; pn->next = NULL; queue->size --; if(queue->size ==0) queue->tailLink = NULL; return pn; } //增加節點放在隊尾,改變tailLink指向,新增第一個元素headLink和tailLink均指向這個節點 void pushQueue(pQueue queue, pListNode node){ assert(queue != NULL); assert(node != NULL); if(queue->size == 0){ queue->headLink = node; queue->tailLink = node; } else{ queue->tailLink->next = node; queue->tailLink = node; } queue->size++; } void DestroyQueue(pQueue *queue){ assert(*queue != NULL); while((*queue)->size--!=0){ //清空所有節點 pListNode pn = popQueue(*queue); DestroyListNode(&pn); } //FREE(queue->headLink); //FREE(queue->tailLink); FREE(*queue); } void DestroyListNode(pListNode *node){ assert(*node != NULL); (*node)->next = NULL; FREE(*node); } int LengthOfQueue(pQueue queue){ assert(queue != NULL); assert(queue->size ==0 || queue->size > 0); return queue->size; } void ShowQueue(pQueue queue){ pListNode pn = queue->headLink; if(pn == NULL) return ; printf("ShowQueue Order "); int length = queue->size; while(length--!=0){ printf(" [%d]", pn->data); pn = pn->next; } printf("\n"); }
測試程式的主函式main.c
#include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<string.h> #include"linkList.h" int main() { pQueue pq = CreatedQueue(); printf("Push circularQueue 1,2,3,4,5,6,7..\n"); CreateNode(1); pListNode pn = CreateNode(1); DestroyListNode(&pn); pn = CreateNode(2); pushQueue(pq, pn); ShowQueue(pq); pn = CreateNode(3); pushQueue(pq, pn); pn = CreateNode(4); pushQueue(pq, pn); pn = CreateNode(5); pushQueue(pq, pn); pn = CreateNode(6); pushQueue(pq, pn); ShowQueue(pq); popQueue(pq); ShowQueue(pq); popQueue(pq); ShowQueue(pq); popQueue(pq); ShowQueue(pq); popQueue(pq); ShowQueue(pq); popQueue(pq); ShowQueue(pq); popQueue(pq); ShowQueue(pq); popQueue(pq); ShowQueue(pq); DestroyQueue(&pq); pq = CreatedQueue(); printf("Push circularQueue 1,2,3,4,5,6,7..\n"); CreateNode(1); pn = CreateNode(1); DestroyListNode(&pn); pn = CreateNode(2); pushQueue(pq, pn); ShowQueue(pq); popQueue(pq); ShowQueue(pq); pn = CreateNode(3); pushQueue(pq, pn); ShowQueue(pq); pn = CreateNode(4); pushQueue(pq, pn); ShowQueue(pq); return 0; }
輸出結果如下:
Push circularQueue 1,2,3,4,5,6,7.. ShowQueue Order [2] ShowQueue Order [2] [3] [4] [5] [6] ShowQueue Order [3] [4] [5] [6] ShowQueue Order [4] [5] [6] ShowQueue Order [5] [6] ShowQueue Order [6] Push circularQueue 1,2,3,4,5,6,7.. ShowQueue Order [2] ShowQueue Order [3] ShowQueue Order [3] [4]