2014-04-30 39 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