2015-06-03 67 views
-1

我的程序的目標是刪除具有數字偶數值的所有元素。該程序工作正常,除非它應該刪除最後一個元素:這會導致程序崩潰。,C,碰撞,同時嘗試刪除列表中的最後一個元素

我創建了一個清單,這樣的結構:

struct elemento{ 
     int dato; 
     struct elemento *next; 
}; 

可以忽略如何創建列表,因爲我知道,誤差僅在這個函數:

struct elemento *eliminapari(struct elemento *p){ 

    struct elemento * start = p; 
    struct elemento * temp, *temp2; 
    int cont; 
    cont = 0; 
    temp2 = p; 
    while(p != NULL && cont != 20){ 
     temp2 = temp2->next; 

     if((p->dato % 2) == 0){ 
      if (cont == 0){ //if first element 
       start = p->next; 
       free(p); 
       p = start; 

      }else if(p->next == NULL){ //if last element 
       temp2->next = NULL; //this would be the previous node 
       free(p); 
       p = NULL; 

      }else{ 
       temp = p->next; 
       p->dato = p->next->dato; 
       p->next = p->next->next; 
       free(temp); 

      } 
     }else{printf("\n3\n"); p = p->next;} 

     cont = cont + 1; 
    } 

     return(start); 

    } 

感謝。

+1

它在哪裏崩潰,它如何崩潰,當時的結構如何,結構如何聲明,數據如何分配,你怎麼知道它沒有被釋放?我們不是心靈讀者。 –

+0

'temp2-> next = NULL; //這將是前一個節點':'temp2'爲'NULL' – BLUEPIXY

+0

你的代碼有點混亂,但我的猜測是你正在釋放一個NULL指針,嘗試釋放指針,然後將其設置爲NULL –

回答

2

如果您調用eliminapari傳遞p作爲唯一的結構實例(換句話說,p-> next爲NULL,那麼while循環內的第一行設置temp2 == NULL。您嘗試解除引用temp2(temp2-> next = NULL)的「else」子句,但temp2爲NULL,所以崩潰

+0

好吧,這使得程序崩潰,但如何解決這個問題?如果我只是刪除該行,唯一的空閒,不會遵循指向最後一個元素的指針。怎麼解決? –

相關問題