我在C中编写一个小程序来读取文件并将其包含在链接列表中。我能够使用第一个元素创建列表,但每次添加元素时,它都会覆盖之前添加的元素。
到目前为止,这是我的代码:
<pre>
struct test_struct
{
char* valeur;
char** tableau;
struct test_struct *next;
};
FILE* ouvrirFichier(char* fichier);
struct test_struct* create_list(char* ligne);
struct test_struct* add_to_list(char* ligne);
void print_list();
struct test_struct *head = NULL;
struct test_struct *curr = NULL;
//struct test_struct *ptr = NULL;
int main(int argc, char** argv)
{
//int i = 0, ret = 0;
struct test_struct *ptr = NULL;
FILE* fichier = NULL;
char ligne[121] = {0};
fichier = ouvrirFichier(argv[1]);
while(fgets(ligne, 121, fichier))
{
ptr = add_to_list(ligne);
printf("%sn", courant->valeur);
printf("%sn", ptr -> valeur);
}
print_list();
return 0;
}
struct test_struct* create_list(char* ligne)
{
//printf("n creating list with headnode as [%d]n",val);
struct test_struct *ptr = (struct test_struct*)malloc(sizeof(struct test_struct));
char* info[121] = {0};
char separateurs[] = "[]";
int j = 0;
int k = 0;
char* element;
if(NULL == ptr)
{
printf("n Node creation failed n");
return NULL;
}
for (element = strtok(ligne, separateurs); element; element = strtok(NULL, separateurs))
{
if (strcmp(element, " ") != 0 && strcmp(element, "n") != 0)
{
info[j] = element;
//printf("%sn", info[j]);
//info[j] = element;
j++;
}
}
k = j;
ptr-> valeur = info[0];
ptr -> tableau = malloc(k);
printf("%s234n", ptr -> valeur);
for (j = 1; j < k; j++)
{
ptr -> tableau[j - 1] = malloc(strlen(info[j]));
ptr -> tableau[j - 1] = info[j];
//printf("%s ", tete -> tableau[j - 1]);
}
ptr->next = NULL;
head = curr = ptr;
return ptr;
}
FILE* ouvrirFichier(char* entree)
{
FILE* fichier = NULL;
fichier = fopen(entree, "r");
if (fichier == NULL) // Le fichier n'a pu être ouvert
{
perror("Erreur d'ouverture du fichier d'entrée ");
exit(1);
}
return fichier;
}
struct test_struct* add_to_list(char* ligne)
{
int j = 0;
int k = 0;
//char ligne[121] = {0};
char* info[121] = {0};
char* element;
char separateurs[] = "[]";
if(NULL == head)
{
return (create_list(ligne));
}
//if(add_to_end)
//printf("n Adding node to end of list with value [%d]n",val);
//else
//printf("n Adding node to beginning of list with value [%d]n",val);
struct test_struct *ptr = (struct test_struct*)malloc(sizeof(struct test_struct));
if(NULL == ptr)
{
printf("n Node creation failed n");
return NULL;
}
for (element = strtok(ligne, separateurs); element; element = strtok(NULL, separateurs))
{
if (strcmp(element, " ") != 0 && strcmp(element, "n") != 0)
{
info[j] = element;
//printf("%sn", info[j]);
info[j] = element;
j++;
}
}
k = j;
ptr-> valeur = info[0];
ptr -> tableau = malloc(k);
printf("%s123n", ptr -> valeur);
for (j = 1; j < k; j++)
{
ptr -> tableau[j - 1] = malloc(strlen(info[j]));
ptr -> tableau[j - 1] = info[j];
}
ptr->next = NULL;
return ptr;
}</pre>
文件中的内容如下所示:ab [c] [d]。
由于
答案 0 :(得分:1)
当您在ptr-> valeur
中设置值时,您应该分配新内存,而不是仅仅添加指针并创建列表函数。
所以改变
ptr-> valeur = info[0];
到
ptr-> valeur = strdup(info[0]);
此外,在add_to_list()
函数中,您为要添加到列表中的节点设置ptr
,但您从未将其添加到列表中。如果要在末尾添加它,将其遍历到最后,然后在那里添加ptr
节点。