因此,該程式接收用戶輸入的名字,顯示這些名字,并洗掉一個用戶想要的名字。 問題是,當我輸入一個沒有輸入的名字時,它就會洗掉串列中輸入的最后一個名字。
結構:
struct node<
{
char name[50] 。
struct node *next; /span>
}*node。
洗掉功能:
void remove(){
char nameToDelete[50] 。
struct node *temp, *previous; /span>
temp = node;
printf("你想洗掉的名字是什么?
")。)
scanf("%s"/span>, nameToDelete)。
for ( ; temp->next != NULL; temp = temp-> next )
{
previous = temp;
if(strcmp(nameToDelete, temp-> name)==0)
{
break。
}
}
if ( temp == node )
{
node = temp-> next;
}
else { node = temp-> next; }
{
previous->next = temp->next;
}
free(temp)。
printf("%s was deleted successfully
", nameToDelete)。)
}
.
uj5u.com熱心網友回復:
在這個回圈中
for ( ; temp->next != NULL; temp = temp-> next )
{
previous = temp;
if(strcmp(nameToDelete, temp-> name)==0)
{
break。
}
如果沒有找到要洗掉的名稱,那么回圈的第三個運算式temp = temp->next被評估,在回圈之后,指標temp指向最后一個節點,然后在這個代碼片斷中被洗掉
/.../span>
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?
")。)
scanf("%s"/span>, 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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/309980.html
標籤:
