隊列的實現(2):用鏈表實現隊列

上一篇文章:
http://blog.csdn.net/keheinash/article/details/51125063
利用數組實現了循環隊列,這是靜態的隊列,缺點是需要預設大小,當隊列滿時,無法再插入新的數據,只有等隊頭的數據被取走以後才能往隊列放入新的數據。

還可以利用鏈表實現隊列,這種方式動態創建節點需要的內存,當有新的數據節點要加入時,纔去申請內存空間,不需要預設大小,整個隊列需要的內存空間不需要連續,並且插入刪除更容易實現。但是同時也帶來存取速度慢的缺點,操作也比數組的方式更加複雜。

其實用鏈表實現隊列的方式十分簡單,只需要在單鏈表的基礎上,增加一個尾指針即可。因爲隊列的特點是“先進先出”,因此我們只需要在一頭一尾兩個指針,就可以快速地在隊頭取出數據,在隊尾插入數據。

首先定義節點數據結構:

typedef struct linkList{
    int data;
    struct linkList* nextNode;
}linkList_t;

接着定義鏈表的結構,其實就是比單鏈表多了一個尾指針:

typedef struct linkContorl{
    linkList_t* head;
    linkList_t* tail;
}linkContorl_t;

除了初始化和銷燬,因爲目的是利用鏈表實現隊列,這裏只給出在隊頭取得節點和隊尾刪除節點的操作,像在特定位置插入/刪除節點的操作一般而言隊列是不會使用的,否則就違背了“先進先出”原則

#include <string.h>
#include <malloc.h>
#include <iostream>

using namespace std;

typedef struct linkList{
    int data;
    struct linkList* nextNode;
}linkList_t;

typedef struct linkContorl{
    linkList_t* head;
    linkList_t* tail;
}linkContorl_t;

void linkList_Init(linkContorl_t** lCtrl){
    *lCtrl = (linkContorl_t*)malloc(sizeof(linkContorl_t));
    memset(*lCtrl, 0, sizeof(linkContorl_t));
}

bool linkList_addNode(linkContorl_t* lCtrl, int nodeData){
    linkList_t* newNode = (linkList_t*)malloc(sizeof(linkList_t));
    if(!newNode){
        return false;
    }

    newNode->data = nodeData;   
    newNode->nextNode = NULL;   

    if((lCtrl->head == NULL) && (lCtrl->tail == NULL)){
        lCtrl->head = newNode;
        lCtrl->tail = newNode;          
    }
    else{
        lCtrl->tail->nextNode = newNode;
        lCtrl->tail = newNode;
    }

    return true;
}

bool linkList_removeNode(linkContorl_t* lCtrl){
    linkList_t* node = lCtrl->head;
    if(node != NULL){
        lCtrl->head = node->nextNode;
        if(node == lCtrl->tail){
            lCtrl->tail = NULL;
        }
        if(node){
            free(node);
        }
        return true;    
    }
    else{
        return false;
    }
}

void linkList_Deinit(linkContorl_t* lCtrl){
    linkList_t* tmpP = lCtrl->head;
    linkList_t* tmpQ;
    while(tmpP != NULL){
        tmpQ = tmpP;
        tmpP = tmpP->nextNode;      
        free(tmpQ);
    }
    if(lCtrl){
        free(lCtrl);
        lCtrl = NULL;
    }
}

void printLinkList(linkContorl_t* lCtrl){
    linkList_t* tmpP = lCtrl->head;
    while(tmpP != NULL){
        cout << tmpP->data << " ";
        tmpP = tmpP->nextNode;      
    }
    cout << endl;
}

int main()
{
    linkContorl_t* lCtrl;
    linkList_Init(&lCtrl);

    linkList_addNode(lCtrl, 10);
    linkList_addNode(lCtrl, 20);
    linkList_addNode(lCtrl, 30);
    printLinkList(lCtrl);   

    linkList_removeNode(lCtrl);
    printLinkList(lCtrl);

    linkList_removeNode(lCtrl);
    printLinkList(lCtrl);

    linkList_removeNode(lCtrl);
    printLinkList(lCtrl);

    linkList_addNode(lCtrl, 30);
    printLinkList(lCtrl);   

}
發佈了46 篇原創文章 · 獲贊 22 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章