-1
struct node {  
  struct node *next; 
  int data;
} *head;

将元素插入链表后,我正在使用此删除功能删除链表的元素,但程序卡住了。我不知道哪里出错了。请帮我。

void delete(int num1) {
   struct node *del ,*prev_node;
   del = head;

   if(del == NULL) {
     printf("\n The list is empty,cant delete element");
   } else {
     while(del != NULL) {
       if(del->data == num1) {
         if(del == head) {
           head = del->next;
           free(del);                  
         } else {
           prev_node->next = del->next;                      
           free(del);                    
         }
       } else {
         prev_node = del;
         del = del->next;
       }
    }
  }
}
4

3 回答 3

1

在释放它之后,您永远不会将 del 设置为 NULL,因此它永远不会离开循环。

free(del);
del = NULL;
于 2013-06-30T19:16:38.057 回答
0

带指针的版本:

void delete2(int num1) {
   struct node **pp;

   if( !head ) {
     printf("\n The list is empty,cant delete element");
        return;
   }
   for (pp = &head; *pp; ) {
       if((*pp)->data != num1) {
           pp = &(*pp)->next;
         } 
       else {
         struct node *del = *pp;
         *pp = del->next;
         free(del);
         }
       }
    }
  }
于 2013-06-30T21:00:27.950 回答
0

del在删除它指向的节点后,您不会更新 的值,从而导致在while循环的下一次迭代中出现未定义的行为。

于 2013-06-30T19:32:06.843 回答