【问题标题】:Deleting node from linked list by index按索引从链表中删除节点
【发布时间】:2010-12-23 20:50:39
【问题描述】:

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

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

【问题讨论】:

  • 请正确缩进。
  • 好消息:我们刚刚收到了一批新的空白,您可以随意使用!
  • 不正确的缩进应该会产生编译器错误,它灼伤我的眼睛。
  • 让原始帖子(在我格式化之前)成为一个很好的例子,说明为什么不在代码中使用标签...

标签: c linked-list


【解决方案1】:

此代码无法访问:

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

...因为temp1 是列表中的第一个元素,所以它只会在第一个元素也是最后一个元素时发生 - 这意味着s-&gt;size 是 1,所以这会被较早的if (i==0) 案例。

分配给temp2(发生在两个地方)是虚假的——temp2 的值无论如何都会被覆盖,从而泄漏您分配的内存:

temp2 = malloc(sizeof (node));

最后,您要问的问题可能是什么(在if(i&lt;s-&gt;size-1) 案例中):

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

这会将整个列表从列表中剔除。您想保留列表的尾部 - 像这样:

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

顺便说一句,temp2temp1 是非常不起眼的变量名称 - previouscurrent 或其他什么?此外,if(i==s-&gt;size-1) 的特殊情况完全是不必要的 - 它应该由 if(i&lt;s-&gt;size-1) 情况的代码来处理。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 2013-08-30
      • 2020-02-04
      相关资源
      最近更新 更多