C語言鏈表學習筆記_P794

寫在前面:

  • 1.首先鏈表的本質(zhì)只是一種特殊的結(jié)構(gòu)體,所以C語言當作并沒有現(xiàn)成的函數(shù)去幫助你延長鏈表或者幫助你輸出鏈表,所有的東西全部需要靠你自己.
  • 2.學習鏈表之前需要的預(yù)備知識:結(jié)構(gòu)體,指針,動態(tài)內(nèi)存分配.
    P.S.鏈表本身并不需要動態(tài)內(nèi)存分配,但是可以確保你在函數(shù)中生成的鏈表所占用的內(nèi)存不會在函數(shù)結(jié)束后被釋放.
    PP.SS.如果你看不懂上面那句話,不明白我在說什么可以學習一下C語言中變量的生存周期和動態(tài)內(nèi)存分配.

1.什么是鏈表

在之前已經(jīng)說過鏈表不過是定義特殊的結(jié)構(gòu)體
先來在邏輯上理解一下鏈表
這里借用一下另一個blog的圖片:https://blog.csdn.net/morixinguan/article/details/68951912

image

鏈表這種結(jié)構(gòu)體的特殊之處在于有一個*next.
*next為一個指向這種結(jié)構(gòu)體的下一個節(jié)點的指針,這種結(jié)構(gòu)體中均有一個*next
當你訪問首位鏈表時*next中存放了鏈表中的下一個節(jié)點的地址如此將本互不相連的若干個結(jié)構(gòu)體連接了起來,同時這些結(jié)構(gòu)體數(shù)據(jù)類型又相同如此起到了一種類似于數(shù)組卻比數(shù)組更加方便的數(shù)據(jù)類型,被稱為鏈表.
這條鏈從Head開始(即鏈表第一個節(jié)點的地址)最后一個節(jié)點依然有*next不過它的值等于NULL.

2.如何定義一個鏈表

如下是一個鏈表的定義.

struct student {
    int num,score;//這就是我們所說的數(shù)據(jù)域
    struct student *next;
};//定義一個結(jié)構(gòu)體(鏈表) 

數(shù)據(jù)的多少名稱大小都可以自己定義.

3.如何使用

定義好了鏈表接下來便是如何使用它
這里我便以例代講:


題目
#include<stdio.h>
#include<malloc.h>

/* User Code Begin(考生可在本行后添加代碼没咙,定義程序中使用的結(jié)構(gòu)體類型诽俯、聲明自定義函數(shù)的原型膏执,行數(shù)不限) */

struct student {
    int num,score;
    struct student *next;
};//定義一個結(jié)構(gòu)體(鏈表) 

struct student *creat(void);
struct student *merge(struct student*a,struct student*b);
/* User Code End(考生添加代碼結(jié)束) */

/* print以規(guī)定的格式完成遍歷顯示指定的鏈表 */
void print(char *Info, struct student *Head);

int main(void)
{   
    struct student *ah, *bh;
    
    printf("創(chuàng)建鏈表A驮吱,請輸入學號及成績(均輸入為0時表示停止):\n");
    ah = creat();
    printf("\n創(chuàng)建鏈表B,請輸入學號及成績(均輸入為0時表示停止):\n");
    bh = creat();

    print("\n鏈表A:", ah);
    print("\n鏈表B:", bh);
    
    ah = merge(ah, bh);
    print("\n鏈表A劣像、B合并后:", ah);
    
    return 0;
}

void print(char *Info, struct student *Head)
{
    printf("%s", Info);
    while (Head != NULL)
    {
        printf("%d,%d  ", Head->num, Head->score);
        Head = Head->next;
    }
}

/* User Code Begin(考生在此后完成自定義函數(shù)的設(shè)計项玛,行數(shù)不限) */
struct student *creat(void)//定義函數(shù)建立鏈表
{
    struct student *Head,*p1,*p2;//*Head是這個鏈表的首地址單獨定義并且保存下來
    int n=1;
    Head=p1=p2=(struct student*)malloc(sizeof(struct student));
    while(1)
    {
        printf("學生 %d: ",n);
        scanf("%d %d",&(p2->num),&(p2->score));
//通過p2保存輸入的數(shù)據(jù)
        if(p2->num==0 && p2->score==0)
//普判斷是否要結(jié)束輸入
        {
            if(n==1)
            {
                return NULL;//如果沒有輸入任何數(shù)據(jù)就直接要求結(jié)束輸入就返回NULL
            }
            return Head;//否則返回鏈表首地址
        }
        if(Head==NULL)//判斷是否是第一位鏈表
        {
            //如果是鏈表的第一位的話執(zhí)行如下操作
            Head=p2;//做為Head保存下來
            p1=p2;//同時賦值給p1方便修改next
            p2= (struct student *)malloc(sizeof(struct student));//為p2分配新地址
        }
        else
        {
            //如果不是第一位的話:
            p1->next=p2;//為p1中next賦值為p2
            p2->next=NULL;//將p2中next定義為null
            p1=p2;//將p2的地址賦值給p1
            p2= (struct student *)malloc(sizeof(struct student));
            //為p2分配新的地址
        }
        n++;    
    }
}

struct student *merge(struct student *a,struct student *b)//定義函數(shù)合并兩個鏈表
{
    struct student *HEAD=a;
    struct student *mid=NULL;
    while(1)
    {
        if(a==NULL)
        {
            HEAD=b;
            return HEAD;
        }
        if(a->next==NULL)
        {
            a->next=b;
            return HEAD;
        }
        else
        {
            a=a->next;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子稚新,更是在濱河造成了極大的恐慌勘伺,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褂删,死亡現(xiàn)場離奇詭異飞醉,居然都是意外死亡,警方通過查閱死者的電腦和手機屯阀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門冒掌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹲盘,你說我怎么就攤上這事股毫。” “怎么了召衔?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵戒财,是天一觀的道長裸影。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么牲阁? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任椎镣,我火速辦了婚禮物邑,結(jié)果婚禮上导坟,老公的妹妹穿的比我還像新娘。我一直安慰自己悠栓,他們只是感情好霉涨,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惭适,像睡著了一般笙瑟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上癞志,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天往枷,我揣著相機與錄音,去河邊找鬼凄杯。 笑死错洁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的戒突。 我是一名探鬼主播屯碴,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼妖谴!你這毒婦竟也來了窿锉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤膝舅,失蹤者是張志新(化名)和其女友劉穎嗡载,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仍稀,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡洼滚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了技潘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遥巴。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖享幽,靈堂內(nèi)的尸體忽然破棺而出铲掐,到底是詐尸還是另有隱情,我是刑警寧澤值桩,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布摆霉,位于F島的核電站,受9級特大地震影響奔坟,放射性物質(zhì)發(fā)生泄漏携栋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一咳秉、第九天 我趴在偏房一處隱蔽的房頂上張望婉支。 院中可真熱鬧,春花似錦澜建、人聲如沸向挖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽户誓。三九已至,卻和暖如春幕侠,著一層夾襖步出監(jiān)牢的瞬間帝美,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工晤硕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悼潭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓舞箍,卻偏偏與公主長得像舰褪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疏橄,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

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