从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 语句
,指针 previous
和 temp
彼此相等
此外,该函数应首先检查指针 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;
}
因此,程序获取用户输入的名称,显示这些名称并删除用户想要的名称。 问题是,当我键入一个未输入的姓名时,它会删除列表中输入的姓氏。
结构:
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 语句
,指针previous
和 temp
彼此相等
此外,该函数应首先检查指针 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;
}