从c中的链表中删除名称时出错

Error deleting name from linked list in c

因此,程序获取用户输入的名称,显示这些名称并删除用户想要的名称。 问题是,当我键入一个未输入的姓名时,它会删除列表中输入的姓氏。

结构:

struct node
{
    char name[50];
    struct node *next;
}*node;

删除函数:

void remove(){
   char nameToDelete[50];
   struct node *temp, *previous;
   temp = node;

   printf("What is the name you wish to delete?\n");
   scanf("%s", nameToDelete);

   for ( ; temp->next != NULL; temp = temp->next )
   {
      previous = temp;
      if(strcmp(nameToDelete, temp->name)==0)
      {
         break;
      }
   }

   if ( temp == node )
   {
      node = temp->next;
   }
   else
   {
      previous->next = temp->next;
   }

   free(temp);
   printf("%s was deleted successfully\n", nameToDelete);
}

.

在这个循环中

for ( ; temp->next != NULL; temp = temp->next )
{
   previous = temp;
   if(strcmp(nameToDelete, temp->name)==0)
   {
      break;
   }
}

如果未找到要删除的名称,则对循环 temp = temp->next 的第三个表达式求值,在循环后指针 temp 指向最后一个节点,然后在此删除代码片段

//...
else
{
   previous->next = temp->next;
}

free(temp);

另一个问题是,如果找到要删除的名称,那么由于 break 语句

,指针 previoustemp 彼此相等

此外,该函数应首先检查指针 node 是否等于 NULL

至少可以通过以下方式声明和定义函数

int remove( void )
{
    char nameToDelete[50];

    printf("What is the name you wish to delete?\n");
    scanf("%s", nameToDelete);

    struct node *temp = node, *previous = NULL;

    while ( temp != NULL && strcmp( nameToDelete, temp->name ) != 0 )
    {
        previous = temp;
        temp = temp->next;
    }

    int success = temp != NULL;

    if ( success )
    {
        if ( previous == NULL ) node = node->next;
        else previous->next = temp->next;
    
        free( temp );
    }

    return success;
}

尽管最好排除要求用户输入姓名的代码。函数的调用者应该提供要删除的名称作为函数参数。在这种情况下,函数看起来像

int remove( const char *nameToDelete )
{
    struct node *temp = node, *previous = NULL;

    while ( temp != NULL && strcmp( nameToDelete, temp->name ) != 0 )
    {
        previous = temp;
        temp = temp->next;
    }

    int success = temp != NULL;

    if ( success )
    {
        if ( previous == NULL ) node = node->next;
        else previous->next = temp->next;
    
        free( temp );
    }

    return success;
}