gpt4 book ai didi

C - 链表下一个节点为空

转载 作者:行者123 更新时间:2023-12-02 03:02:29 25 4
gpt4 key购买 nike

我正在尝试使用链表获取我的结构的下一个值,但下一个值为空。

我知道我这样做的方式不对,希望你能帮我解决我的问题。

输入文件:

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_structif 语句只会运行一次,并且会在第一个员工之后停止。最好的方法是简单地将函数中的 if 语句修改为 while 语句。例如:

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

利用 strstr 的事实如果未找到下一个“new_employee”,将返回 NULL。

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

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

旁白:为什么您的 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;

它不需要比这更复杂。

关于C - 链表下一个节点为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44850856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com