2016-08-24 37 views
0

指示:执行以下功能按姓氏搜索,然后从链接列表中删除第一个匹配的学生。如果找到了匹配的学生,该函数返回一个指向新链接列表头的指针;如果找不到匹配的学生,则该列表不变,并返回链接列表的头部。根据匹配的数据删除节点

编译并运行该代码时,每次只删除头节点。即使名称在列表中间或根本不在列表中,始终删除头节点。不确定发生了什么问题。任何帮助将不胜感激!谢谢!

STUDENT *DeleteByLastName(STUDENT *students, char *name) 
{ 
struct STUDENT* current = students; 
struct STUDENT* previous = NULL; 

while (current != NULL) { 
    if (current->Lastname == name) { 
    if (previous == NULL) { 
     current = current->Next; 
     free(students); 
     students = current; 
    } 
    else { 
     previous->Next = current->Next; 
     free(current); 
     current = previous->Next; 
    } 
    } 
    else { 
    previous = current; 
    current = current->Next; 
    } 
    return current; 
}  
return NULL; 

} 
+9

'current-> Lastname == name' - 这不是比较字符串的方式。使用'strcmp'家族。这使我怀疑你在没有显示的功能中有类似的问题... –

+0

提示; 'char * name'应该是'const char * name',因为你不会修改'name'指向哪个。 – ikegami

回答

0

感谢您的提示!这是我为任何感兴趣的人工作的代码。

STUDENT *DeleteByLastName(STUDENT *students, char *name) 
{ 
struct STUDENT* current; 
struct STUDENT* head = students; 

current = students; 
int count = 0; 
struct STUDENT* previous = NULL; 

while (current != NULL) { 
    //check for matching head and delete 
    if (strcmp(current->Lastname,name) == 0 && count == 0) { 
     students = current->Next; 
     return students; 
    } 
    //If name matches but is not at the beggining of the list 
    if(strcmp(current->Lastname,name) == 0) { 
     previous->Next = previous->Next->Next; 
     current = current->Next; 
     return students; 
    } 
    else { 
     previous = current; 
     current = current->Next; 
     ++count; 
    } 
} 
return head; 
}