C 添加链接结构的详细信息
我写了以下代码:(上面的结构和下面的函数) 结构为:C 添加链接结构的详细信息,c,C,我写了以下代码:(上面的结构和下面的函数) 结构为: 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
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;
第一个函数用于将学生添加到学生列表中。
它添加了一个学生,但是如果我尝试放置另一个学生,则该名称将替换第一个学生的名称(仅名称而非数字)
我在代码中找不到错误。我非常感谢你的帮助
谢谢。为名称分配内存,并从名称参数复制它:
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;
}
这不是C。下次请使用正确的语言标记。标记为c#,但显然不是c#。您的问题很可能是调用函数的方式。同时显示该代码。我的猜测是
char*name
一直指向您反复更改的同一变量(例如数组)。data->name=name代码>-->数据->名称=strdup(名称)
可能是正确的,但我不确定猜测OP没有的代码是不是一个好主意post@4386427,我确信问题是因为name参数在函数的两个调用之间具有完全相同的指针,但是因为我还没有得到50分,所以我不能在评论中问他一个问题。我不能更改参数它是赋值的一部分。@Eden,你是说data->name
必须有与name
参数中传递给函数的指针完全相同的指针吗?那么你的代码就可以了。正如我之前试图解释的,问题在于调用函数的其他东西。很可能它只是将学生的名字复制到同一个内存块中,每次都将指针传递到完全相同的地址。我正在尝试这个功能来注册一个学生并删除他。
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;
}