資料結構中佇列的基本操作實現
阿新 • • 發佈:2019-02-10
佇列是一種特殊的線性表,在這種線性表中,刪除運算限定在表的一段進行,而插入運算限定在表的另一端進行,通常,約定把允許插入的一端稱為隊尾,把允許刪除的一端稱為隊首。佇列進出的原則是先進隊的先出隊,即先進先出原則。佇列在計算機程式設計中經常被用到,如Windows作業系統的訊息佇列。
接下來我們看一下佇列的資料結構,佇列可以採用鏈式或順序儲存結構來描述,這裡採用鏈式結構來進行表達。由於佇列需要在隊首以及隊尾進行刪除和插入操作,所以需要設定兩個指標來表示佇列,通常隊尾指標指向最後進入佇列的元素,為了便於表示空佇列,專門設定了一個頭結點,當佇列為空時,頭指標和尾指標均指向頭結點,佇列的基本操作有,構建一個空佇列、插入一個元素、刪除一個元素、計算佇列的長度、銷燬佇列。佇列的結構如下所示:
<span style="font-size:18px;">typedef struct lnode{
elementype data;
lnode* next;
}lnode;
typedef struct linkque{
lnode* front;
lnode* rear;
}linkque;
</span>
1、構建一個空佇列。<span style="font-size:18px;"> int QueueInti(linkque& q) { //建立一個頭結點; lnode* head=(lnode*)malloc(sizeof(lnode)); if(!head) { return 0; } q.front=head; q.rear=head; q.front->next=NULL; retuen 1; } </span>
2、插入一個元素,插入一個元素把該元素插入到佇列的尾部,並且修改尾部指標指向剛插入的元素。
int QueueInsert(linkque& q,elementype e)
{
lnode* p=(lnode*)malloc(sizeof(lnode));
if(!p)
{
return 0
}
p->data=e;
q.rear->next=p;
q.rear=p;
return 1;
}
3、從鏈式佇列q中刪除一個元素,如果佇列非空,則刪除佇列q中的隊首元素,用e返回其值。佇列中設定了頭結點,如果佇列中只有一個元素,刪除後佇列變為空佇列,需要將隊尾指標指向頭結點。
4、計算佇列的長度,求佇列的長度,即計算佇列中元素的個數。int QueueDelete(linkque& q,elementype &e) { if(q.front==q.rare) { return 0; } lnode* p=q.front->next; e=p->data; q.front->next=p->next; if(q.rare==p) q.rare=q.front; free(p); return 1; }
int QueueLength(linkque& q)
{
int i=0;
if(q.front==q.rara) return 0;
lnode* p=q.front->next;
while(p)
{
++i;
p=p->next;
}
return (i);
}
5、銷燬一個佇列,銷燬一個佇列實際上是從鏈式佇列的頭部開始,將所有的節點(包括頭結點)的空間都進行回收。如下:int QueueDestory(linkque& q)
{
lnode* p;
while(q.front)
{
q.rare=q.front->next;
free(q.front);
q.front=q.rare;
}
return 1;
}
6、總結:上述主要描述的是佇列的鏈式儲存,只要記住佇列的特性,隊首刪除,隊尾插入,就會很輕鬆的寫出佇列的基本操作,後續還會繼續介紹迴圈佇列以及一些特殊的佇列。