2015-04-27 36 views
-1

每次我嘗試這樣做的時候,我都會在if語句中得到一個無關緊要的異常?至此爲止的其他一切都很好。荷蘭國際集團它爲什麼不能從我的列表中刪除一個節點?

 void DeleteEmp(struct node* head, int tempID){ 
      struct node *curNode = head; 
      struct node *prevNode = NULL; 
      while (curNode != NULL) { 
       if(curNode->empId == tempID) { // error here 
        free(curNode); 
        printf("Employee %d removed from database", tempID); 
       } 
       prevNode = curNode; 
       curNode = curNode->next; 
      } 
     } 
+0

'免費'節點沒有先從列表中刪除是錯誤的 – Diego

回答

2

您正在使用curNodefree後。

while (curNode != NULL) { 
     if(curNode->empId == tempID) { // error here 
      free(curNode); 
      printf("Employee %d removed from database", tempID); 
     } 
     prevNode = curNode; 
     curNode = curNode->next; // PROBLEM HERE. 
    } 

也許你的意思是在撥打free之後立即返回。

void DeleteEmp(struct node* head, int tempID){ 
    struct node *curNode = head; 
    struct node *prevNode = NULL; 
    while (curNode != NULL) { 
     if(curNode->empId == tempID) { 
     if (prevNode == NULL) 
     { 
      // This means curNode is the head. 
      // Since curNode is about to be deleted, 
      // make the next node the head. 
      head = curNode->next; 
     } 
     else 
     { 
      // Since curNode is about to be deleted, 
      // change the next node of prevNode. 
      prevNode->next = curNode->next; 
     } 

     free(curNode); 
     printf("Employee %d removed from database", tempID); 
     return; 
     } 
     prevNode = curNode; 
     curNode = curNode->next; 
    } 
} 
2

在釋放它之前,您應該從列表中刪除節點。

 while (curNode != NULL) { 
      if(curNode->empId == tempID) { 
       if (prevNode){// remove the node from the list 
        prevNode->next = curNode->next; 
       } 
       else{ 
        head = curNode->next; 
       } 
       free(curNode); 
       printf("Employee %d removed from database", tempID); 
       return;//assuming empId is unique return after you found it. 
      } 
      prevNode = curNode; 
      curNode = curNode->next; 
     } 
2

在釋放節點之前,在釋放節點之前,您需要做一些指針交換。 考慮這個

a->b->c->NULL 

刪除B自由之前,應做到以下幾點。

a->c->NULL 

注意的特殊情況刪除C,刪除這將導致一個新的頭部和刪除的單列表中的唯一節點。

注意類型GList和處理函數在庫GObject中,使用這個列表代碼而不是寫入和調試它可能是有意義的。

相關問題