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

Posted

技术标签:

【中文标题】从c中的链表中删除名称时出错【英文标题】:Error deleting name from linked list in c 【发布时间】:2021-11-09 02:27:45 【问题描述】:

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

结构:

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);


.

【问题讨论】:

退出循环的时候previoustemp是一样的吧?你能明白为什么这行不通吗?你需要设置previous之前推进temp 你必须检查你是否在没有找到名字的情况下到达列表的末尾。 scanf("%s", nameToDelete); 是as dangerous as gets。限制输入长度以避免超出缓冲区大小:scanf("%49s", nameToDelete); 【参考方案1】:

在这个循环中

for ( ; temp->next != NULL; temp = temp->next )

   previous = temp;
   if(strcmp(nameToDelete, temp->name)==0)
   
      break;
   

如果找不到要删除的名称,则评估循环的第三个表达式temp = temp->next,并在循环之后指针temp指向最后一个节点,然后在此代码sn-p中删除该节点

//...
else

   previous->next = temp->next;


free(temp);

另一个问题是如果找到要删除的名称,那么指针previoustemp由于break语句而彼此相等

该函数还应首先检查指针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;

【讨论】:

以上是关于从c中的链表中删除名称时出错的主要内容,如果未能解决你的问题,请参考以下文章

从 O(1) 中的链表中删除任何元素 - Java vs C++

“从链接列表中删除循环”中的运行时错误

javascript中的链表结构—从链表中删除元素

如何将数据动态存储在C中的链表中?

c语言中链表的问题

删除链表中的第一个节点