c - 按索引从链表中删除节点

标签 c linked-list

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

vec_store持有 seqsize .变量 seq保存 vector 和指针。

出于某种原因,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--;
    }
}

最佳答案

此代码无法访问:

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是非常乏味的变量名 - previous 怎么样?和 current或者其他的东西?此外,if(i==s->size-1) 的特殊情况完全 没有必要 - 它应该由您为 if(i<s->size-1) 编写的代码处理得很好案例。

关于c - 按索引从链表中删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1857457/

相关文章:

c - 在需要 char 的地方继续获取 ascii 值

c - 通用变量树错误无限循环

python - 蛇与梯子,检查是否会降落在最后一个方 block 上

c - 在 C 中将结构写入文件时的额外零

在 C 中使用 printf 自定义字符串对齐

c++ - 带链表的哈希表,重复节点仍在保存(C++)

java - 在java中的递归链表中搜索项目的索引

java - 从 LinkedHashMap 中删除包含键 <String> 和值 LinkedList<String> 的特定值

c++ - 测试链表中的指针

c - 将 WIN32 应用程序移植到 Linux - 事件在 Linux 中如何工作?