2014-04-30 40 views
-1

我的問題是,當我嘗試第一次添加一個節點到我單向鏈表時,一切都預計,但是當我想添加另一個節點,我的程序崩潰。似乎我的錯誤是由於嘗試寫入0地址而導致的。但是我似乎無法找到我的代碼中的錯誤。我用malloc吧? 下面是代碼:單個鏈接列表錯誤,同時添加節點

typedef struct linkedList 
{ 
    int StudentId; 
    char name[100]; 
    char dep[100]; 
    struct linkedList *next; 
} LinkedList; 

LinkedList *head = NULL; 
LinkedList *current = NULL; 

LinkedList *createList(int val, char name[], char dep[]) 
{ 
    LinkedList *ptr = (LinkedList *)malloc(sizeof(LinkedList)); 
    if (ptr == NULL) 
    { 
     printf("Node Creation Failed\n"); 
     return NULL; 
    } 
    ptr ->StudentId = val; 
    strcpy(ptr -> name, name); 
    strcpy(ptr ->dep, dep); 
    ptr ->next = NULL; 
    head = current = ptr; 
    return ptr; 
} 

LinkedList *addToList (int val, char name[], char dep[]) 
{ 
    if (head == NULL) 
    { 
     return (createList(val, name, dep)); 
    } 
    else 
    { 
     LinkedList *ptr = (LinkedList *)malloc(sizeof(LinkedList)); 
     if (ptr = NULL) 
     { 
      printf("Node Creation Failed\n"); 
      return NULL; 
     } 
     ptr -> StudentId = val; 
     strcpy(ptr ->name, name); 
     strcpy(ptr ->dep, dep); 
     ptr -> next = NULL; 
     current -> next = ptr; 
     current = ptr; 
     return ptr; 
} 

}

在主功能

: AddtoList(10, 「ABC」, 「ABC」); 調用createList,沒問題,但 如果我再次使用AddtoList,程序崩潰,createList和AddtoList真的很相似,無法找出問題所在。

+0

您是否使用調試器調試了您的代碼,在遍歷相關變量的同時遍歷每一行?我對此表示懷疑。 -1 – alk

回答

2

變化

if (ptr = NULL) 

if (ptr == NULL) 

在你的情況,ptr被分配給NULL和表達如果被評估以0內。控制權轉到ptr -> StudentId = val;。它試圖訪問寫保護的內存,從而導致崩潰。

+0

我很驚訝OP的編譯器在這一點上並沒有發出警告。嘗試強迫LHS成爲RVALUE而不是LVALUE可能是一種很好的做法。它防止這種事情發生。即:使用這種一般形式:'if(NULL == ptr)'。 – DevNull

+0

謝謝你我的壞:) – user3590082