2009-12-07 121 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)案例的代碼處理得很好。