數(shù)據(jù)結(jié)構(gòu)與算法-線性表專題(三)-循環(huán)雙鏈表

循環(huán)雙鏈表

雙向鏈表也叫雙鏈表,是鏈表的一種址儒,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)衅疙。所以莲趣,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開(kāi)始,都可以方便地訪問(wèn)它的前驅(qū)結(jié)點(diǎn)后繼結(jié)點(diǎn)饱溢。一般我們都構(gòu)造雙向循環(huán)鏈表喧伞。

結(jié)點(diǎn)結(jié)構(gòu)

空鏈


0.數(shù)據(jù)結(jié)構(gòu)聲明

#define MAXSIZE 20 /* 存儲(chǔ)空間初始分配量 */
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OK 1

typedef int Status;/* Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等 */
typedef int ElementType;/* ElementType類型根據(jù)實(shí)際情況而定绩郎,這里假設(shè)為int */

//定義結(jié)點(diǎn)
typedef struct Node{
    ElementType data;
    struct Node *prior;
    struct Node *next;
}Node;

typedef struct Node * DoublyCycleLinkedList;

1.初始化


Status InitLinkList(DoublyCycleLinkedList *list){
    
    *list = (DoublyCycleLinkedList)malloc(sizeof(Node));
    if (*list == NULL) {
        return ERROR;
    }
    
    (*list)->next = (*list);
    (*list)->prior = (*list);
    
    //新增數(shù)據(jù)
    DoublyCycleLinkedList p = *list;
    for(int i=0; i < 10;i++){
        
        //1.創(chuàng)建1個(gè)臨時(shí)的結(jié)點(diǎn)
        DoublyCycleLinkedList temp = (DoublyCycleLinkedList)malloc(sizeof(Node));
        temp->data = i;
        
        //2.為新增的結(jié)點(diǎn)建立雙向鏈表關(guān)系
        //① temp 是p的后繼
        p->next = temp;
        //② temp 的前驅(qū)是p
        temp->prior = p;
        //③ temp的后繼是*list
        temp->next = (*list);
        //④ 頭結(jié)點(diǎn)的前驅(qū)指向新建的temp
        (*list)->prior = temp;
        //⑤ p 要記錄最后的結(jié)點(diǎn)的位置,方便下一次插入
        p = p->next;
    }
    
    return OK;
}

DoublyCycleLinkedList list;
ElementType temp,item;
InitLinkList(&list);

2.遍歷

Status Description(DoublyCycleLinkedList list){
    
    if (list == NULL) {
        printf("打印的雙向循環(huán)鏈表為空!\n\n");
        return ERROR;
    }
    printf("雙向循環(huán)鏈表內(nèi)容:  ");
    
    DoublyCycleLinkedList p = list->next;
    while (p != list) {

        printf("%d  ",p->data);
        p = p->next;
    }
    printf("\n\n");
    return OK;
}

Description(list);

3.插入結(jié)點(diǎn)



約定:當(dāng)插入位置超過(guò)鏈表長(zhǎng)度則插入到鏈表末尾

Status LinkListInsert(DoublyCycleLinkedList *list, int index, ElementType data){
   
    //1. 創(chuàng)建指針p,指向雙向鏈表頭
    DoublyCycleLinkedList p = (*list);
    int i = 1;
    
    //2.雙向循環(huán)鏈表為空,則返回error
    if(*list == NULL) return ERROR;
   
    //3.找到插入前一個(gè)位置上的結(jié)點(diǎn)p
    while (i < index && p->next != *list) {
        p = p->next;
        i++;
    }
    
    //4.如果i>index 則返回error
    if (i > index)  return ERROR;
    
    //5.創(chuàng)建新結(jié)點(diǎn)temp
    DoublyCycleLinkedList temp = (DoublyCycleLinkedList)malloc(sizeof(Node));
    
    //6.temp 結(jié)點(diǎn)為空,則返回error
    if (temp == NULL) return ERROR;
    
    //7.將生成的新結(jié)點(diǎn)temp數(shù)據(jù)域賦值e.
    temp->data = data;
    
    //8.將結(jié)點(diǎn)temp 的前驅(qū)結(jié)點(diǎn)為p;
    temp->prior = p;
    //9.temp的后繼結(jié)點(diǎn)指向p->next;
    temp->next = p->next;
    //10.p的后繼結(jié)點(diǎn)為新結(jié)點(diǎn)temp;
    p->next = temp;
    
    //如果temp 結(jié)點(diǎn)不是最后一個(gè)結(jié)點(diǎn)
    if (*list != temp->next) {
        
        //11.temp節(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)的前驅(qū)為temp 結(jié)點(diǎn)
        temp->next->prior = temp;
    }else{

        (*list)->prior = temp;
    }
    
    return OK;
}

printf("輸入要插入的位置和數(shù)據(jù)用空格隔開(kāi):");
scanf("%d %d",&temp,&item);
LinkListInsert(&list,temp,item);
Description(list);

4.刪除結(jié)點(diǎn)


/**
 循環(huán)雙鏈表刪除結(jié)點(diǎn)

 @param list 實(shí)例
 @param index 位置
 @param data 數(shù)據(jù)
 @return 狀態(tài)
 */
Status LinkListRemove(DoublyCycleLinkedList *list,int index,ElementType *data){
    
    int i = 1;
    DoublyCycleLinkedList temp = (*list)->next;
    
    if (*list == NULL) {
        return  ERROR;
    }
    
    //①.如果刪除到只剩下首元結(jié)點(diǎn)了,則直接將*list置空;
    if(temp->next == *list){
        free(*list);
        (*list) = NULL;
        return OK;
    }
    
    //1.找到要?jiǎng)h除的結(jié)點(diǎn)
    while (i < index) {
        temp = temp->next;
        if (temp != *list){
            i++;
        }
    }

    //2.給e賦值要?jiǎng)h除結(jié)點(diǎn)的數(shù)據(jù)域
    *data = temp->data;
    
    //3.修改被刪除結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的后繼指針
    temp->prior->next = temp->next;
    //4.修改被刪除結(jié)點(diǎn)的后繼結(jié)點(diǎn)的前驅(qū)指針
    temp->next->prior = temp->prior;
    //5. 刪除結(jié)點(diǎn)temp
    free(temp);
    
    return OK;
}

printf("輸入要?jiǎng)h除位置:");
scanf("%d",&temp);

LinkListRemove(&list, temp, &item);
printf("刪除鏈表位置為%d,結(jié)點(diǎn)數(shù)據(jù)域?yàn)?%d\n",temp,item);
Description(list);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末潘鲫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肋杖,更是在濱河造成了極大的恐慌溉仑,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兽愤,死亡現(xiàn)場(chǎng)離奇詭異彼念,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)浅萧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門逐沙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人洼畅,你說(shuō)我怎么就攤上這事吩案。” “怎么了帝簇?”我有些...
    開(kāi)封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵徘郭,是天一觀的道長(zhǎng)靠益。 經(jīng)常有香客問(wèn)我,道長(zhǎng)残揉,這世上最難降的妖魔是什么胧后? 我笑而不...
    開(kāi)封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮抱环,結(jié)果婚禮上壳快,老公的妹妹穿的比我還像新娘。我一直安慰自己镇草,他們只是感情好眶痰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著梯啤,像睡著了一般竖伯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上因宇,一...
    開(kāi)封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天七婴,我揣著相機(jī)與錄音,去河邊找鬼羽嫡。 笑死本姥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杭棵。 我是一名探鬼主播婚惫,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼魂爪!你這毒婦竟也來(lái)了先舷?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滓侍,失蹤者是張志新(化名)和其女友劉穎蒋川,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體撩笆,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捺球,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夕冲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氮兵。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖歹鱼,靈堂內(nèi)的尸體忽然破棺而出泣栈,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布南片,位于F島的核電站掺涛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏疼进。R本人自食惡果不足惜薪缆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颠悬。 院中可真熱鬧矮燎,春花似錦定血、人聲如沸赔癌。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灾票。三九已至,卻和暖如春茫虽,著一層夾襖步出監(jiān)牢的瞬間刊苍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工濒析, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留正什,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓号杏,卻偏偏與公主長(zhǎng)得像婴氮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盾致,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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