C语言链表操作方法详解:创建、插入、删除与遍历实例
鈥?strong>鈥嬧€滃搸锛屽C璇█鐨勬椂鍊欙紝閾捐〃鏄笉鏄€昏浣犲ご澶э紵涓哄暐鍒汉鐨勪唬鐮佽兘璺戯紝鑷繁涓€鍐欏氨宕╋紵鈥濃€?/strong>鈥?br/> 鍒厡锛屼粖澶╁挶浠氨鎺板紑浜嗘弶纰庝簡鑱婇摼琛ㄣ€備笉鏁撮偅浜涜櫄鐨勶紝鐩存帴涓婁唬鐮併€佽鍦烘櫙锛屼繚璇佷綘鍚畬鑳藉姩鎵嬪啓鍑鸿嚜宸辩殑閾捐〃銆傚噯澶囧ソ浜嗗悧锛熻蛋璧凤紒
涓€銆侀摼琛ㄥ埌搴曟槸鍟ワ紵涓哄暐涓嶇敤鏁扮粍锛?/h3>
锛堟暡榛戞澘锛夊厛瑙e喅鏈€鏍规湰鐨勯棶棰橈細鈥?strong>鈥嬮摼琛ㄥ瓨鍦ㄧ殑鎰忎箟鈥?/strong>鈥嬨€?br/> 浣犲彲鑳戒細闂細鈥滅敤鏁扮粍瀛樻暟鎹笉棣欏悧锛熲€?涓句釜鏍楀瓙馃尠锛氭兂璞′綘姝e湪寮€鍙戝鐢熺鐞嗙郴缁燂紝浠婂ぉ瑕佸姞5涓汉锛屾槑澶╄鍒?涓汉锛屾暟缁勫緱涓嶅仠閲嶆柊鍒嗛厤鍐呭瓨锛屾晥鐜囦綆鍒板摥銆傝繖鏃跺€欓摼琛ㄥ氨鏀1璧锋潵浜嗏€斺€斺€?strong>鈥嬫暟鎹儚鐝嶇彔涓€鏍风敤鎸囬拡涓茶捣鏉ワ紝澧炲垹鏀规煡涓嶇敤鎸綅缃紝鐩存帴鏀归摼瀛愬氨琛屸€?/strong>鈥嬨€?/p>
鈥?strong>鈥嬮摼琛ㄦ牳蹇冧笁浠跺鈥?/strong>鈥嬶細
- 鈥?strong>鈥嬫暟鎹煙鈥?/strong>鈥嬶細瀛樺疄闄呭唴瀹癸紙姣斿瀛︾敓濮撳悕銆佸鍙凤級
- 鈥?strong>鈥嬫寚閽堝煙鈥?/strong>鈥嬶細瀛樹笅涓€涓妭鐐圭殑鍦板潃
- 鈥?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>鈥嬶細
- 鍒犲畬鍚庘€?strong>鈥嬪繀椤籪ree鍐呭瓨鈥?/strong>鈥嬶紝鍚﹀垯鍐呭瓨娉勬紡
- 淇敼閾捐〃鍓嶅厛澶囦唤鎸囬拡锛岄槻姝涪澶辫妭鐐逛綅缃?/li>
- 鍒犲ご鑺傜偣鏃惰鐗规畩澶勭悊
浜斻€侀亶鍘嗛摼琛細浣犵殑渚︽帰娓告垙
锛堟帹鐪奸暅锛夐亶鍘嗗氨鏄嬁鐫€澶磋妭鐐圭殑鍦板潃鎸ㄤ釜鏌ユ埛鍙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>
- 鍏堢‘淇濊兘鍒涘缓鑺傜偣
- 鍐嶆祴璇曞ご鎻掓硶
- 鏈€鍚庣帺鑺辨牱鎿嶄綔
鍒€曟姤閿欙紝閭d簺segmentation fault
鍜?code>NULL pointer閿欒锛岄兘鏄綘鍗囩骇璺笂鐨勭粡楠屽寘鍢涳紒
鈥?strong>鈥嬫渶鍚庣殑鍞犲彣鈥?/strong>鈥嬶細
鐪嬪埌杩欓噷锛屼綘鏄笉鏄寰楅摼琛ㄤ篃娌¢偅涔堝彲鎬曪紵鍏跺疄璁$畻鏈虹殑涓栫晫灏卞儚鎼Н鏈紝鎺屾彙鍩烘湰瑙勫緥鍚庯紝鍓╀笅鐨勫氨鏄缁冨璇曘€備笅娆¢亣鍒伴摼琛ㄩ棶棰橈紝璁板緱娣卞懠鍚革紝鎺忓嚭绾哥瑪鐢讳竴鐢烩€斺€旇涓嶅畾绛旀灏卞湪浣犵殑鑽夌绾镐笂鍛紵
本文由嘻道妙招独家原创,未经允许,严禁转载