2009-12-07 62 views
1

这是我从链接列表中删除节点的代码。按索引从链接列表中删除节点

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

请正确缩进。 – 2009-12-07 02:31:51

+4

好消息:我们刚刚收到一批新空白,您可以尽可能多地使用! – caf 2009-12-07 02:37:58

+0

不正确的缩进应该会产生编译器错误,它会烧伤我的眼睛。 – Dave 2009-12-07 02:38:29

回答

0

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

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

顺便说一句,temp2temp1是相当鼓舞人心的变量名 - 怎么样previouscurrent什么?此外,if(i==s->size-1)的特殊情况是完全不需要 - 它应该通过if(i<s->size-1)案例的代码处理得很好。