我正在尝试使用以下结构创建学生的链接列表。
struct student
{
int student_ID;
char *student_name;
struct course *courses_enrolled;
Student *child;
};
//Insert student to the list with a given student pointer and the starting point
Student *insert_student(Student *child, Student *root)
{
Student *temp = (Student*)malloc(sizeof(Student));
//if there isn't a starting point, declare this as the start point
if( root->student_name == NULL )
{
root->student_ID = child->student_ID;
root->student_name = strdup(child->student_name;);
root->child = NULL;
}
//if this student's name is before current node, replace node.
else if( strcmp( child->student_name, root->student_name ) < 0 )
{
temp = root;
root = child;
child->child = temp;
}
//if this student's name is after current node, keep doing insert recursion
else if( strcmp( child->student_name, root->student_name ) > 0 )
{
insert_student( child, root->child );
}
return root;
}
第一个根插入总是可以正常工作但是当我尝试添加第二个时,程序将在第二次调用insert_student后出错。它在比较时失败了
if( root->student_name == NULL )
我怀疑这与我访问root(root-&gt; child)的子节点有关,但我不确定是什么。
p / s:我知道我不会解除分配,这只是暂时的事情,因为我需要使用不同的库。更新:删除了多余的代码。
答案 0 :(得分:1)
找到确切的问题有点困难,因为我们没有给出如何调用此函数。似乎有一些事情需要检查。
我假设您传入函数的child
和root
确实已分配,root中的所有字段都设置为NULL
,并且该学生的名称已按顺序排列你的第二个分支永远不会发生。然后,第一次插入将起作用。
但是,当你进行第二次插入时。您在第一个root->child
子句中传递了NULL
,并将其设置为if
。这会导致后续strcmp
失败,因为您无法从NULL
取消引用(例如NULL->student_name
会引发错误)。
答案 1 :(得分:0)
当你递归调用insert_student时,你应该确保你传递给root
的值不为空。你可能需要另一个案例,如果它是null(比如插入到最后)。
我注意到的一件事是你永远不会使用temp
的分配值。在使用temp
之前,它始终未使用或丢弃。我假设这不是你想要的。
此外,通常会在结构中使用单词next
代替child
,而在参数中使用newStudent
或student
而不是{{1}}。
答案 2 :(得分:0)
if( root->student_name == NULL )
{
printf("Always here?\n");
root->student_ID = child->student_ID;
root->student_name = strdup(child->student_name);
temp->student_ID = 0;
temp->student_name = NULL;
root->child = temp;
}
我发现实际上我需要将子节点的变量声明为NULL,然后才能访问它们。