鏈表的循環帶刪除操作

錯誤的一個思路,往往導致一個很難查詢的bug,上週在實現數據存儲鏈表時,由於思路的不嚴謹,導致一個bug查了大半天,代碼原先是這樣的

 while(p)
    {
        if(id == p->uniqueid)
        {
            if(p != list->head)
            {
                p->prev->next = p->next;
                if(p->next != NULL)
                {
                    p->next->prev = p->prev;
                }
                
            }
            else
            {
                list->head = p->next;
            }
            if(p->external_ip)
                free(p->external_ip);
            if(p->internal_ip)
                free(p->internal_ip);
            free(p);
            break;
        }
        p = p->next;
    }

額,好吧,在原先的項目中曾經有過這樣的代碼,後面修過了,這次又發生了,一塊石頭踢了兩次腳,很明顯,在搜索到了的時候我這邊是調用了free(p),但僅接着又做了p = p->next,額,這個就有點難爲情了,操作空指針了,好吧,這確實會導致一個fatal signal 11的問題!

後面更正後的代碼

 while(p)
    {
        if(id == p->uniqueid)
        {
            result = p->next;
            if(p != list->head)
            {
                p->prev->next = p->next;
                if(p->next != NULL)
                {
                    p->next->prev = p->prev;
                }
                
            }
            else
            {
                list->head = p->next;
            }
            if(p->external_ip)
                free(p->external_ip);
            if(p->internal_ip)
                free(p->internal_ip);
            free(p);
            break;
        }
        else
            p = p->next;
    }

告訴自己,在查詢的時候要是做delete的操作,切忌要注意使用野指針

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章