隊(duì)列的鏈?zhǔn)奖硎竞蛯?shí)現(xiàn)(鏈隊(duì))

鏈隊(duì):隊(duì)列的鏈?zhǔn)奖硎竞蛯?shí)現(xiàn)

相應(yīng)函數(shù)定義

InitQueue(&Q);                  構(gòu)造空隊(duì)列
DestroyQueue(&Q);               銷(xiāo)毀隊(duì)列
ClearQueue(&S);                 清空隊(duì)列
QueueEmpty(S);                  判空.空-TRUE
QueueLength(Q);                 取隊(duì)列長(zhǎng)度
GetHead(Q, &e);                 取隊(duì)頭元素
EnQueue(&Q, e);                 入隊(duì)列
DeQueue(&Q, &e);                出隊(duì)列
QueueTraverse(Q, visit());      遍歷

頭文件寝杖、宏定義

#include<stdlib.h>      // 使用exit(0)時(shí)需要引用頭文件
#define MAXSIZE 100
#define ElemType int
// 以下為使用Status的配套操作
#define Status int
#define OK 1
#define Error 1

定義結(jié)構(gòu)體

#define ElemType int 
typedef struct QNode        // 當(dāng)定義鏈?zhǔn)浇Y(jié)構(gòu)(需要定義指針時(shí)),記得需要再struct后面加類(lèi)名
{
    ElemType data;
    struct QNode* next;     // 這個(gè)記得要寫(xiě)對(duì),就算定義鏈?zhǔn)浇Y(jié)構(gòu)中next指針時(shí)記得加struct
}QNode, *QueuePtr;

typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;

鏈隊(duì)初始化

  • step 1 : 生成新節(jié)點(diǎn)作為頭結(jié)點(diǎn)宛渐,隊(duì)頭和隊(duì)尾指針都指向此結(jié)點(diǎn)展氓。
  • step 2 : 頭結(jié)點(diǎn)的指針域取為NULL
Status InitQueue(LinkQueue& Q)
{
    // 生成新節(jié)點(diǎn)作為頭結(jié)點(diǎn)申钩,對(duì)頭和隊(duì)尾指針指向該結(jié)點(diǎn)
    Q.front = Q.rear = new QNode;
    Q.front->next = NULL;   //頭結(jié)點(diǎn)的指針與置空
    return OK;
}

判斷鏈隊(duì)是否為空

bool EmptyQueue(LinkQueue Q)
{
    return Q.front == Q.rear;
}

求鏈隊(duì)的隊(duì)頭元素

  • 記得判斷隊(duì)列是否非空
Status GetHeadQueue(LinkQueue Q, ElemType& e)
{
    if (Q.front == Q.rear) return Error;  // 判斷隊(duì)列是否非空
    e = Q.front->data;
    return OK;
}

鏈隊(duì)入隊(duì)

  • step 1:為入隊(duì)元素分配結(jié)點(diǎn)空間颂碧,用指針p指向
  • step 2:將新結(jié)點(diǎn)數(shù)據(jù)域置為e塑煎,指針域置為空
  • step 3:將新結(jié)點(diǎn)插入到隊(duì)尾
  • step 4:修改隊(duì)尾指針為p
Status EnQueue(LinkQueue& Q, ElemType e)
{
    // 鏈隊(duì)不需要判斷是否隊(duì)滿(mǎn)
    QNode* p = new QNode;   // 為入隊(duì)元素分配結(jié)點(diǎn)空間沫换,用指針p指向
    p->data = e;            // 將新結(jié)點(diǎn)數(shù)據(jù)域置為e
    p->next = NULL;
    Q.rear->next = p;       // 將新結(jié)點(diǎn)插入到隊(duì)尾
    Q.rear = p;             // 修改隊(duì)尾指針
    return OK;
}
思考:鏈隊(duì)**需要頭結(jié)點(diǎn)**,因?yàn)楫?dāng)沒(méi)有頭結(jié)點(diǎn)時(shí)最铁,我們需要判斷是否為第一個(gè)結(jié)點(diǎn)讯赏,如果為第一個(gè)結(jié)點(diǎn),那么就將`front`以及`rear`指針指向第一個(gè)結(jié)點(diǎn)冷尉,

鏈隊(duì)出隊(duì)

  • step 1:判斷隊(duì)列是否為空漱挎,若空著返回Error
  • step 2:臨時(shí)保存隊(duì)頭元素的空間,已備釋放
  • step 3:修改頭結(jié)點(diǎn)的指針域雀哨,使其指向下一個(gè)結(jié)點(diǎn)
  • step 4:判斷出隊(duì)元素是否為最后一個(gè)元素磕谅,若是,則將隊(duì)尾指針重新賦值雾棺,指向頭結(jié)點(diǎn)膊夹。
  • step 5:釋放原始隊(duì)頭元素的空間
Status DeQueue(LinkQueue& Q, ElemType& e)
{
    if (Q.front == Q.rear) return Error;
    QNode* p = new QNode;
    p = Q.front->next;                  // p 指向首元結(jié)點(diǎn)
    e = Q.front->data;                  // e保存隊(duì)頭結(jié)點(diǎn)的數(shù)據(jù)域
    Q.front = Q.front->next;            // 修改頭結(jié)點(diǎn)的指針域
    if (Q.rear == p) Q.rear = Q.front;  // 若刪的是最后一個(gè)元素,則修改隊(duì)尾指針指向頭結(jié)點(diǎn)
    delete p;                           // 釋放原隊(duì)頭元素的空間
    return OK;
}
思考:鏈隊(duì)**需要頭結(jié)點(diǎn)**捌浩,因?yàn)楫?dāng)沒(méi)有頭結(jié)點(diǎn)時(shí)放刨,如果鏈隊(duì)出完后為空,那么我需要將`front`和`rear`指針置空尸饺,又會(huì)多一步判斷进统。

銷(xiāo)毀鏈表

  • rear指針當(dāng)做第三方指針,用于記錄front->next指針浪听,然后刪除前一個(gè)指針螟碎,直到front指針為空,那么就刪除完了馋辈。
Status DestroyQueue(LinkQueue& Q)
{
    while (Q.front)
    {
        Q.rear = Q.front->next;
        delete Q.front;
        Q.front = Q.rear;
    }
    return OK;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抚芦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子迈螟,更是在濱河造成了極大的恐慌叉抡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件答毫,死亡現(xiàn)場(chǎng)離奇詭異褥民,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)洗搂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)消返,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)载弄,“玉大人,你說(shuō)我怎么就攤上這事撵颊∮罟ィ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵倡勇,是天一觀的道長(zhǎng)逞刷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)妻熊,這世上最難降的妖魔是什么夸浅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮扔役,結(jié)果婚禮上帆喇,老公的妹妹穿的比我還像新娘。我一直安慰自己亿胸,他們只是感情好坯钦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著损敷,像睡著了一般葫笼。 火紅的嫁衣襯著肌膚如雪深啤。 梳的紋絲不亂的頭發(fā)上拗馒,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音溯街,去河邊找鬼诱桂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呈昔,可吹牛的內(nèi)容都是我干的挥等。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼堤尾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肝劲!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起郭宝,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辞槐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后粘室,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體榄檬,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年衔统,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹿榜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片海雪。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舱殿,靈堂內(nèi)的尸體忽然破棺而出奥裸,到底是詐尸還是另有隱情,我是刑警寧澤沪袭,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布刺彩,位于F島的核電站,受9級(jí)特大地震影響枝恋,放射性物質(zhì)發(fā)生泄漏创倔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一焚碌、第九天 我趴在偏房一處隱蔽的房頂上張望畦攘。 院中可真熱鬧,春花似錦十电、人聲如沸知押。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)台盯。三九已至,卻和暖如春畏线,著一層夾襖步出監(jiān)牢的瞬間静盅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工寝殴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒿叠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓蚣常,卻偏偏與公主長(zhǎng)得像市咽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抵蚊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容