链队列的建立、判空、入队、出队、求长、访头、清空和销毁
来源:互联网 发布:内外网络切换软件 编辑:程序博客网 时间:2024/04/29 08:16
队列是从屁股进去 从头出来!
一:是不是Q.front只是记录队列的头结点的地址,里面没有data,Q.rear的是记录队列的末节点地址,里面有data? 二:
Qnode *p; p=(QNode*)malloc(sizeof(QNode)); if(p==NULL) exit(OVERFLOW); p->next=NULL p->data=e; Q.rear->next=p; Q.rear=p;
同学你好:我看了你的问题,你问的两个问题的解析在下面,希望能采纳一 :你说的第一个问题是对的:是不是Q.front只是记录队列的头结点的地址,里面没有data,Q.rear的是记录队列的末节点地址,里面有data? 解析:是这样的,不管是数组形式的循环队列还是链式的队列,front和rear只是存放对头和队未的地址。数组时头尾的下表,链式的队列是地址。总之都是地址。 二:这段程序中Q.rear->next=p是不是多余的?去掉的话会有什么影响?解析:你的说不对。首先,要将一个新的节点入队,就要Q.rear->next = p;这是入队操作。简单点说就是将p挂在rear后面,然后让原来的rear指向新的p;也就是接下来的一步:Q.rear = p;如果没有这步就没有实现将新节点p入队。所以这步是必须的,不是多余的。
- #include<iostream>
- using namespace std;
- typedef struct node
- {
- int data;
- struct node *next;
- }Node;
- //头指针和尾指针
- typedef struct
- {
- Node *front;
- Node *rear;
- }Queue;
- void initQueue(Queue &Q)
- {
- Q.front = Q.rear = new Node;
- Q.front->next = NULL;
- }
- bool isEmptyQueue(Queue &Q)
- {
- if(NULL == Q.front) //此时链队列被销毁
- {
- cout << "链队列不存在." << endl;
- exit(1);
- }
- if(Q.rear == Q.front)//此时链队列为空
- return true;
- return false;
- }
- void enterQueue(Queue &Q, int element)
- {
- Node *p = new Node;
- p->next = NULL;
- p->data = element;
- Q.rear->next = p;
- Q.rear = p;
- }
- int deQueue(Queue &Q)
- {
- int outElement;
- if(isEmptyQueue(Q))
- exit(1);
- Node *p = Q.front->next;
- outElement = p->data;
- Q.front->next = p->next;
- if(Q.rear == p) //需要特殊处理
- Q.rear = Q.front;
- delete p;
- return outElement;
- }
- int getLength(Queue &Q)
- {
- Node *p1 = Q.front;
- Node *p2 = Q.rear;
- int length = 0;
- while(p1 != p2)
- {
- p1 = p1->next;
- length++;
- }
- return length;
- }
- int getHead(Queue &Q)
- {
- if(isEmptyQueue(Q))
- exit(1);
- return Q.front->next->data;
- }
- void clearQueue(Queue &Q)
- {
- while(!isEmptyQueue(Q))
- deQueue(Q);
- }
- void destroyQueue(Queue &Q)
- {
- clearQueue(Q);
- delete Q.front;
- Q.front = Q.rear = NULL;
- }
- int main()
- {
- Queue Q;
- initQueue(Q);
- cout << getLength(Q) << endl;
- int i;
- for(i = 1; i <= 10; i++)
- enterQueue(Q, i);
- cout << getHead(Q) << endl;
- cout << getLength(Q) << endl;
- while(!isEmptyQueue(Q))
- cout << deQueue(Q) << " ";
- cout << endl;
- if(isEmptyQueue(Q))
- cout << "yes" << endl;
- else
- cout << "no" << endl;
- destroyQueue(Q);
- if(isEmptyQueue(Q))
- cout << "yes" << endl;
- else
- cout << "no" << endl;
- return 0;
- }
0 0
- 链队列的建立、判空、入队、出队、求长、访头、清空和销毁
- 链队列的建立、判空、入队、出队、求长、访头、清空和销毁
- 链队列的建立、判空、入队、出队、求长、访头、清空和销毁
- 链队列和循环队列的表示与实现-初始化、判空、求长、入队、出队、遍历、求头、求尾、清队、毁队
- 链栈的建立、判空、入栈、出栈、求长、访顶、清空和销毁
- 链栈的建立、判空、入栈、出栈、求长、访顶、清空和销毁
- 链式栈的初始化,判空,进栈,出栈,求长,求顶,打印,清空和销毁
- 队列:出队、入队、销毁、清空等
- 顺序栈的初始化,进栈、出栈、求长、判空、访顶、遍历、清空、销毁
- 链队列、循环队列的实现(初始化、出队、入队、取队头元素、判空)
- c之队列相关操作------初始化,入队,出队,队列清空,销毁,遍历
- 链队列的初始化、出队、入队、取队头元素、判空
- 顺序循环队列基本操作(入队,出队,清空,销毁,历遍)
- 循环顺序队列(初始化、入队、出队、判空)
- 链对列初始化/入队列/出队列/判空
- 链栈初始化、进栈、出栈、判空、遍历、求长、求顶、清栈、毁栈
- 队列 入队,插入,出队,是否队空,队元元素,清空,打印
- 【C++】容器适配器实现队列Queue的各种功能(入队、出队、判空、大小、访问所有元素等)
- [Android NDK.01] 启程
- SRAM、DRAM、NorFlash、NandFlash
- 理论到实践,A/B测试不得不直面的4个统计学问题
- 什么是时间导数(Time derivative)
- android源码资源
- 链队列的建立、判空、入队、出队、求长、访头、清空和销毁
- qt中关于设置颜色(QPalette和QPixmap)
- Java IO流操作汇总: inputStream 和 outputStream
- 嵌入式Qt开发之环境配置
- Oracle中rank() over, dense_rank(), row_number() 的区别
- 15-插入有序数组中
- 懒加载fragment基类
- 题解 广东工业大学 新生赛 2016-12-04
- 流(读取/写入)