如何在C语言中删除单链表?

如何在C语言中删除单链表?,c,struct,linked-list,free,strcmp,C,Struct,Linked List,Free,Strcmp,我正在写一个C代码。我有一个单链表,我想删除一个节点,我不知道它的位置。我的结构是: struct list_node{ int num; char name[25]; int year; float money; struct list_node *next; }; typedef struct list_node node; node *head=NULL; 我有一个值,我必须与node->name进行比较,以便它删除节点。我该怎么做?我已尝试使用此代码执行此操作: v

我正在写一个C代码。我有一个单链表,我想删除一个节点,我不知道它的位置。我的结构是:

struct list_node{
  int num;
  char name[25];
  int year;
  float money;
  struct list_node *next;
};
typedef struct list_node node;
node *head=NULL;
我有一个值,我必须与node->name进行比较,以便它删除节点。我该怎么做?我已尝试使用此代码执行此操作:

value=argv[2];
  temp=head;
  if(temp==NULL){
    return 0;
  }
   if(strcmp(current->name,value)==0){
    temp=head;
    head=head->next;
    free(temp);
    return 0;
  }
  p=head;
    while(p->next!=NULL){
      if(strcmp(p->next->name,value)==0){
        temp=p->next;
        p->next=temp->next;
        free(temp);
        return 0;
      }
        p=p->next;

    }
    return 0;
  }

但该节点未被删除。(我有一个打印列表的功能)

试试这段代码。。我想你可能在使用指向结构的指针时犯了错误

 {
        node* temp;
        node * ptr=head;
        if(ptr=NULL)
        {
            return 0;
        }
         else if(strcmp(ptr->name, name2)==0)
        {
            head=head->next;
            free(ptr);
            return 0;
        }
         while(ptr->next!=NULL) 
        {
            if(strcmp(ptr->next->name,  name2)==0)
            {
                temp=ptr->next;
                ptr->next=ptr->next->next;
                free(temp);
                return 0;
            }
             ptr=ptr->next;
        }
         printf("Node not found!");
         return 0;
    }
我有一个值,我必须与node->name进行比较,以便 删除节点。我该怎么做

…不太复杂:

        node *curr, **prev;
        for (prev = &head; curr = *prev; prev = &curr->next)
            if (strcmp(curr->name, value) == 0)
            {
                *prev = curr->next,
                free(curr);
                break;
            }

它不起作用不是一个有效的问题描述。它到底是怎么起作用的?请把你的问题说清楚。看一下你的代码,特别是在第二次strcmp之后。您要删除的是下一个节点,而不是当前节点。该代码中缺少很多内容,但这里也有大量代码用于一些简单的内容。您可能应该尝试将其分解为更小、更可测试的函数,比如正确初始化节点的函数、正确删除节点的函数、取消节点链接的函数,等等。使用测试驱动的开发模型可以在开发过程的早期摆脱许多难看的bug,而不必调试大量未经测试的代码。@Pablo It正在比较下一个值,然后删除下一个节点。它错了吗?@iBug我没有意识到strcmp实际上正在检查
p->next
,我没想到。在这种情况下,这没有错。请阅读,否则我们只是猜测。