按索引从链表中删除节点

时间:2009-12-07 02:26:10

标签: c linked-list

这是我从链表中删除节点的代码。

vec_store拥有seqsize。变量seq包含向量和指针。

出于某种原因,else if(i<s->size-1)不起作用,这是最后一个条件。

任何人都可以解决问题吗?顺便说一句,这是 C 代码。

void delete_vec(vec_store s, int i)
{
    if (i<0 || s->size-1<i)
    {
        printf("Cannot delete vector because index %d is out of bounds\n",i);
    }
    else if (i==0)
    {
        node temp;
        temp = s->seq;
        s->seq = s->seq->next;
        s->size--;
        free(temp);
    }
    else if(i==s->size-1)
    {
        node temp1, temp2;
        //temp1 = malloc(sizeof (node));
        temp2 = malloc(sizeof (node));
        temp1=s->seq;
        if(temp1->next==NULL) 
        {
            free(temp1);
            s->seq=NULL;
            s->size--;
            printf("s->size-1\n");
        }
        else
        {
            while (temp1->next!=NULL)
            {
                temp2 = temp1;
                temp1 = temp1->next;    
            }
            free(temp1);
            temp2->next=NULL;
            s->size--;
            printf("s->size-1 2\n");
        }
    }
    else if(i<s->size-1)
    {
        node temp1,temp2;
        int j;
        temp1=s->seq;
        temp2 = malloc(sizeof (struct node_record));

        for(j=0;j<=i-1;j++)
        {
            temp2=temp1;
            temp1 = temp1->next;
        }

        free(temp1);
        temp2->next=NULL;
        s->size--;
    }
}

2 个答案:

答案 0 :(得分:3)

此代码无法访问:

if(temp1->next==NULL){
free(temp1);
s->seq=NULL;
s->size--;
printf("s->size-1\n");
}

...因为temp1是列表中的第一个元素,所以只有当第一个元素也是最后一个元素时才会发生 - 这意味着s->size是1,所以这会有被早先的if (i==0)案件抓住了。

temp2的分配(发生在两个地方)是假的 - temp2的值无论如何都会被覆盖,泄漏你分配的内存:

temp2 = malloc(sizeof (node));

最后,你问的问题可能就在这里(在if(i<s->size-1)案例中):

free(temp1);
temp2->next=NULL;

这会从列表中删除整个结尾。你想保持列表的尾部 - 像这样:

temp2->next = temp1->next;
free(temp1);

顺便说一下,temp2temp1是非常缺乏灵活性的变量名称 - previouscurrent或其他什么?此外,if(i==s->size-1)的特殊情况完全是不必要的 - 应该通过if(i<s->size-1)案例的代码处理它。

答案 1 :(得分:0)

既然您的缩进已经修复,我会指出问题所在。在最后一个条件中删除节点时,您将前一个节点的next字段设置为NULL,而不是后面的节点。