用連結串列實現佇列的功能

weixin_33912246發表於2019-01-08

連結串列不限定元素的長度,可以動態分配元素並新增,另外經常的增刪是連結串列優於其他資料結構的特點.

今天我們用連結串列來實現一個佇列.

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;
}
View Code

輸出結果如下:

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]

 

相關文章