在 C 中实现双向链表(删除任何位置的节点)



我有这个函数,可以在双向链表的任何位置删除节点。如果您只有一个节点,则工作正常。我尝试插入 3 个节点,然后删除最后一个节点,它只是冻结。

以下是我使用的功能:

int getpos(char ln[20])
{
    int pos=1;
    temp3=h;
    if(temp3 == NULL)
        {
            printf("List empty");
            return;
        }
        while(temp3->next!=NULL)
        {
            if(strcmp(temp3->lname,ln)==0)
            {
                break;
            }
            else
            {
                pos++;
            }
        }
        return pos;
}

获取要删除的节点位置的函数。

void del()
{
   int i = 1, pos=0;
    char ln[20];
    temp2 = h;

    printf("enter lname: ");
    gets(ln);
    pos=getpos(ln);
    if ((pos < 1) || (pos >= count + 1))
    {
        printf("n Error : Position out of range to delete");
        return;
    }
    if (h == NULL)
    {
        printf("n Error : Empty list no elements to delete");
        return;
    }
    else
    {
        while (i < pos)
        {
            temp2 = temp2->next;
            i++;
        }
        if (i == 1)
        {
            if (temp2->next == NULL)
            {
                printf("Node deleted from list");
                free(temp2);
                temp2 = h = NULL;
                return;
            }
        }
        if (temp2->next == NULL)
        {
            temp2->prev->next = NULL;
            free(temp2);
            printf("Node deleted from list");
            return;
        }
        temp2->next->prev = temp2->prev;
        if (i != 1)
            temp2->prev->next = temp2->next;    /* Might not need this statement if i == 1 check */
        if (i == 1)
            h = temp2->next;
        printf("n Node deleted");
        free(temp2);
    }
    count--;
}

用于删除节点的函数。

在函数getpos中,你没有递增temp3->next,所以while循环永远运行。

顺便说一下,一个简单的调试尝试可以省去问这个问题的麻烦。

你可以写这样的东西:

void delete_node(Node* pNode)
{
 pNode->Data = pNode->Next->Data;
 pNode->Next->Next->Previous = pNode;
 Node* pTemp = pNode->Next;
 delete(pNode->Next);
 pNode->Next = pTemp;
}

这个函数只处理中间的节点,所以只要确保添加边缘情况 - 如果节点是第一个或最后一个。

相关内容

最新更新