C-链表下一个节点为空

C-链表下一个节点为空,c,linked-list,C,Linked List,我试图使用链表获取结构的下一个值,但下一个值为null 我知道我做得不对,希望你能帮我解决我的问题 输入文件: new_employee Hasselhoff David PDG F-13000 1 new_employee Anderson Pamela DDR F-31000 2 new_employee LeeNolin Gena DDR F-94270 3 new_employee Charvet David DPR F-54000 4 守则: char *my_strcat

我试图使用链表获取结构的下一个值,但下一个值为null

我知道我做得不对,希望你能帮我解决我的问题

输入文件:

new_employee Hasselhoff David PDG F-13000 1 
new_employee Anderson Pamela DDR F-31000 2 
new_employee LeeNolin Gena DDR F-94270 3
new_employee Charvet David DPR F-54000 4
守则:

char    *my_strcat(char *s1, char *s2)
{
  char  *tmp;
  int   i;
  int   j;

  i = -1;
  j = 0;
  tmp = malloc(sizeof(char) * (strlen(s1) + strlen(s2)) + 1);
  while (s1[++i])
    tmp[j++] = s1[i];
  i = -1;
  while (s2[++i])
    tmp[j++] = s2[i];
  tmp[j] = '\0';
  return (tmp);
}

char    *read_func()
{
  char *str;
  char line[256];

  str = malloc(sizeof(char) * 256);
  while (fgets(line, sizeof(line), stdin))
    str = my_strcat(str, line);
  return (str);
}

void            fill_struct(t_emp *s_emp)
{
  char          *read;

  read = read_func();
  if (strstr(read, "new_employee"))
    {
      while (s_emp->next != NULL)
        s_emp = s_emp->next;
      s_emp->next = malloc(sizeof(t_emp));
      strdup(strtok(read, " "));
      s_emp->name = strdup(strtok(NULL, " "));
      s_emp->forename = strdup(strtok(NULL, " "));
      s_emp->job = strdup(strtok(NULL, " "));
      s_emp->zipcode = strdup(strtok(NULL, " "));
      s_emp->id = atoi(strtok(NULL, " "));
      s_emp = s_emp->next;
    }
}

void    print_emp(t_emp *s_emp)
{
  while (s_emp != NULL)
    {
      printf("******************************\n");
      printf("%s %s\n", s_emp->forename, s_emp->name);
      printf("position: %s\n", s_emp->job);
      printf("city: %s\n", s_emp->zipcode);
      s_emp = s_emp->next;
    }
}
主要功能:

int     main()
{
  t_emp s_emp;

  if (!isatty(STDIN_FILENO))
    {
      fill_struct(&s_emp);
      print_emp(&s_emp);
    }
  else
    show_help();
}
输出:

******************************
David Hasselhoff
position: PDG
city: F-13000
******************************
(null) (null)
position: (null)
city: (null)
期望输出:

******************************
David Hasselhoff
position: PDG
city: F-13000
******************************
Pamela Anderson
position: DDR
city: F-31000

谢谢

您需要在循环中调用
fill\u struct
if
语句只运行一次,并在第一个员工之后停止。最好的方法是简单地将该函数中的
if
语句修改为
while
语句。例如:

//...
while (strstr(read, "new_employee") != NULL)
//...
利用在未找到下一个“new_employee”时返回NULL的事实

正如评论所指出的,您在
中的第一个
s_emp=s_emp->next
,而
循环是不必要的,因为它总是
NULL
;在下一行之前,您不会分配
s\u emp->next

此外,您对的第一次调用无效,因为您必须释放从该调用返回的指针。因此,将其存储在一个变量中,然后释放它

旁白:为什么你的
my\strcat
功能如此复杂<代码>strcat
就是这样的等价物:

char *p = str1;

while (*p) //Traverse to the end of str1 
  p++;
while (*p++ = *str2++) //Will stop with copying '\0' over
  ;

return str1;

它不需要比这更复杂。

您执行
s_emp->next=malloc(..
),然后将值分配给
emp
。您应该将新节点分配给
emp->next
。您执行
strdup(strtok(读“”))
但是不要使用strdup返回的字符串。你会泄漏内存。你的
read\u func
会将文件的所有行读取到一个缓冲区中,但是你的
fill\u struct
只处理第一个。然后你的
print\u emp
也会打印列表的最后一个条目,该条目是空的。我建议你循环一下e input,为读取的每一行添加一条记录。这是因为连接输入的原因不是每条记录一行吗?谢谢!我会尝试一下。我学会了用这种方式进行我的strcat,但谢谢你的提示,我很感激。@ArnaudPradier压缩你的
strcat
实现只是一个建议,因为它看起来有点c卢瑟德,我很高兴这有点帮助!