? ? ? ?上篇博客我將基礎的尾插、尾刪、頭插、頭刪逐一講解了,這篇博客將對上篇博客進行收尾,講一下指定位置操作增刪以及查找這幾個函數,其實大同小異:
一.查找函數:
查找函數其實就是一個簡單的循環遍歷,所以不加以過多贅述:
SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{SLTNode* cur = phead;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}
二.指定位置前插入函數:
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{assert(pos);assert(pphead);if (pos == *pphead){SLTPushFront(pphead, x);}else{//找到pos前一個位置:SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}SLTNode* newnode = BuySLTNode(x);prev->next = newnode;newnode->next = pos;}
}
代碼解釋:
頭插特殊處理:
if (pos == *pphead) {SLTPushFront(pphead, x); }
- 若在頭節點前插入,調用專門的頭插函數
- 確保頭指針正確更新
查找前驅節點:
SLTNode* prev = *pphead; while (prev->next != pos) {prev = prev->next; }
- 從頭節點開始遍歷,尋找
pos
的前驅節點 - 若
pos
是頭節點,此循環不會執行
- 從頭節點開始遍歷,尋找
插入新節點:
SLTNode* newnode = BuySLTNode(x); prev->next = newnode; newnode->next = pos;
- 創建新節點并連接到鏈表中
- 指針操作順序正確,不會破壞鏈表結構
三.在指定位置刪除函數:
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead);assert(pos);if (*pphead == pos){SLTPopFront(pphead);}else{//找到pos前一個位置;SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);}
}
代碼解釋:
頭刪特殊處理:
if (*pphead == pos) {SLTPopFront(pphead); }
- 若刪除頭節點,調用專門的頭刪函數
- 確保頭指針正確更新
查找前驅節點:
SLTNode* prev = *pphead; while (prev->next != pos) {prev = prev->next; }
- 從頭節點開始遍歷,尋找
pos
的前驅節點 - 若
pos
是頭節點,此循環不會執行
- 從頭節點開始遍歷,尋找
刪除節點:
prev->next = pos->next; free(pos);
- 調整前驅節點指針跳過
pos
- 釋放
pos
節點的內存
- 調整前驅節點指針跳過
四.指定位置之后插入函數:
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{assert(pos);SLTNode* newnode = BuySLTNode(x);newnode->next = pos->next;pos->next = newnode;
}
較為簡單,不加以贅述;
五.指定位置之后刪除函數:
void SLTEraseAfter(SLTNode* pos)
{assert(pos);assert(pos->next);SLTNode* del = pos->next;pos->next = del->next;free(del);del = NULL;
}
較為簡單,不加以贅述;
六.函數復用:
當寫出指定位置操作的幾個函數以后,之前的那幾個操作函數就可以直接套用指定位置的函數;
具體位置怎么設定留給你們自己思考一下,函數的復用我會在下一篇雙向鏈表花一定的篇幅。
其實,要想快速的寫出鏈表,都是先寫指定位置函數,然后再去復用實現頭尾的操作。
? ? ? 單鏈表一開始理解確實是有點困難的,但是一旦理解了以后,后續的雙向鏈表之類的就變得簡單了。雖然鏈表有很多種類,但是只要理解了單鏈表以后,其他的除了結構比單鏈表復雜以外難度遠不及單鏈表!!!