将节点添加到C中列表的末尾

时间:2015-12-01 04:35:39

标签: c struct nodes

我在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]。

由于

1 个答案:

答案 0 :(得分:1)

当您在ptr-> valeur中设置值时,您应该分配新内存,而不是仅仅添加指针并创建列表函数。

所以改变

ptr-> valeur = info[0];

ptr-> valeur = strdup(info[0]);

此外,在add_to_list()函数中,您为要添加到列表中的节点设置ptr,但您从未将其添加到列表中。如果要在末尾添加它,将其遍历到最后,然后在那里添加ptr节点。