删除链接列表中给定位置的节点

时间:2016-07-29 12:37:23

标签: c pointers linked-list singly-linked-list

给定一个单链表和一个位置,我试图删除特定位置的链表节点。 代码:

process.crawl(MySpider)
process.start()
process.crawl(MySpider2)
process.start()
process.crawl(MySpider3)
process.start()

每当我试图删除位置0以上的节点时,我在该特定位置得到0而不是什么。我能知道我哪里错了吗? 例如我的名单是:33 34 35 36 我的输出:33 0 35 36(尝试删除节点1时) 有效输出:33 35 36

2 个答案:

答案 0 :(得分:0)

进入删除功能while循环tailstemp从同一地址开始向前移动。该节点不会被删除,因为您总是分配相同的值(换句话说,您每次只确认下一个指针值)。

这意味着,取消后,由于其中一个节点的free d内存,打印输出为UB。

更正您的代码:

void delete(struct node **head_ref,int position)
{
    int i=1;
    if(*head_ref == NULL)
    return;

    struct node *temp = *head_ref;
    if(position == 0)
    {
        *head_ref = temp->next;
        free(temp);
        return;
    }

    struct node *tails = *head_ref;

    while(temp->next!=NULL)
    {
        temp = temp->next;

        if(i == position)
        {
            tails->next = temp->next;
            free(temp);
            return;
        }

        tails = tails->next;

        i++;
    }    
}

答案 1 :(得分:0)

由于这个错误的陈述而出现问题

while(temp->next!=NULL)
{ 
    tails = temp->next;
    ^^^^^^^^^^^^^^^^^^^
    temp = temp->next;

在这种情况下,tails和temp是相同的节点。如果删除了temp,则将已删除节点的下一个数据成员设置为temp-> next

    if(i == position)
    {
        tails->next = temp->next;
        ^^^^^^^^^^^^^^^^^^^^^^^^^

此处tails是将被删除的节点。

您应该在删除的节点之前更改节点旁边的数据成员。所以错误的陈述应该像

一样更新
while(temp->next!=NULL)
{ 
    tails = temp;
    ^^^^^^^^^^^^^
    temp = temp->next;

至于我,那么我会按照以下方式编写函数

int delete( struct node **head, size_t position )
{
    struct node *prev = NULL;

    size_t i = 0;

    while ( i != position && *head != NULL ) 
    {
        prev = *head;
        head = &( *head )->next;
        ++i;
    }

    int success = *head != NULL;

    if ( success )
    {
        struct node *tmp = *head;

        if ( prev == NULL )
        {
            *head = ( *head )->next;
        }
        else
        {
            prev->next = ( *head )->next;
        }

        free( tmp );
    }

    return success;
}