2015-12-01 137 views
-4

我正在用C編寫一個小程序來讀取文件並將其包含在鏈接列表中。我能夠用第一個元素創建列表,但每次添加元素時,都會覆蓋之前添加的元素。將節點添加到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

如果您需要任何幫助,請格式化您的代碼。 –

+0

請至少使用正確格式和英文名稱。 –

回答

1

當您設置在ptr-> valeur你應該分配新的內存,而不只是存儲附加指針,並創建列表的功能價值。

因此改變

ptr-> valeur = info[0]; 

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

此外,在add_to_list()功能,您的節點設置ptr在列表中添加,但你永遠不會把它添加到列表中。如果要在最後添加它,請將其遍歷到最後,然後在那裏添加ptr節點。