2014-02-14 35 views
0

我想從外部文件上傳列表到鏈接列表中,並從列表中訪問FILE中的所有字符。我到目前爲止,但它只包含我的輸入文件列表中的最後一個單詞。我不知道問題是什麼,我不確定該從哪裏出發。任何幫助將是偉大的!謝謝。我是上傳鏈接列表只抓取最後一個輸入文件內容

我的.txt文件,就像一堆無意義詞彙:

Ted 
Greg 
Shoe 
Money 
Apple 

當我運行的程序列表中只包含了將蘋果。

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

#define MAXLEN 15 
#define INPUT 1 
#define OUTPUT 2 

struct tree_node{ 
    char string[MAXLEN+1]; 
    struct tree_node *left_child, *right_child; 
}*first = NULL; 

int main(int argc, char *argv[]) 
{ 

    char cell[MAXLEN]; 
    int op; 
    FILE *pf; 
    FILE *out; 

    pf = fopen(("%s", argv[INPUT]), "r"); 
     if(pf == NULL){ 
      fprintf(stderr, "Error: File is Empty. \n"); 
      return 0; 
      }else{ 

    struct tree_node *temp; 
    struct tree_node *nn=(struct tree_node*)malloc(sizeof(struct tree_node)); 

    while(!feof(pf)){ 
    // fgets(&nn->string, MAXLEN, pf); 
    fscanf(pf, "%s", &nn->string); //I think this is where the problem is. 

    if(first != NULL){ 
     temp = first; 
     while(temp -> right_child != NULL) 
     temp = temp -> right_child; 
      temp -> right_child = nn; 
    }else{ 
     first = nn; 
    } 
    nn->right_child = NULL; 
    } 
} 
    do{ 
     printf("1.Display.\n2.Exit.\n"); 
     printf("Selection?\n"); 
     scanf("%d", &op); 

    switch(op) 
     { 
     case 1:display(); 
     break; 
     } 
    } 
    while(op < 2 && op > 0); 
} 

int display() 
{ 
    struct tree_node *temp; 
    temp = first; 
    if(temp == NULL) 
    { 
     printf("EMPTY!\n"); 
     return; 
    } 
    printf("Elements: \n"); 
    while(temp != NULL){ 
    printf("%s\n", temp -> string); 
    temp = temp -> right_child; 
    } 
} 

回答

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

#define MAXLEN 15 
#define INPUT 1 
#define OUTPUT 2 
#define EXIT 2 

#define _S(x) #x 
#define S(x) _S(x) 

struct tree_node{ 
    char string[MAXLEN+1]; 
    struct tree_node *left_child, *right_child; 
}*first = NULL; 

void display(void); 
void add_tree(char string[MAXLEN+1]); 

int main(int argc, char *argv[]){ 
    char cell[MAXLEN+1]; 
    int op; 
    FILE *pf, *out; 

    if(NULL==(pf = fopen(argv[INPUT], "r"))){ 
     fprintf(stderr, "Error: File can't open.\n"); 
     return 1; 
    } 

    while(fscanf(pf, " %" S(MAXLEN) "[^\n]", cell)==1){ 
     add_tree(cell); 
    } 
    fclose(pf); 

    do{ 
     printf("1.Display.\n2.Exit.\n"); 
     printf("Selection?\n"); 
     scanf("%d", &op); 

     switch(op){ 
     case 1: 
      display(); 
      break; 
     } 
    } while(op != EXIT); 
    //release tree 

    return 0; 
} 

struct tree_node* new_node(char string[MAXLEN+1]){ 
    struct tree_node *np = malloc(sizeof(*np)); 
    if(np){ 
     strcpy(np->string, string); 
     np->left_child = np->right_child = NULL; 
    } 
    return np; 
} 

void insert(struct tree_node **np, char string[MAXLEN+1]){ 
    int cmp; 
    if(*np == NULL){ 
     *np = new_node(string); 
     return; 
    } 
    if(0==(cmp=strcmp((*np)->string, string))) 
     return; 
    if(cmp > 0) 
     insert(&(*np)->left_child, string); 
    else 
     insert(&(*np)->right_child, string); 
} 

void add_tree(char string[MAXLEN+1]){ 
    insert(&first, string); 
} 

void display_r(struct tree_node *np){ 
    if(np){ 
     display_r(np->left_child); 
     printf("%s\n", np->string); 
     display_r(np->right_child); 
    } 

} 
void display(void){ 
    if(first == NULL){ 
     printf("EMPTY!\n"); 
     return; 
    } 
    printf("Elements: \n"); 
    display_r(first); 
} 
+0

這很好。我對Coding很新,所以這對我來說很重要。我將研究這段代碼一段時間,以確保我明白到底發生了什麼。非常感謝你。如果您可以在代碼的重要方面包含一些簡短的評論,我將非常感激。我想確保我不會錯過任何重要的事情。 – Ted

+0

@ user3308669不難一小片一小堆的代碼。你曾經想看到什麼嗎? – BLUEPIXY

+0

當然可以。有趣的是,您爲left_child和right_child包含了按字母排序的算法。我需要這樣做,但我沒有在我的描述中包括這一點。謝謝。 – Ted

2

fscanf(pf, "%s", &nn->string);這裏string是char數組。所以刪除&

您只創建了一個節點。上面的這一段while()。

struct tree_node *temp; 
struct tree_node *nn=(struct tree_node*)malloc(sizeof(struct tree_node)); 

需要爲每個字符串創建單獨的節點。

+0

感謝您的迴應!然而,刪除&並不會改變輸出。 – Ted

+0

是不是Malloc做的?爲傳入的字符串分配空間?我不認爲我必須爲每個單獨的條目創建一個單獨的節點... – Ted