對鏈表節點進行增刪改查是最基本的操作,這篇博客將會來實現對節點的刪除。其他的操作可參考《C語言實現鏈表的基本操作》這篇博客。刪除某個節點有兩個類型:
(1)刪除i某個位置的節點;
(2)判斷x值是否在鏈表中,若存在則刪除該節點;
核心代碼如下:
//刪除pos位置的節點 Node *deletePosElement(Node *pNode,int pos){ //需要一個頭結點來維護 Node *pHead; Node *pMove; int i = 1; if (pos <= 0 || pos > sizeList(pNode)) { printf("%s函數執行,輸入pos值非法,刪除節點失敗\n",__FUNCTION__); return NULL; } pHead = pNode; pMove = pNode; //單獨考慮刪除第一個節點 if (pos == 1) { pMove = pMove->next; pNode = pMove; free(pHead); printf("%s函數執行,刪除pos=1位置元素成功\n",__FUNCTION__); return pNode; } while (pMove != NULL) { if (i == pos - 1) { break; } i++; pMove = pMove->next; } free(pMove->next); pMove->next = pMove->next->next; printf("%s函數執行,刪除pos=%d位置元素成功\n",__FUNCTION__,pos); return pNode; } //判斷x值是否在鏈表中,若存在則刪除該節點 Node *deleteXElement(Node *pNode,int x){ //一前一後兩個指針,pMovePre是pMove的前一個節點 Node *pMovePre; Node *pMove; if (pNode == NULL) { printf("%s函數執行,鏈表為空,刪除x=%d失敗\n",__FUNCTION__,x); return NULL; } pMovePre = pNode; pMove = pMovePre->next; //單獨考慮第一個節點 if (pMovePre->element == x) { pNode = pMove; free(pMovePre); return pNode; } while (pMove != NULL) { if (pMove->element == x) { //找到該節點的前一個節點 pMovePre->next = pMove->next; free(pMove); break; } //同步前進 pMove = pMove->next; pMovePre = pMovePre->next; } if (pMove == NULL) { printf("%s函數執行,不存在x=%d,刪除數據失敗\n",__FUNCTION__,x); return pNode; } printf("%s函數執行,刪除x=%d成功\n",__FUNCTION__,x); return pNode; }