程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言入門知識 >> C語言實現鏈表節點的刪除

C語言實現鏈表節點的刪除

編輯:C語言入門知識

對鏈表節點進行增刪改查是最基本的操作,這篇博客將會來實現對節點的刪除。其他的操作可參考《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;
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved