gpt4 book ai didi

c - C 中的链表(显然 malloc 不想成为我的 friend )

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

我很高兴自己昨晚在第一次尝试时也没有出现任何错误或警告就成功运行了!但是,当然,我换了一堆填充物然后搞砸了......当我尝试对其进行 gdb 时,this.ytxt 中的列表似乎可以很好地加载到内存中。我认为问题在于编写它。现在。它再次工作但只写文件的第一行。我注释掉了整个函数和 printf 的测试标记,但仍然无法弄清楚。这个想法是从文件中读取可变数量的行并成对打印它们。 (实际上它本来就像学习抽认卡,但我从来没有抽出时间来研究那部分)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct member{ //This emulates a dictionary
char key[20]; //and links each word+definition pair to the next pair.
char def[20];
struct member *ptr;
};
struct member *root;
struct member *curr;
FILE *f;

int fill_list(){ //Fill each member struct with next two lines of
curr=root;
char this[20]; //FILE *f
while(EOF){
if(!fgets(this,20,f)) break;
strcpy(curr->key,this);
if(!fgets(this,20,f)) break;
strcpy(curr->def,this);
curr=curr->ptr;
curr=malloc(sizeof(struct member));
curr->ptr=0;
}
return 0;
}

void free_all(){
curr=NULL;
while(curr!=root){
curr=root;
while(curr->ptr)curr=curr->ptr;
free(curr);
}
}

int terminate(int i){ //The terminate function closes file and
free_all(); //frees malloc'd memory, then returns main func's
fclose(f); //return value.
return i;
}

int main(){
f=fopen("this.txt","r");
if(!f)return -1;
root=malloc(sizeof(struct member));
root->ptr=NULL;
fill_list();
curr=root;
if ( curr != 0 ) {
while ( curr != 0 ) {
printf( "%s", curr->key );
curr = curr->ptr;
}
}
free_all();
return terminate(0);
}

最佳答案

详细阐述 Chad 的回答,您可以:

int fill_list(){                //Fill each member struct with next two lines of
struct member *new_mem;
curr=root;
char this[20]; //FILE *f
while(1){ /* relying on the breaks below to exit the loop */
if(!fgets(this,20,f)) break;
strcpy(curr->key,this);
if(!fgets(this,20,f)) break;
strcpy(curr->def,this);
/* create the new member */
new_mem=malloc(sizeof(struct member));
/* set the new member's next ptr to NULL */
new_mem->ptr = NULL;
/* set the current member's next to the new member */
curr->ptr=new_mem;
/* current is now the new member */
curr = new_mem;
}
return 0;
}

编辑:我想我只是补充说,如果我要对您的代码进行轻微修改,这就是我要做的。如果我要从头开始,我就不会以这种方式构建循环或使用不必要的全局变量,如 curr。 sarnold 提出的只有一个临时缓冲区的观点也是如此。更不用说您在列表中的最后一个条目可能无效; 只有在成功将两个字符串读入两个临时缓冲区之后,才分配列表中的下一个成员条目可能是一个更好的主意。

关于c - C 中的链表(显然 malloc 不想成为我的 friend ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7856956/

25 4 0
文章推荐: jquery 禁止点击
文章推荐: qt - QLabel sizehint 太小