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

时间:2015-03-08 10:01:32

标签: c doubly-linked-list

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

}

删除节点的功能。

2 个答案:

答案 0 :(得分:0)

在函数getpos中,您没有递增temp3->next,因此while循环将永远运行。

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

答案 1 :(得分:0)

你可以这样写:

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;
}

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