队列的实现(2):用链表实现队列
来源:互联网 发布:微云mac版同步不了 编辑:程序博客网 时间:2024/05/22 07:50
上一篇文章:
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); }
0 0
- 队列的实现(2):用链表实现队列
- 用链表实现的队列
- 用链表实现的队列
- 队列的数组实现(循环队列)
- 队列(1)----用链表实现队列
- 队列(2)----用数组实现队列
- 队列的实现:顺序队列
- 队列的实现:链式队列
- 队列----循环队列的实现
- 队列 Queue 用链表实现队列
- 用链表实现队列--链式队列
- 队列的基本操作(用链表实现)
- 用链表实现队列的操作
- 队列的实现(1):循环队列的实现
- 队列的实现(一)顺序队列的实现
- 队列的实现(链式)
- 队列的实现(数组)
- 队列实现 队列的链式结构实现
- WinCE 下编程需要IP地址控件咋办?
- 数组及指针的问题
- bootstrap-input 上传图片
- c++操作mysql
- PopupWindow 下拉选择
- 队列的实现(2):用链表实现队列
- 深入理解JavaScript 中为什么没有重载?
- Go1.6与JVM CMS的垃圾回收对比
- Windows平台下GCC编程之从键盘上输入一个3*3的整数矩阵,求其各行的平均值并输出,输出时保留两位小数
- 约束优化问题的KKT条件
- sublime text常用插件
- maven 基础知识笔记
- LayoutInflater
- 利用Opencv读取JPEG文件的压缩信息(量化表)