代碼結構
單向鏈表節點:
typedef struct student {
int num;
int score;
struct student *next;
} student;
為什麼必須用while遍歷?
鏈表內存不連續,無下標隨機訪問,只能從頭節點順著next指針一個個往下走:
void print(student *head) {
while ((head = head->next) != NULL) { // 移動到下一節點
printf("%d %d\n", head->num, head->score);
}
}
對比:數組 vs 鏈表遍歷
| 特性 | 數組 | 鏈表 |
| 內存分佈 | 連續 | 離散 |
| 訪問方式 | 下標 a[i] O(1) | 指針鏈 p = p->next O(n) |
| 遍歷循環 | for(i=0;i | while(p!=NULL) p=p->next |
| 插入刪除 | 需移動元素 O(n) | 修改指針 O(1) |
代碼中各功能的遍歷模式
- 打印/查找/更新/刪除:均為
while(p!=NULL) { if(匹配) 處理; p=p->next; }。
- 插入:需雙指針
pre, cur定位插入位置,修改pre->next = newNode; newNode->next = cur。
- 創建:尾插法
tail->next = newNode; tail = newNode,最後tail->next = NULL。
常見錯誤
- 忘記判斷
p->next為NULL:直接訪問p->next->num導致段錯誤。
- 刪除節點後未釋放內存:需
free(delNode)。
- 頭節點處理不統一:帶哨兵頭節點(代碼中
head->num=0)可統一邏輯,無需特判首節點。
調試建議
- 畫內存圖:方框代表節點,箭頭代表
next,模擬指針移動。
- VS/VS Code設置Watch監視
head、p、p->next地址值。
- Valgrind檢測內存洩漏:
valgrind --leak-check=full ./a.out。
- 上一篇文章: 培訓機構網路受限無法查資料?建議自學與線上社群替代
- 下一篇文章: Tomcat校園網可訪問但遠程不可訪問:內網IP與公網IP區別
Copyright ©
程式碼之家 All Rights Reserved