按索引从链接列表中删除节点
这是我从链表中删除节点的代码。
vec_store
保存seq
和size
。 变量seq
保存向量和指针。
由于某种原因, else if(isize-1)
不起作用,这是最后一个条件。
任何人都可以解决问题吗? 顺便说一下这是C代码。
void delete_vec(vec_store s, int i) { if (isize-1seq; 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(isize-1) { node temp1,temp2; int j; temp1=s->seq; temp2 = malloc(sizeof (struct node_record)); for(j=0;jnext; } 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)
捕获if (i==0)
案例。
对temp2
这种分配(发生在两个地方)是假的 – 无论如何, temp2
的值被覆盖,泄漏你分配的内存:
temp2 = malloc(sizeof (node));
最后,你在这里问的可能是什么问题(在if(i
情况下):
free(temp1); temp2->next=NULL;
这会从列表中删除整个结尾。 你想保持列表的尾部 – 像这样:
temp2->next = temp1->next; free(temp1);
顺便说一句, temp2
和temp1
是非常有用的变量名称 – 那么previous
和current
还是什么? 此外, if(i==s->size-1)
的特殊情况完全没有必要 – 应该通过if(i
情况下的代码处理。
既然你的缩进已经修复了,我会指出问题所在。 在最后一个条件中删除节点时,您将前一个节点的next
字段设置为NULL
,而不是后面的节点。