从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);
.
【问题讨论】:
退出循环的时候previous
和temp
是一样的吧?你能明白为什么这行不通吗?你需要设置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);
另一个问题是如果找到要删除的名称,那么指针previous
和temp
由于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中的链表中删除名称时出错的主要内容,如果未能解决你的问题,请参考以下文章