1. 主页 > 好文章

C语言链表操作方法详解:创建、插入、删除与遍历实例


鈥?strong>鈥嬧€滃搸锛屽C璇█鐨勬椂鍊欙紝閾捐〃鏄笉鏄€昏浣犲ご澶э紵涓哄暐鍒汉鐨勪唬鐮佽兘璺戯紝鑷繁涓€鍐欏氨宕╋紵鈥濃€?/strong>鈥?br/> 鍒厡锛屼粖澶╁挶浠氨鎺板紑浜嗘弶纰庝簡鑱婇摼琛ㄣ€備笉鏁撮偅浜涜櫄鐨勶紝鐩存帴涓婁唬鐮併€佽鍦烘櫙锛屼繚璇佷綘鍚畬鑳藉姩鎵嬪啓鍑鸿嚜宸辩殑閾捐〃銆傚噯澶囧ソ浜嗗悧锛熻蛋璧凤紒


涓€銆侀摼琛ㄥ埌搴曟槸鍟ワ紵涓哄暐涓嶇敤鏁扮粍锛?/h3>

锛堟暡榛戞澘锛夊厛瑙e喅鏈€鏍规湰鐨勯棶棰橈細鈥?strong>鈥嬮摼琛ㄥ瓨鍦ㄧ殑鎰忎箟鈥?/strong>鈥嬨€?br/> 浣犲彲鑳戒細闂細鈥滅敤鏁扮粍瀛樻暟鎹笉棣欏悧锛熲€?涓句釜鏍楀瓙馃尠锛氭兂璞′綘姝e湪寮€鍙戝鐢熺鐞嗙郴缁燂紝浠婂ぉ瑕佸姞5涓汉锛屾槑澶╄鍒?涓汉锛屾暟缁勫緱涓嶅仠閲嶆柊鍒嗛厤鍐呭瓨锛屾晥鐜囦綆鍒板摥銆傝繖鏃跺€欓摼琛ㄥ氨鏀1璧锋潵浜嗏€斺€斺€?strong>鈥嬫暟鎹儚鐝嶇彔涓€鏍风敤鎸囬拡涓茶捣鏉ワ紝澧炲垹鏀规煡涓嶇敤鎸綅缃紝鐩存帴鏀归摼瀛愬氨琛屸€?/strong>鈥嬨€?/p>

鈥?strong>鈥嬮摼琛ㄦ牳蹇冧笁浠跺鈥?/strong>鈥嬶細

  1. 鈥?strong>鈥嬫暟鎹煙鈥?/strong>鈥嬶細瀛樺疄闄呭唴瀹癸紙姣斿瀛︾敓濮撳悕銆佸鍙凤級
  2. 鈥?strong>鈥嬫寚閽堝煙鈥?/strong>鈥嬶細瀛樹笅涓€涓妭鐐圭殑鍦板潃
  3. 鈥?strong>鈥嬪ご鑺傜偣鈥?/strong>鈥嬶細鏁翠釜閾捐〃鐨勮捣鐐癸紙鍗冧竾鍒紕涓簡锛侊級

浜屻€佹墜鎶婃墜鍒涘缓閾捐〃锛氫粠闆跺埌涓€

锛堟悡鎵嬶級鍜变滑鍏堟潵閫犱釜鏈€绠€鍗曠殑瀛︾敓閾捐〃銆備唬鐮侀噷浼氬煁鍑犱釜鏂版墜蹇呰俯鐨勫潙锛岀潄澶х溂鐫涚湅濂戒簡锛?/p>

c澶嶅埗
struct Student {
    int id;
    char name[20];
    struct Student *next;  // 鍏抽敭锛佹寚鍚戜笅涓妭鐐圭殑鎸囬拡
};

// 鍒涘缓鏂拌妭鐐癸紙閲嶇偣锛佸唴瀛樼敵璇疯妫€鏌ワ級
struct Student* createNode(int id, char* name) {
    struct Student* newNode = (struct Student*)malloc(sizeof(struct Student));
    if(newNode == NULL) {
        printf("鍐呭瓨鍒嗛厤澶辫触锛?);  // 杩欓噷鏂版墜鏈€瀹规槗蹇樻鏌ワ紒
        exit(1);
    }
    newNode->id = id;
    strcpy(newNode->name, name);
    newNode->next = NULL;
    return newNode;
}

鈥?strong>鈥嬫暡閲嶇偣鈥?/strong>鈥嬶細

  • malloc涔嬪悗蹇呴』妫€鏌ユ槸鍚︿负NULL
  • strcpy姣旂洿鎺ヨ祴鍊兼洿瀹夊叏锛堥槻姝㈠唴瀛樻孩鍑猴級
  • 姣忎釜鏂拌妭鐐圭殑next鈥?strong>鈥嬪厛鍒濆鍖栦负NULL鈥?/strong>鈥嬶紝閬垮厤閲庢寚閽?/li>

涓夈€佹彃鍏ユ搷浣滐細閾捐〃灏卞儚鎷间箰楂?/h3>

锛堟壎鐪奸暅锛夋彃鍏ュ垎涓夌鎯呭喌锛屽挶浠敤瀹為檯鍦烘櫙璇翠汉璇濓細

鈥?strong>鈥嬪満鏅?锛氬湪琛ㄥご鎻掓柊鐢熲€?/strong>鈥?/p>

c澶嶅埗
void insertAtHead(struct Student** head, int id, char* name) {
    struct Student* newNode = createNode(id, name);
    newNode->next = *head;  // 鏂拌妭鐐规寚鍚戝師澶磋妭鐐?/span>
    *head = newNode;        // 澶存寚閽堟敼涓烘柊鑺傜偣
}

鈥?strong>鈥嬪満鏅?锛氬湪琛ㄥ熬鎻掕浆瀛︾敓鈥?/strong>鈥?/p>

c澶嶅埗
void insertAtTail(struct Student** head, int id, char* name) {
    struct Student* newNode = createNode(id, name);
    if(*head == NULL) {  // 绌洪摼琛ㄧ壒娈婂鐞?/span>
        *head = newNode;
        return;
    }
    struct Student* temp = *head;
    while(temp->next != NULL) {  // 鎵惧埌鏈€鍚庝竴涓妭鐐?/span>
        temp = temp->next;
    }
    temp->next = newNode;
}

鈥?strong>鈥嬪満鏅?锛氬湪涓棿鎻掓彃鐝敓鈥?/strong>鈥嬶紙姣斿瀛﹀彿鎸夐『搴忔彃鍏ワ級
杩欓噷寰楀厛鎵惧埌鎻掑叆浣嶇疆鐨勫墠椹辫妭鐐癸紝浠g爜鐣ワ紙鐣欎釜浣滀笟锛岃瘎璁哄尯瑙佺瓟妗堬級

鈥?strong>鈥嬭娉暀璁€?/strong>鈥嬶細

  • 鏀归摼琛ㄩ『搴忔椂锛屸€?strong>鈥嬩竴瀹氳鍏堣繛鍚庢柇鈥?/strong>鈥嬶紝鍚﹀垯閾惧瓙灏辨柇浜?/li>
  • 寰幆鎵捐妭鐐规椂锛屾敞鎰忊€?strong>鈥嬭竟鐣屾潯浠垛€?/strong>鈥嬶紙姣斿澶村熬鑺傜偣锛?/li>

鍥涖€佸垹闄ゆ搷浣滐細鍒妸閾惧瓙鐜╂柇浜?/h3>

锛堟媿妗屽瓙锛夊垹鑺傜偣鏄穿婧冮珮鍙戝尯锛屾潵鐪嬬粡鍏稿満鏅細

鈥?strong>鈥嬪垹鎺夋寕绉戠殑瀛︾敓鈥?/strong>鈥嬶紙鎸夊鍙峰垹闄わ級

c澶嶅埗
void deleteNode(struct Student** head, int targetId) {
    struct Student* temp = *head;
    struct Student* prev = NULL;

    // 鎵捐鍒犵殑鑺傜偣鍜屽畠鐨勫墠椹?/span>
    while(temp != NULL && temp->id != targetId) {
        prev = temp;
        temp = temp->next;
    }

    if(temp == NULL) {
        printf("娌℃壘鍒拌繖瀛︾敓锛?);
        return;
    }

    // 鍒嗘儏鍐靛鐞?/span>
    if(prev == NULL) {  // 瑕佸垹鐨勬槸澶磋妭鐐?/span>
        *head = temp->next;
    } else {            // 涓棿鎴栧熬閮ㄨ妭鐐?/span>
        prev->next = temp->next;
    }
    free(temp);  // 閲嶇偣锛佸唴瀛樺繀椤婚噴鏀?/span>
}

鈥?strong>鈥嬮伩鍧戞寚鍗椻€?/strong>鈥嬶細

  1. 鍒犲畬鍚庘€?strong>鈥嬪繀椤籪ree鍐呭瓨鈥?/strong>鈥嬶紝鍚﹀垯鍐呭瓨娉勬紡
  2. 淇敼閾捐〃鍓嶅厛澶囦唤鎸囬拡锛岄槻姝涪澶辫妭鐐逛綅缃?/li>
  3. 鍒犲ご鑺傜偣鏃惰鐗规畩澶勭悊

浜斻€侀亶鍘嗛摼琛細浣犵殑渚︽帰娓告垙

锛堟帹鐪奸暅锛夐亶鍘嗗氨鏄嬁鐫€澶磋妭鐐圭殑鍦板潃鎸ㄤ釜鏌ユ埛鍙o紝鍜变滑鍐欎釜鎵撳嵃鍑芥暟锛?/p>

c澶嶅埗
void printList(struct Student* head) {
    struct Student* current = head;
    printf("\n-----瀛︾敓鍚嶅崟-----\n");
    while(current != NULL) {
        printf("瀛﹀彿锛?d 濮撳悕锛?s\n", current->id, current->name);
        current = current->next;  // 鎸囬拡寰€鍚庢尓
    }
    printf("------------------\n");
}

鈥?strong>鈥嬬伒榄傛嫹闂€?/strong>鈥嬶細

  • 涓哄暐瑕佺敤current閬嶅巻鑰屼笉鏄洿鎺ユ搷浣?code>head锛?br/> 锛堢瓟锛氬洜涓轰細鏀规帀澶存寚閽堢殑浣嶇疆锛屼笅娆¢亶鍘嗗氨鎵句笉鍒拌捣鐐逛簡锛侊級

鍏€佷釜浜鸿鐐规椂闂?/h3>

锛堟斁涓嬩唬鐮侊級璇寸偣鐪熷績璇濓細閾捐〃杩欑帺鎰忓効锛屽厜鐪嬫槸姘歌繙瀛︿笉浼氱殑銆傛垜褰撳勾鍦ㄥ鑸嶇啲浜嗕笁涓€氬锛屾墠绐佺劧寮€绐嶁€斺€斺€?strong>鈥嬪叧閿槸瑕佸姩鎵嬬敾鍥锯€?/strong>鈥嬶紒姣忔鎿嶄綔鍓嶅厛鍦ㄧ焊涓婄敾鍑鸿妭鐐瑰拰鎸囬拡鐨勫彉鍖栵紝姣旇皟璇曞崄閬嶉兘鏈夌敤銆?/p>

杩樻湁鍟婏紝鏂颁汉甯哥姱鐨勯敊鏄お鎬ョ潃鍐欏鏉傚姛鑳姐€傚缓璁垎闃舵娴嬭瘯锛?/p>

  1. 鍏堢‘淇濊兘鍒涘缓鑺傜偣
  2. 鍐嶆祴璇曞ご鎻掓硶
  3. 鏈€鍚庣帺鑺辨牱鎿嶄綔

鍒€曟姤閿欙紝閭d簺segmentation fault鍜?code>NULL pointer閿欒锛岄兘鏄綘鍗囩骇璺笂鐨勭粡楠屽寘鍢涳紒


鈥?strong>鈥嬫渶鍚庣殑鍞犲彣鈥?/strong>鈥嬶細
鐪嬪埌杩欓噷锛屼綘鏄笉鏄寰楅摼琛ㄤ篃娌¢偅涔堝彲鎬曪紵鍏跺疄璁$畻鏈虹殑涓栫晫灏卞儚鎼Н鏈紝鎺屾彙鍩烘湰瑙勫緥鍚庯紝鍓╀笅鐨勫氨鏄缁冨璇曘€備笅娆¢亣鍒伴摼琛ㄩ棶棰橈紝璁板緱娣卞懠鍚革紝鎺忓嚭绾哥瑪鐢讳竴鐢烩€斺€旇涓嶅畾绛旀灏卞湪浣犵殑鑽夌绾镐笂鍛紵

本文由嘻道妙招独家原创,未经允许,严禁转载