數(shù)據(jù)結(jié)構(gòu)和算法之一——線性表_3_鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)_3_雙鏈表

  1. 雙向鏈表概念
    雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針照卦,分別指向直接后繼和直接前驅(qū)。所以乡摹,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開(kāi)始役耕,都可以很方便地訪問(wèn)它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。(引用于:百度百科)

2.代碼部分
1)雙向鏈表節(jié)點(diǎn)結(jié)構(gòu):

//例1.
typedef struct node
{
    Elemtype data;
    struct node *previous;
    struct node *next;
}Node;

2)雙向鏈表的初始化和創(chuàng)建:

//例2
Status InitLinkList(Node **node)
{
    *node = (Node *)malloc(sizeof(Node));
    (*node)->next = *node;
    (*node)->previous = *node;
}

Status CreateLinkList(Node **node)      //這里創(chuàng)建的是循環(huán)雙向鏈表
{
    char i;
    Node *target, *temp, *temp2;

    target = *node;

    printf("Please input the elements you want in the LinkList(input 0 means stop input):");
    scanf("%c", &i);
    getchar();
    target->data = i;
    
    while(i)
    {
        temp = (Node *)malloc(sizeof(Node));
        scanf("%c", &i);
        if(i == '0') break;
        getchar();
        temp->data = i;
        temp2 = target;
        target->next = temp;
        target = target->next;
        target->previous = temp2;
        
    }

    target->next = *node;
    (*node)->previous = target;
}

3)雙向鏈表的插入:

//例3.
Status Insert(Node **node, int i, Elemtype e)
{
    Node *target, *temp;
    int j;
    target = *node;

    temp = (Node *)malloc(sizeof(Node));
    temp->data = e;

    if(i == 1)
    {
        temp->previous = target->previous;
        target->previous->next = temp;
        temp->next = target;
        target->previous = temp;
        *node = temp;//(target = temp;)?
    }
    else
    {
        for(j = 1; j < i; j++)
        {
            target = target->next;
        }
        temp->next = target;
        temp->previous = target->previous;
        target->previous->next = temp;
        target->previous = temp;
        //target->previous->next = temp;
        //temp->previous = target->previous;
        //temp->next = target;
        //target->previous = temp;
    }
}

4)雙向鏈表的刪除:(注意聪廉,這里創(chuàng)建的是循環(huán)雙向鏈表)

//例4.
Status Delete(Node **node, int i)
{
    Node *target, *temp;
    int j;
    target = *node;
        
    if(i == 1)
    {
        temp = target->next;
        temp->previous = target->previous;
        target->previous->next = temp;
        *node = temp;
    }   
    else
    {
        for(j = 1; j < i; j ++)
        {
            target = target->next;
        }
        target->previous->next = target->next;
        target->next->previous = target->previous;
    }
}
//例5瞬痘,總體框架代碼(注意,這里創(chuàng)建的是循環(huán)雙向鏈表)
#include<stdio.h>
#include<stdlib.h>

typedef void Status;
typedef int Elemtype;

typedef struct node
{
    Elemtype data;
    struct node *previous;
    struct node *next;
}Node;

Status InitLinkList(Node **node)
{
    *node = (Node *)malloc(sizeof(Node));
    (*node)->next = *node;
    (*node)->previous = *node;
}

Status CreateLinkList(Node **node)  
{
    char i;
    Node *target, *temp, *temp2;

    target = *node;

    printf("Please input the elements you want in the LinkList(input 0 means stop input):");
    scanf("%c", &i);
    getchar();
    target->data = i;
    
    while(i)
    {
        temp = (Node *)malloc(sizeof(Node));
        scanf("%c", &i);
        if(i == '0') break;
        getchar();
        temp->data = i;
        temp2 = target;
        target->next = temp;
        target = target->next;
        target->previous = temp2;
        
    }

    target->next = *node;
    (*node)->previous = target;
}

Status CreateLinkList2(Node **node)
{
    Elemtype i;
    Node *target, *temp, *temp2;

    target = *node;
    target->data = 65;
    for(i = 66; i <= 90; i++)
    {
        temp = (Node *)malloc(sizeof(Node));
        temp->data = i;
        target->next = temp;
        temp2 = target;
        target = target->next;
        temp2->next = target;
        target->previous = temp2;
    }
    target->next = *node;
    (*node)->previous = target;
}

Status Visit(Node *node)
{
    if(node)
    {
        printf("%c", node->data);
    }
}

Status TraversalLinkList(Node **node)       //正著看
{
    Node *target;
    target = *node;

    Visit(target);
    target = target->next;
    while(target != *node)
    {
        Visit(target);
        target = target->next;
    }
    printf("\n");
}

Status TraversalLinkList2(Node **node)      //倒著看
{
    Node *target;
    target = *node;

    target = target->previous;
    Visit(target);
    while(target != *node)
    {   
        target = target->previous;
        Visit(target);
    }
    printf("\n");
}

Status Insert(Node **node, int i, Elemtype e)
{
    Node *target, *temp;
    int j;
    target = *node;

    temp = (Node *)malloc(sizeof(Node));
    temp->data = e;

    if(i == 1)
    {
        temp->previous = target->previous;
        target->previous->next = temp;
        temp->next = target;
        target->previous = temp;
        *node = temp;//(target = temp;)?
    }
    else
    {
        for(j = 1; j < i; j++)
        {
            target = target->next;
        }
        temp->next = target;                //這里鏈接的次序需要格外注意
        temp->previous = target->previous;
        target->previous->next = temp;
        target->previous = temp;
        //target->previous->next = temp;
        //temp->previous = target->previous;
        //temp->next = target;
        //target->previous = temp;
    }
}

Status Delete(Node **node, int i)
{
    Node *target, *temp;
    int j;
    target = *node;
        
    if(i == 1)
    {
        temp = target→next;             //這里鏈接的次序需要格外注意
        temp->previous = target->previous;
        target->previous->next = temp;
        *node = temp;
    }   
    else
    {
        for(j = 1; j < i; j ++)
        {
            target = target->next;
        }
        target->previous->next = target->next;
        target->next->previous = target->previous;
    }
}

void main()
{
    Node *node;
    InitLinkList(&node);
    CreateLinkList(&node);  //使用該函數(shù)構(gòu)造鏈表的話由于scanf會(huì)輸入“\n”板熊,所以會(huì)造成插入框全、刪除錯(cuò)誤(然而插入getchar()函數(shù)可以去除scanf函數(shù)產(chǎn)生的“\n”)
    //CreateLinkList2(&node);
    TraversalLinkList(&node);
    Insert(&node, 6, 'u');
    TraversalLinkList(&node);
    Delete(&node, 2);
    Delete(&node, 5);
    TraversalLinkList(&node);
    TraversalLinkList2(&node);
}
  1. 例題:
    要求實(shí)現(xiàn)用戶輸入一個(gè)數(shù)使得 26 個(gè)字母的排列發(fā)生變化,例如用戶輸入 3 ,輸出結(jié)果:
    DEFGHIJKLMNOPQRSTUVWXYZABC
    同時(shí)需要支持負(fù)數(shù),例如用戶輸入 -3 ,輸出結(jié)果:
    XYZABCDEFGHIJKLMNOPQRSTUVW
//例6
#include<stdio.h>
#include<stdlib.h>

typedef char Elemtype;
typedef void Status;

typedef struct node 
{
    Elemtype data;
    struct node *next;
    struct node *previous;
}Node;

Status Traversal(Node **head)
{
    Node *target;

    target = *head;
    
    if (target)
    {
        printf("%c ", target->data);
        target = target->next;
        while(target && target != *head)
        {
            printf("%c ", target->data);
            target = target->next;
        }
    }
}

Status InitDoubleLinkList(Node **head)
{
    *head = (Node *)malloc(sizeof(Node));
    if(!(*head))
    {
        printf("ERROR! There is no more memory space!");
        exit(0);
    }
    (*head)->next = *head;
    (*head)->previous = *head;
}

Status CreateDoubleLinkList(Node **head)
{
    Node *target, *temp1, *temp2;
    char c = 65;
    int n;

    target = *head;
    target->data = c;
    
    for(n = 0, c = 66; n < 25; n++, c++)
    {
        temp1 = (Node *)malloc(sizeof(Node));
        temp1->data = c;
        temp2 = target;
        target->next = temp1;
        target = target->next;
        target->previous = temp2;
    }
    target->next = *head;
    (*head)->previous = target;
}

Status PlayWords(Node **head, int n)
{
    Node *target1, *target2;        //target1表示head, target2表示rear
    int i;
    target1 = *head;
    target2 = (*head)->previous;

    if(n > 0)
    {
        for(i = 1; i < n; i++)
        {
            target1 = target1->next;
        }
        *head = target1;
    }
    else if(n < 0)
    {
        for(i = -1; i > n; i--)
        {
            target2 = target2->previous;
        }
        *head = target2;
    }
}

void main()
{
    Node *L;
    int n;

    printf("Please input the number:");
    scanf("%d", &n);

    InitDoubleLinkList(&L);
    CreateDoubleLinkList(&L);
    Traversal(&L);
    printf("\n");
    PlayWords(&L, n);
    Traversal(&L);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末干签,一起剝皮案震驚了整個(gè)濱河市津辩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌容劳,老刑警劉巖喘沿,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異竭贩,居然都是意外死亡蚜印,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)娶视,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晒哄,“玉大人睁宰,你說(shuō)我怎么就攤上這事∏蘖瑁” “怎么了柒傻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵较木,是天一觀的道長(zhǎng)红符。 經(jīng)常有香客問(wèn)我,道長(zhǎng)伐债,這世上最難降的妖魔是什么预侯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮峰锁,結(jié)果婚禮上萎馅,老公的妹妹穿的比我還像新娘。我一直安慰自己虹蒋,他們只是感情好糜芳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著魄衅,像睡著了一般峭竣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晃虫,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天皆撩,我揣著相機(jī)與錄音,去河邊找鬼哲银。 笑死扛吞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盘榨。 我是一名探鬼主播喻粹,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼草巡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起型酥,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤山憨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后弥喉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體郁竟,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年由境,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棚亩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓖议。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖讥蟆,靈堂內(nèi)的尸體忽然破棺而出勒虾,到底是詐尸還是另有隱情,我是刑警寧澤瘸彤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布修然,位于F島的核電站,受9級(jí)特大地震影響质况,放射性物質(zhì)發(fā)生泄漏愕宋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一结榄、第九天 我趴在偏房一處隱蔽的房頂上張望中贝。 院中可真熱鬧,春花似錦臼朗、人聲如沸雄妥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)老厌。三九已至,卻和暖如春黎炉,著一層夾襖步出監(jiān)牢的瞬間枝秤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工慷嗜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淀弹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓庆械,卻偏偏與公主長(zhǎng)得像薇溃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缭乘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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