C语言实现双向链表(删除任意位置节点)

Implementing doubly linked list in C(deleteing a node at any position)

我有这个功能可以删除双向链表任意位置的节点。如果您只有一个节点,它工作正常。我试图插入 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;
}

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