这是我从链表中删除节点的代码。
vec_store
拥有seq
和size
。变量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--;
}
}
答案 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);
顺便说一下,temp2
和temp1
是非常缺乏灵活性的变量名称 - previous
和current
或其他什么?此外,if(i==s->size-1)
的特殊情况完全是不必要的 - 应该通过if(i<s->size-1)
案例的代码处理它。
答案 1 :(得分:0)
既然您的缩进已经修复,我会指出问题所在。在最后一个条件中删除节点时,您将前一个节点的next
字段设置为NULL
,而不是后面的节点。