按索引从链接列表中删除节点

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

vec_store保存seqsize 。 变量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(isize-1)情况下):

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

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

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

顺便说一句, temp2temp1是非常有用的变量名称 – 那么previouscurrent还是什么? 此外, if(i==s->size-1)的特殊情况完全没有必要 – 应该通过if(isize-1)情况下的代码处理。

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