队列是从屁股进去 从头出来!
一:是不是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;
- }