亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Q->rear=Q->front//是銷毀隊列的意思嗎?

Q->rear=Q->front//是銷毀隊列的意思嗎?

溯源1 2017-06-27 20:50:55
(这题考的是链队列的出队,几乎书本例题,考试有两题 左右) 1.Int DeQueue(LinkQueue *Q,ElemType *e) {  LinkQueueNode *p; If(Q->front=Q->rear) Return  False;    P=Q.front->next                    ; (从队头取出第一个结点)) *e=p->data;    Q.front->next=p->next                       (结点P出队) If(Q->rear==p) Q->rear=Q->front//是销毁队列的意思吗? Free(p); Return true;  }
查看完整描述

1 回答

?
I_尼克哇

TA貢獻56條經驗 獲得超25個贊

只是單獨看DeQueue這個函數不能直觀的了解相關用途,要知道Q->rear=Q->front 是什么意思,需要了解初始化函數的實現:

//初始化隊列
Status?InitQueue(LinkQueue?&Q){
	//初始化的節點并未給data賦值,相當于頭結點,我們可以用他來存隊列長度
	Q.front?=?Q.rear?=?(QueuePtr)malloc(sizeof(Node));?//注意front和rear指針指向的是同一個內存地址
	if(!Q.rear){
		exit(OVERFLOW);
	}
	Q.front->data?=?0;//長度初始化為0
	Q.front->next?=?NULL;
	return?OK;
}

上面初始化隊列初始化了一個頭節點,利用Node這個結構做兩件事,1. 存儲隊列長度。2. front->next指針將來是要指向最早進入隊列的一個結點地址;rear->next是要指向最后進入隊列的一個結點地址。

再看入隊函數:

//入隊
Status?EnQueue(LinkQueue?&Q,ElemType?e){
????????//申請結點空間,用來存儲新的結點數據
	QueuePtr?p?=?(QueuePtr)malloc(sizeof(Node));
	if(!p){
		exit(OVERFLOW);
	}
	p->data?=?e;?//將具體數據e存儲到data中
	p->next??=?NULL;?//新進來的結點下一個肯定是空的,所以這里賦值NULL
	Q.rear->next?=?p;//連接p節點,將上一個結點的next指針指向到最后進來的結點地址(空的隊列上一個結點就是首結點,front和rear都指向這里)
	Q.rear?=?p;//移動rear指針始終指向尾部,將指向上一個結點地址的rear移動指向到最后進來的結點
	Q.front->data++;
	return?OK;
}

看出隊函數:

//出隊,早進早出
Status?DeQueue(LinkQueue?&Q,ElemType?&e){
	if(Q.rear?==?Q.front){//隊列為空,初始化隊列時兩個指針指向到同一個地址,所以相同的時候就是空隊列
		return?ERROR;
	}
	QueuePtr?p?=?Q.front->next;//跳過頭結點,頭結點是存儲隊列長度的,但next指向了最早進入隊列的結點
	e?=?p->data;?//實際數據
	Q.front->next?=?p->next;?//在注銷p結點之前,應該把頭結點的next指向到p的下一個結點
	if(p?==?Q.rear){//如果除了頭結點外只有一個節點,重點來了,Q.rear因為指向的是最后一個結點地址,這里意思就是如果p是最后一個結點
		Q.rear?=?Q.front;//將Q.rear復位會首結點,如果不執行這步,free(p)后Q.rear也將不復存在并成為野指針
	}
	free(p);
	Q.front->data--;
	return?OK;
}


查看完整回答
反對 回復 2017-06-28
  • 1 回答
  • 0 關注
  • 6556 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號