不帶頭結點的非循環雙鏈表在刪除節點的時候比價麻煩,因為同時要維護prior和next兩個指針。在處理第一個節點和最後一個節點的時候都要分別考慮,同時也需要考慮節點數量為1的情況。刪除情況分為下面兩類:
(1)刪除pos位置的節點;
(2)判斷x是否在鏈表中,若存在則刪除;
核心代碼如下:
//刪除pos位置的節點 Node *deletePosList(Node *pNode,int pos){ //注意需要單獨考慮第一個節點和最後一個節點 int i = 1; int size = sizeList(pNode); Node *pMove; pMove = pNode; //鏈表為空 if (pNode == NULL) { printf("%s函數執行,鏈表為空,刪除節點失敗\n",__FUNCTION__); return pNode; } //鏈表只有一個節點,刪除第一個節點 if (pos == 1 && size == 1) { free(pNode); pNode = NULL; printf("%s函數執行,刪除pos=%d位置的節點成功\n",__FUNCTION__,pos); return NULL; } //鏈表節點大於1,刪除第一個節點 if (pos == 1) { pNode = pNode->next; pNode->prior = NULL; free(pMove); pMove = NULL; printf("%s函數執行,刪除pos=%d位置的節點成功\n",__FUNCTION__,pos); return pNode; } while (pMove != NULL) { if (i == pos && pos != size) { pMove->prior->next = pMove->next; pMove->next->prior = pMove->prior; free(pMove); pMove->next = NULL; printf("%s函數執行,刪除pos=%d位置的節點成功\n",__FUNCTION__,pos); return pNode; } if (i == pos && pos == size) { pMove->prior->next = NULL; free(pMove); pMove = NULL; printf("%s函數執行,刪除pos=%d位置的節點成功\n",__FUNCTION__,pos); return pNode; } i++; pMove = pMove->next; } printf("%s函數執行,刪除pos=%d位置的節點失敗\n",__FUNCTION__,pos); return pNode; } //判斷x是否在鏈表中,存在則刪除之 Node *deleteValueList(Node *pNode,int x){ Node *pMove; pMove = pNode; int size = sizeList(pNode); //原鏈表為空 if (pNode == NULL) { printf("%s函數執行,原鏈表為空,刪除節點失敗\n",__FUNCTION__); return NULL; } //刪除的是第一個節點,並且鏈表長度為1 if (pNode->element == x && size == 1) { free(pNode); pNode = NULL; printf("%s函數執行,刪除值為%d節點成功\n",__FUNCTION__,x); return pNode; } //單獨考慮刪除第一個節點的情況,且鏈表長度大於1 if (pNode->element == x) { pNode = pNode->next; free(pNode->prior); pNode->prior = NULL; printf("%s函數執行,刪除值為%d節點成功\n",__FUNCTION__,x); return pNode; } while (pMove != NULL) { //要刪除的節點不是最後一個 if (pMove->element == x && pMove->next != NULL) { pMove->prior->next = pMove->next; pMove->next->prior = pMove->prior; free(pMove); pMove = NULL; printf("%s函數執行,刪除值為%d節點成功\n",__FUNCTION__,x); return pNode; } //要刪除的是最後一個節點 if (pMove->element == x && pMove->next == NULL) { pMove->prior->next = NULL; free(pMove); pMove = NULL; printf("%s函數執行,刪除值為%d節點成功\n",__FUNCTION__,x); return pNode; } pMove = pMove->next; } printf("%s函數執行,刪除值為%d節點失敗\n",__FUNCTION__,x); return pNode; }