2013-08-29 50 views
0

我的代码适用于链接列表开始处的元素,但不适用于中间或末尾的元素。感谢你的帮助!从双向链表中删除一个元素

void remove(){ 
    if (!head) 
     printf("\nNo nodes to delete. List is empty."); 
    else{ 
     int n; 
     struct node* help = head; 
     printf("Enter an element to delete: "); 
     scanf("%d", &n); 
     if(head->data == n){ 
      help-> next->prev = 0; 
      head = help -> next; 
     } else{ 
      while(help -> next){ 
       if(help -> data == n){ 
        help -> next -> prev = help -> prev; 
        help -> prev -> next = help -> next; 
       } 
       else help = help -> next; 
      } 
     } 
    } 
} 
+0

为什么'n'不能作为'remove()'的参数? –

+0

@意义 - 为什么人们总是挑选代码而不是回答提出的问题?你的问题与被问到的问题无关,并且发布的代码很可能被简化为发布到SO - 而不是由提问者为实际项目编写的方式。 – xaxxon

+0

@shail给了我们具体的例子,说明它的失败会有帮助,因为你的代码有很多问题,并且很难全部指出它们,而无需为你重写代码(这不应该在SO上完成) – xaxxon

回答

1

首先,使用NULL不为0来表示NULL。在C中,你需要。在C++中它是可选的,但是您标记了问题C.

help-> next->prev = 0; 

您从不检查是否有第二个元素。如果列表只包含一个元素,则会失败 - 所以它甚至不会始终用于第一个元素。

 while(help -> next){ 
      if(help -> data == n){ 

这将阻止你曾经删除最后一个元素,因为你停止寻找在名单一旦你(但你处理前)的最后一个元素。但是,即使你不这样做,下一行:

   help -> next -> prev = help -> prev; 
       help -> prev -> next = help -> next; 

将导致你崩溃,如果这是最后一个,因为它没有检查到有层出不穷的元素。

此外,箭头->之前和之后的空格是非常罕见的。我建议不要再那样做了。

+0

感谢您指出这些问题。我会尽力纠正我的代码。 – Shail

+0

我是否应该添加一个if条件(只有在next不为null时才执行)以执行help-> next-> prev = NULL ;?此外,我应该改变我的条件而(帮助)?我无法弄清楚如何改变while循环内的代码。 – Shail

+0

@ Shail yes。会有很多的条件 – xaxxon

0
struct node *head, *tail; //global head & tail 

int delete_item() { 
    int del_data = 0; 
    struct node *item = head, *tmp; 
    scanf("%d", &del_data); 
    while(item){ 
     if(item->data == del_data){ 
      tmp = item; 
      if(item->next){ 
       //it's not tail 
       item->next->prev = item->prev; 
      } 
      else { 
       //it's tail 
       tail = item->prev; 
       if(tail) 
        tail->next = NULL; 
      } 
      if(item->prev){ 
       //it's not head 
       item->prev->next = item->next; 
      } 
      else { 
       //it's head 
       head = item->next; 
       if(head) 
        head->prev = NULL; 
      } 
      //free memory 
      free(tmp); 
     } 
     //move forward 
     item = item->next; 
    } 
return 0; 
} 
+2

做人们为他们做作业是皱起了眉头。 – xaxxon

+1

如果他会试着理解这段代码,那么一切都会好的。别那么卑鄙。 – someuser