C - 链表下一个节点为空



>我正在尝试使用链表获取结构的下一个值,但下一个值为 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] = '';
  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 %sn", s_emp->forename, s_emp->name);
      printf("position: %sn", s_emp->job);
      printf("city: %sn", 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_struct;if语句只会运行一次,并且在第一个员工之后停止。 执行此操作的最佳方法是将该函数中的 if 语句修改为while语句。 例如:

//...
while (strstr(read, "new_employee") != NULL)
//...

利用这样一个事实,即如果未找到下一次出现的"new_employee",strstr将返回 NULL。

正如注释所指出的,你在while循环中的第一个s_emp = s_emp->next是不必要的,因为它总是NULL;直到下一行你才分配s_emp->next

此外,对strdup的首次调用无效,因为您必须free从该调用返回的指针。 因此,将其存储在变量中,稍后再释放它。

题外话:为什么你的my_strcat功能如此复杂? strcat只是等价于这个:

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

它不需要比这更复杂。

相关内容

  • 没有找到相关文章

最新更新