生活随笔
收集整理的這篇文章主要介紹了
数据结构-队列之链式队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
隊列的鏈式表示稱為鏈隊列,它實際上是一個同時帶有隊頭指針和隊尾指針的單鏈表。頭指針指向隊頭節點,尾指針指向隊尾節點,即單鏈表的最后一個節點。
當q.front==NULL且q.rear==NULL時,鏈式隊列為空。
出隊時,首先判斷隊列是否為空,如果不為空,則取出隊頭元素,將其從鏈表中刪除,并讓q.front指向下一個節點(若該節點為最后一個節點,則置q.front和q.rear都為null)。
入隊時,建立一個新節點,將新節點插入到鏈表的尾部,并改讓q.rear指向這個新插入的節點(若原隊列為空隊,則令q.front也指向該節點)。
不難看出,不設頭結點的鏈式隊列在操作上往往比較麻煩,因此,通常將鏈式隊列設計成一個帶頭結點的單鏈表,這樣插入和刪除操作就統一了,如圖所示
用單鏈表表示的鏈式隊列特別適合于數據元素變動比較大的情形,而且不存在隊列滿且產生溢出的問題。另外,加入程序中要使用多個隊列,最好使用鏈式隊列,這樣就不會出現存儲分配不合理和“溢出”的問題。
//隊列之鏈式隊列#include "stdafx.h"
#include "stdlib.h"#define ElementType int
//鏈式隊列的節點
typedef struct {ElementType data;//數據域LinkNode *next;//節點指針域
}LinkNode;//鏈式隊列
typedef struct {LinkNode *front, *rear;//隊列的頭指針和尾指針
}LinkQueue;/*
鏈式隊列初始化
1.建立頭結點,且隊列的頭指針和尾指針都指向該頭結點
2.頭指針的指針域為null
*/
void InitQueue(LinkQueue &q) {q.front = q.rear = (LinkNode *)malloc(sizeof(LinkNode));q.front->next = NULL;
}
/*
判斷鏈式隊列是否為空
1.因為我們采用的是帶頭結點的鏈式隊列,所以頭指針始終是指向頭結點的,當隊列為空時,讓尾指針也指向頭結點
2.所以當頭指針和尾指針相等時即隊列為空
*/
bool QueueEmpty(LinkQueue q) {if (q.front == q.rear) {return true;}return false;
}
/*
入隊操作
*/
void EnQueue(LinkQueue &q, ElementType e) {//開辟新節點空間LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));s->data = e;//數據域q.rear->next = s;//尾指針指針域指向新節點q.rear = s;//尾指針節點位置移動
}
/*
出隊操作
*/
ElementType Dequeue(LinkQueue &q) {//是否為空if (QueueEmpty) {return NULL;}LinkNode *s = q.front->next;//獲取需要出隊的節點int e = s->data;//數據域賦值q.front->next = s->next;//將需要出隊節點的指針域賦值給頭指針的指針域if (s == q.rear) {//判讀是否該鏈式隊列中只有一個節點了,如果是則將頭指針和尾指針都指向頭結點即空隊列//頭指針始終是指向頭結點的q.rear = q.front;}free(s);return e;
}
/*
銷毀一個鏈式隊列
*/
void DestoryQueue(LinkQueue &q) {while (q.front->next){LinkNode *s = q.front->next;q.front->next = s->next;free(s);}
}
?
總結
以上是生活随笔為你收集整理的数据结构-队列之链式队列的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。