学生结构的链接列表实现

时间:2012-09-30 19:36:18

标签: c struct linked-list

我正在尝试使用以下结构创建学生的链接列表。

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:我知道我不会解除分配,这只是暂时的事情,因为我需要使用不同的库。

更新:删除了多余的代码。

3 个答案:

答案 0 :(得分:1)

找到确切的问题有点困难,因为我们没有给出如何调用此函数。似乎有一些事情需要检查。

我假设您传入函数的childroot确实已分配,root中的所有字段都设置为NULL,并且该学生的名称已按顺序排列你的第二个分支永远不会发生。然后,第一次插入将起作用。

但是,当你进行第二次插入时。您在第一个root->child子句中传递了NULL,并将其设置为if。这会导致后续strcmp失败,因为您无法从NULL取消引用(例如NULL->student_name会引发错误)。

答案 1 :(得分:0)

当你递归调用insert_student时,你应该确保你传递给root的值不为空。你可能需要另一个案例,如果它是null(比如插入到最后)。

我注意到的一件事是你永远不会使用temp的分配值。在使用temp之前,它始终未使用或丢弃。我假设这不是你想要的。

此外,通常会在结构中使用单词next代替child,而在参数中使用newStudentstudent而不是{{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,然后才能访问它们。