2014-03-05 33 views
0

當我嘗試運行我的代碼的刪除功能時,它導致分段錯誤。我不知道我的功能有什麼問題。 任何人都可以修改我的代碼並更正它嗎?刪除循環雙向鏈表上的字符串

void deleteNode(contact **C){ 
    contact *temp = NULL; 
    contact *ptr; 
    int count=0; 

    printf("Delete:\n"); 
    printf("Name: "); 
    scanf("%s", temp->name); 

    ptr = (*C); 

    if((*C) == NULL){ 
    printf("The list is EMPTY."); 
    } else{ 
    do{ 
     if(temp->name == 0){ 
     count++; 
     break; 
    } 
    ptr = ptr->next; 
    }while(ptr != (*C)); 

    if(count != 0){ 
     if((*C)->prev == (*C)){ 
     temp = ptr;   
     (*C) = NULL; 
     free(temp); 
     } else{ 
     if(ptr == (*C)){ 
      temp = ptr; 
      ptr->prev->next = ptr->next; 
      ptr->next->prev = ptr->prev; 
      (*C) = ptr->next; 
      free(temp); 
     } else if(ptr == (*C)->prev){ 
      temp = ptr; 
      ptr->next->prev = ptr->prev; 
      ptr->prev->next = ptr->next; 
      free(temp); 
     } else{ 
      temp = ptr; 
      ptr->prev->next = ptr->next; 
      ptr->next->prev = ptr->prev; 
      free(temp); 
     } 
     } 
    } else{ 
     printf("The name is not in the list."); 
    } 
    } 
} 

任何幫助,將不勝感激。

+0

提供完整(但最小)的代碼。 –

回答

1

我認爲這是錯誤:

contact *temp = NULL; 
... 
scanf("%s", temp->name); 

在這個時候,當您嘗試訪問TEMP->命名溫度點爲NULL。

嘗試例如後來去做了,你做了什麼樣

temp = (*C); 
1

你調試,看看它崩潰後?你爲什麼依靠臀部?

我不能跟隨你的整個代碼(很糟糕的縮進),但你應該檢查空指針。

if(temp->name == 0) 

應該

if(temp != NULL && temp->name == 0) 

你也可能需要調用它free()後設置tempNULL,公正,以確保您不使用懸擺指針。

不過,實際的問題是在這裏:

contact *temp = NULL; 
printf("Name: "); 
scanf("%s", temp->name); 

tempNULL所以試圖訪問name磁場產生分段錯誤。

0

的錯誤是在

scanf("%s", temp->name); 

溫度爲NULL,所以您要訪問的內存不存在,因此分段錯誤。