队列的实现(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);   

}
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值