gpt4 book ai didi

c - c中的链接列表显示相同的值

转载 作者:行者123 更新时间:2023-11-30 20:11:58 26 4
gpt4 key购买 nike

我有一个 CSV 文件,其中包含以“,”分隔的行

该文件如下所示:

FIRST,00-92-93,1,0,1
SECOND,53-12-53,5,1,5
THIRD,12-33-51,5,0,51

链接列表如下所示:

struct Data{
char *dat;
char *uname;
bool war_dep;
int edu_period;
bool dorms;
};

struct llist{
Data d;
llist *next;
};

我有一个函数可以迭代这个文件,将每一行分成 block 并将它们添加到结构中。

这是我的程序:

void showi(llist *u){
while(u){
printf("Name: %s\t Date: %s\n", u->d.dat, u->d.uname);
u=u->next;
}
}

void inserti(llist **head, char *line){
char *tok;
llist *p=new llist;
int i=0;

tok = strtok(line, ",");
while(tok!=NULL){
switch(i){
case 0:
p->d.dat=tok;
break;
case 1:
p->d.uname=tok;
break;
case 2:
p->d.war_dep=atoi(tok);
break;
case 3:
p->d.edu_period=atoi(tok);
break;
case 4:
p->d.dorms=atoi(tok);
break;
}
i++;
tok=strtok(NULL, ",");
}
p->next=NULL;
if(*head!=NULL)
p->next=*head;
*head=p;

printf("Callback: %s\n", p->d.dat);
}

int main()
{
FILE *fp;
char line[128], *tok;
llist *head;

head = NULL;
int i=0;
fp=fopen("data.txt", "r");

while(fgets(line, sizeof(line), fp))
{
inserti(&head, line);
}
fclose(fp);

showi(head);

return 0;
}

当执行上面的代码时,我从 inserti 得到回调(只是为了确保每行都被正确处理),但是当我尝试显示我的列表时,我只得到最后一个值(在本例中)我得到了 3 第三)。我不知道为什么会发生这种情况,可能是 inserti 中的这段代码有问题

p->next=NULL;
if(*head!=NULL)
p->next=*head;
*head=p;

最佳答案

您将 token 指针存储在结构中,但是当您读取下一行时,数据将被覆盖。这就是为什么最后一行的数据出现在所有记录中的原因。

您应该复制每个 token ,例如使用

p->d.dat = strdup(tok);

其他成员也类似。不要忘记稍后释放这些指针,因为strdup在内部使用malloc

关于c - c中的链接列表显示相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38273904/

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