C語言學(xué)習(xí):鏈表的概念和其簡單操作

(一)什么是鏈表疏魏?

鏈表是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表钳踊,是一種在物理存儲單元上非連續(xù)非順序的存儲結(jié)構(gòu)衷敌。
鏈表有一系列節(jié)點構(gòu)成勿侯,節(jié)點在運行時動態(tài)生成,每個節(jié)點包括數(shù)據(jù)域缴罗,數(shù)據(jù)域存儲當(dāng)前節(jié)點的信息罐监,指針域存儲下一個節(jié)點的手地址。

(二)為什么要使用鏈表瞒爬?

  1. 順序存儲對空間的利用率不高弓柱;
  2. 內(nèi)存隨著時間的增加會找不到大塊的順序空間;
  3. 數(shù)組的大小只能是固定的侧但,增加或刪除都會移動大量數(shù)據(jù)矢空;
  4. 鏈?zhǔn)酱鎯Υ笮】梢陨炜s;
  5. 鏈?zhǔn)酱鎯寐矢摺?/li>

(三)單向鏈表和雙向鏈表

單向鏈表:每個元素包含一個指針域禀横,該指針域指向該元素的直接后繼元素屁药。
雙向鏈表:每個元素除了有一個指針域指向直接后繼元素以外,還有一個指針指向其直接前驅(qū)元素柏锄。
如果把最后一個節(jié)點的指針指向第一個結(jié)點酿箭,同時把第一個結(jié)點的前向指針指向最后一個結(jié)點,這樣就構(gòu)成單向循環(huán)鏈表和雙向循環(huán)鏈表趾娃。

(四)一個簡單案例

這是一個小的系統(tǒng)缭嫡,能實現(xiàn)幾項簡單的功能:創(chuàng)建鏈表、輸入數(shù)據(jù)抬闷、查看信息妇蛀、保存信息、讀取信息笤成、 刪除結(jié)點评架、 查找信息
以下為部分代碼:

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

typedef struct date
{
    char name[32];
    char pass[32];
    char id[32];
}DATE;

typedef struct head
{
    int len;
    struct node * pfhead;
}Head,*PH;

typedef struct node
{
    DATE date;
    struct node * next;
}NODE,*PN;

創(chuàng)建鏈表
功能:構(gòu)造一個鏈表頭
傳參:空
返回值:鏈表頭
調(diào)用函數(shù):無

PH create_list()
{
    PH phead=NULL;
    phead = (PH)malloc(sizeof(Head));
    phead->pfhead=NULL;
    phead->len=0;
    return phead;
}

獲取數(shù)據(jù)
功能:獲取數(shù)據(jù)
傳參:空
返回值:鏈表頭
調(diào)用函數(shù):無

PN getdate()
{
    PN pnode=NULL;
    pnode = (PN)malloc(sizeof(NODE));
    printf("請輸入以下信息:\n");
    printf("name:");
    scanf("%s",pnode->date.name);
    getchar();
    printf("pass:");
    scanf("%s",pnode->date.pass);
    getchar();
    printf("id:");
    scanf("%s",pnode->date.id);
    getchar();
    return pnode;
}

插入結(jié)點
功能:插入結(jié)點到鏈表中
傳參:鏈表頭
返回值:鏈表頭
調(diào)用函數(shù):獲取數(shù)據(jù)函數(shù) getdate()

PH insert_list(PH phead)
{
    NODE* node;
    int flag=0,i=0;
    while(1)
    {
        if(flag!=0)
        {
            printf("是否繼續(xù)添加:1繼續(xù),0結(jié)束\n");
            printf("你的選擇:");
            scanf("%d",&i);
            getchar();
            if(i == 0)
                break;
        }
        node = getdate();
        node->next=phead->pfhead;
        phead->pfhead=node;
        phead->len++;
        flag++;
    }
    return phead;
}

打印鏈表
功能:打印鏈表信息
傳參:鏈表頭
返回值:空
調(diào)用函數(shù):無

void print_list(PH phead)
{
    PN node=phead->pfhead;
    while(node!=NULL)
    {
        printf("%-8s%-8s%-8s\n",node->date.name,node->date.pass,node->date.id);
        node=node->next;
    }
    printf("任意鍵退出:");
    getchar();
}

查找數(shù)據(jù)
功能:查找數(shù)據(jù)成員
傳參:鏈表頭
返回值:無
調(diào)用函數(shù):無

void search_list(PH phead)
{
    PN node=phead->pfhead;
    char id[32];
    printf("請輸入ID:");
    scanf("%s",id);
    getchar();
    while(node->next!=NULL && strcmp(node->date.id,id)!=0)
    {
        node = node->next;
    }
    if(strcmp(node->date.id,id)==0)
    {
        printf("%-8s%-8s%-8s\n",node->date.name,node->date.pass,node->date.id); 
    }
    else
    {
        printf("查無此人\n");
    }
    printf("任意鍵退出:");
    getchar();
    return ;
}

刪除結(jié)點
功能:刪除結(jié)點
傳參:鏈表頭
返回值:鏈表頭
調(diào)用函數(shù):無

PH delete_list(PH phead)
{
    PN node=phead->pfhead;
    PN node2;
    char id[32];
    printf("請輸入ID:");
    scanf("%s",id);
    getchar();
    while(node->next!=NULL && strcmp(node->date.id,id)!=0)
    {
        node2=node;
        node = node->next;
    }
    if(strcmp(node->date.id,id)==0)
    {
        if(node == phead->pfhead)
            phead->pfhead=node->next;
        else
            node2->next=node->next;
        phead->len--;
    }
    else
    {
        printf("查無此人\n");
    }
    return phead;
}

保存信息
功能:保存信息到文件
傳參:鏈表頭
返回值:無
調(diào)用函數(shù):無

void save_list(PH phead)
{
    FILE * fp;
    if((fp=fopen("phead","w"))==NULL)
        {
            printf("打開文件失敗\n");
            exit(1);
        }
    PN node=phead->pfhead;
    while(node!=NULL)
    {
        fwrite(node,sizeof(NODE),1,fp);
        node=node->next;
    }
    fclose(fp);
    return ;
}

讀取信息
功能:從文件中讀取信息
傳參:空
返回值:鏈表頭
調(diào)用函數(shù):無

PH read_list()
{
    FILE * fp;
    if( (fp=fopen("phead","r"))==NULL)
    {
        printf("打開文件失敗\n");
        exit(1);
    }
    PH phead=(PH)malloc(sizeof(Head));
    phead->pfhead=NULL;
    PN node=(PN)malloc(sizeof(NODE));
    while(fread(node,sizeof(NODE),1,fp)>0)
    {
        node->next=phead->pfhead;
        phead->pfhead=node;
        phead->len++;
        node=(PN)malloc(sizeof(NODE));
    }
    fclose(fp);
    return phead;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炕泳,隨后出現(xiàn)的幾起案子纵诞,更是在濱河造成了極大的恐慌,老刑警劉巖培遵,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荤懂,居然都是意外死亡茁裙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門节仿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晤锥,“玉大人,你說我怎么就攤上這事》” “怎么了女轿?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長壕翩。 經(jīng)常有香客問我蛉迹,道長,這世上最難降的妖魔是什么放妈? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任北救,我火速辦了婚禮,結(jié)果婚禮上芜抒,老公的妹妹穿的比我還像新娘珍策。我一直安慰自己,他們只是感情好宅倒,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布攘宙。 她就那樣靜靜地躺著,像睡著了一般拐迁。 火紅的嫁衣襯著肌膚如雪蹭劈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天线召,我揣著相機與錄音铺韧,去河邊找鬼。 笑死灶搜,一個胖子當(dāng)著我的面吹牛祟蚀,可吹牛的內(nèi)容都是我干的工窍。 我是一名探鬼主播割卖,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼患雏!你這毒婦竟也來了鹏溯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淹仑,失蹤者是張志新(化名)和其女友劉穎丙挽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匀借,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡颜阐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吓肋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凳怨。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肤舞,到底是詐尸還是另有隱情紫新,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布李剖,位于F島的核電站芒率,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏篙顺。R本人自食惡果不足惜偶芍,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望德玫。 院中可真熱鬧腋寨,春花似錦、人聲如沸化焕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撒桨。三九已至查刻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凤类,已是汗流浹背穗泵。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谜疤,地道東北人佃延。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像夷磕,于是被迫代替她去往敵國和親履肃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

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

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,519評論 1 51
  • 大學(xué)的時候不好好學(xué)習(xí)坐桩,老師在講臺上講課尺棋,自己在以為老師看不到的座位看小說,現(xiàn)在用到了老師講的知識绵跷,只能自己看書查資...
    和玨貓閱讀 1,445評論 1 3
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結(jié)點至多有m個孩子膘螟。 除根結(jié)點和葉子結(jié)點外,其它每個結(jié)點至少有m...
    文檔隨手記閱讀 13,230評論 0 25
  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別碾局? C沒有Protection行為...
    阿面a閱讀 7,663評論 0 10
  • 夢的哲思 你覺得夢是什么荆残? 是困的妥協(xié)物質(zhì), 還是精神的主宰净当? 夢是柔軟的内斯, 是人類的第二個世界, 同現(xiàn)實的世界是...
    片刻靈光mieco閱讀 169評論 0 2