尾指標迴圈佇列

2021-10-07 14:39:37 字數 3476 閱讀 5905

佇列具有隊頭和隊尾,即頭指標和尾指標。本題要求只使用尾指標,在我們之前的 頭指標和計數器構成的迴圈佇列,我們使用了順序表構建只帶頭指標和計數器的佇列,在那篇文章中,我們使用頭指標和計數器找到了尾指標,所以能夠攻破題目。而此題只允許用乙個尾指標,該怎麼辦呢?

回想單鏈表知識,我們只根據頭結點可以找到鍊錶上的任意乙個結點,那麼相對應的,我們可以把單鏈表的頭結點當做是佇列的尾結點,將佇列的最後乙個資料元素的指標域指向佇列的尾結點(實際是單鏈表的頭結點),而尾結點的指標域直接指向佇列的第乙個資料結點,這樣就構成了乙個迴圈佇列(環),達到題目要求:帶頭結點,迴圈,只有尾指標。

接下來給大家畫一下過程,因為我在學資料結構這門課時,正是這道題我搞了好久,一直都是腦子憑空想,結果錯誤的思路剪不斷理還亂,第一次做沒有做出來,到第二次做的時候我首先畫了結構示意圖,根據示意圖來敲**,很快就敲出來啦,示意圖如下:

入隊:

出隊:

注:此**包含乙個標頭檔案《queue.h》和乙個測試原始檔《main.cpp》

queue.h:

#

pragma

once

#include

#include

typedef

int datatype;

//資料型別為int

//定義結點結構體

struct

node

;//定義佇列結構體,只有尾指標

struct

queue

;//初始化佇列

void

initiate

(queue *queue)

//判斷佇列是否為空

intisnotempty

(queue *queue)

//入隊函式

intqueuepush

(queue *queue,

int x)

node *q;

q =(node*

)malloc

(sizeof

(node));

//為新結點分配記憶體空間

q->data = x;

//新結點的資料域為x

q->next = queue->rear;

//新結點的下乙個結點是佇列尾結點

p->next = q;

//把新結點放在尾結點的前面,因為p現在指向的是尾結點的前乙個結點

printf

("入隊成功!\n");

return1;

}//出隊函式,將成功出隊的資料賦給d

intqueuepop

(queue *queue,

int*d)

node *q = queue->rear->next;

//q指向佇列第乙個結點

queue->rear->next = q->next;

//尾結點指標域直接指向原佇列第二個結點

*d = q->data;

//將出隊資料賦給d,帶出函式

free

(q);

//釋放記憶體空間

return1;

}//列印佇列函式

void

print

(queue *queue)

//遍歷輸出

while

(p->next != queue->rear)

printf

("\n");

}

main.c:
#

include

"queue.h"

intmain()

print

(p);

system

("pause");

int x;

/*測試出隊*/if(

queuepop

(p,&x)

)printf

("已取出資料:%d\n"

, x)

;print

(p);

system

("pause");

if(queuepop

(p,&x)

)printf

("已取出資料:%d\n"

, x)

;print

(p);

system

("pause");

if(queuepop

(p,&x)

)printf

("已取出資料:%d\n"

, x)

;print

(p);

system

("pause");

/*測試入隊*/

printf

("請輸入要入隊的資料:");

scanf_s

("%d"

,&data)

;queuepush

(p, data)

;print

(p);

system

("pause");

/*又測試出隊*/if(

queuepop

(p,&x)

)printf

("已取出資料:%d\n"

, x)

;print

(p);

system

("pause");

if(queuepop

(p,&x)

)printf

("已取出資料:%d\n"

, x)

;print

(p);

system

("pause");

if(queuepop

(p,&x)

)printf

("已取出資料:%d\n"

, x)

;print

(p);

system

("pause");

if(queuepop

(p,&x)

)printf

("已取出資料:%d\n"

, x)

;print

(p);

system

("pause");

return0;

}

測試一

測試二

測試三

**編譯器:visual studio 2017

ok,沒問題

迴圈鍊錶尾指標

1 對於兩個鍊錶之間的操作非常合適 include string.h include ctype.h include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define erro...

6 2 帶隊尾指標的迴圈鍊錶表示佇列 25分

toc 6 2 帶隊尾指標的迴圈鍊錶表示佇列 25分 假設以帶頭結點的迴圈鍊錶表示佇列,並且只設乙個指標指向隊尾元素結點 注意不設頭指標 試編寫相應的入隊和出隊演算法,實現根據使用者輸入的入隊個數和出隊個數完成資料先入隊後出隊的操作,並顯示資料出隊的順序。函式介面定義 void enqueue li...

迴圈鍊錶 建立(設定尾指標)

迴圈鍊錶設定尾指標可以通過尾指標即時找到頭節點 便於兩個迴圈鍊錶的合併!擼 單迴圈鍊錶是設定尾指標表示 合併迴圈鍊錶o 1 include include includeusing namespace std struct node node crate cir node head,int n he...