仅删除具有特定值的LinkedList

时间:2018-05-27 04:49:10

标签: c linked-list

我正在编写一个程序,并且我必须从其中一个函数中删除LinkedList中的值

struct node *delete_val(int value, struct node *head) {

struct node *h1 = head;
if (head == NULL) { return NULL;}
if (head->next == NULL) { free(head); return NULL;}
while (h1 != NULL) {
    if (h1->next != NULL && h1->next->data == value){
        h1->next = h1->next->next;
        } else {
    h1 = h1->next;
}
free(h1);
return head;
}
}    

如果通过:

  

(4,[3,4,5,6,4,4,7]);

该函数应该返回:

  

[3,5,6,4,4,7]

但我的功能是收到错误:

  

错误:您的函数返回的列表无效。          节点0的下一个字段无效(0xf5400650)。

我基本上都在检查下一个节点是否包含其数据中的匹配值' (head-> next->数据),如果是,我将当前链接列表的指针(head-> next)重新切换到其后的指针(head-> next-) >接下来)但我甚至无法让它发挥作用。

3 个答案:

答案 0 :(得分:0)

有两个问题。

  1. 您需要在更正链接后中断(因为您想删除一次值)
  2. 您正在解放不正确的会员。
  3. 如果你纠正这两个,我认为应该没问题。

    struct node *delete_val(int value, struct node *head) {
        struct node *h1 = head;
        struct node *tmp =  NULL;
    
        if (head == NULL) { return NULL;}
        if (head->next == NULL) { free(head); return NULL;}
    
        while (h1 != NULL) {
            if (h1->next != NULL && h1->next->data == value){
                tmp = h1->next;
                h1->next = h1->next->next;
                break;            
            } else {
                h1 = h1->next;
            }    
        }
    
        free(tmp);
        return head;
    }
    

答案 1 :(得分:0)

  1. 如果node是结构的名称,那么函数是,不要使用关键字struct node *delete_val(int value, node *head)
  2. 2.此处你也不需要struct

    node *h1 = head;
    if(head == NULL ) { 
      return NULL; 
    }
    else {
      node *tmp = NULL;
      while( h1 != NULL) {
         if ( h1->data == value){
              tmp = h1;
              h1 = h1->next;
              delete tmp;
        }   
       h1 = h1->next ;
       /*  else can be avoided */
      } 
    }
    

答案 2 :(得分:0)

确保链接列表不是空的,而不是

if (head->next == NULL) { free(head); return NULL;}

DO

if(head->next == NULL)
{
    if(head->data == value)
    {
        free(head);
        return NULL;
    }
    return head;
}

只有当data是要删除的值时才释放第一个节点。

到目前为止,我们确信链表中至少有2个节点。

struct node *temp=NULL, *ptr=head;
while(ptr->next!=NULL)
{
    if(ptr->next->data==value)
    {
        printf("\nElement to be deleted found.");
        temp=ptr->next;
        ptr->next=ptr->next->next;
        free(temp);
        break;
    }
    ptr=ptr->next;
}
printf("\nElement to be deleted not found in the list.");
return head;

我们展望下一个节点的data是否为value。如果是,则将要删除的节点之前的节点的next等于要删除的节点的next,然后使用{{1}取消分配要删除的节点的内存。 }。