2017-06-01 102 views
0

我写了这个代码:(以上结构和下方的功能)添加详细信息链接结构

list * add_student(slist * students, char * name, int id) { 
    slist * temp, * adder; 

    if (!(adder = (slist *) 
     malloc(sizeof(slist)))) exit(1); 

    student * data; 

    if (!(data = (student *) 
     malloc(sizeof(student)))) exit(1); 

    data - > name = name; 
    data - > id = id; 
    data - > courses = NULL; 
    adder - > info = data; 
    adder - > next = NULL; 

    if (!students) { 
     return adder; 
    } 

    for (temp = students; temp - > next; temp = temp - > next); 
    temp - > next = adder; 
    return students; 
} 

的结构是:

typedef struct course { 
    char *title; 
    int number; 
    struct slist *students; 
} course; 

typedef struct slist { 
    student  *info; 
    struct slist *next; 
} slist; 

typedef struct clist { 
    course  *info; 
    struct clist *next; 
} clist; 

第一个功能是应该的学生加入到学生名单。 它增加了学生,但如果我试图把另一名学生,名称正在替换第一个名称(只有名称不是数字)。

我无法找到代码中的错误生病真的很感谢您的帮助。

谢谢。

+0

这不是C#。请下次使用正确的语言标记。 – PoweredByOrange

+0

标签为c#,但显然不是c#。 – spender

+1

你的问题很可能是你调用函数的方式。显示该代码。我的猜测是'char * name'一直指向你一次又一次改变的同一个变量(例如一个数组)。 – 4386427

回答

0

分配内存名称和名称参数复制:

list * add_student(slist * students, char * name, int id) { 
    slist * temp, * adder; 
    if (!(adder = (slist *) malloc(sizeof(slist)))) exit(1); 
    student * data; 
    if (!(data = (student *) malloc(sizeof(student)))) exit(1); 
    if (!(data->name = (char *) malloc(sizeof(char) * (strlen(name)+1)))) exit(1); 
    strcpy(data->name, name); 
    data->id = id; 
    data->courses = NULL; 
    adder->info = data; 
    adder->next = NULL; 
    if (!students) { 
    return adder; 
    } 
    for (temp = students; temp - > next; temp = temp - > next); 
    temp - > next = adder; 
    return students; 
} 
+1

可能是正确的,但我不确定猜测OP没有发布的代码是个好主意 – 4386427

+0

@ 4386427,我相信问题是因为名称参数在函数的两次调用之间有完全相同的指针,但是因为我没有50分,所以我不能在评论中问他一个问题。 – Viacheslav

+0

我不能改变参数作为它的一部分。 – Eden