Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 添加链接结构的详细信息_C - Fatal编程技术网

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;
}