(这题考的是链队列的出队,几乎书本例题,考试有两题 左右)
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;
}- 1 回答
- 0 關注
- 6556 瀏覽
添加回答
舉報
0/150
提交
取消
