2011-05-22 26 views
0

我有一個家庭作業,要求我從文本文檔插入100個學生姓名和ID(姓名ID)廣告格式,然後將其放在兩個二進制搜索樹中。主BST將包含姓氏和指向其他BST的指針,其中將包含名稱和ID。這是我第一次嘗試使用指針(*, - >,&),所以我失去了。我設法用下面的函數二進制搜索樹問題從C中的txt導入名稱

void loadData(char fname[], Students *st){ 
struct Students *new; 
root=NULL; 
int i; 
FILE *fp; 
fp=fopen(fname,"r"); 
if (fp == NULL) printf("File does not exist\n"); 
fscanf(fp, "%d", &(st->size)); //reads the number of students 
free(st->name); 
st->name=(Name*) malloc(st->size*(sizeof(Name))); 
for (i=0; i<st->size; i++){ 
    fscanf(fp, "%s",&st); 
    insert(root,st.surname);/////////I think here is the problem     
    //fscanf(fp, "%s", &st->name[i].firstname);   
    // fscanf(fp, "%d", &st->name[i].id); 
    } 
fclose(fp); 
    } 

而現在我試圖創建插入功能,這是非常困難的我,因爲我無法理解的論點,即她應該採取導入的文本

STU *insert(STU *node, char *sname)///What should i use here to save take the Surname?? 
{ 
if(node==NULL){ 
    node=(NODE *) malloc(sizeof(STU)); 
    strcpy(node->surname); 
    node->left=NULL; 
    node->right=NULL; 
} 
else{ 
    if(strcmp(*sname, node->surname)<0) 
     insert(node->left, *sname); 
    else if(strcmp(*sname, node->surname)>0) 
     insert(node->right, *sname); 
} 
return node; 
} 

這裏是結構定義:

typedef struct Name{ 
    char firstname[20]; 
    int id; 
    struct Students *nameleft; 
    struct Students *nameright;  
} Name; 
typedef struct Students{ 
    char surname[20];  
Name *name;  
int size; 
    struct Students *left; 
    struct Students *right;  
} Students; 
typedef struct Students STU; 
struct Students *insert(char num); 
struct Students *root=NULL; 

誰能幫我糾正了插入功能,因爲我不明白我必須使用哪些參數保存surnam我會自己去做其他事情。我認爲我的問題是插入功能。 無論如何,謝謝。

回答

0

其實,你有困難的部分。問題是你想要的strcpy

strcpy(node->surname, sname) 

將傳入的姓氏複製到節點結構中。

順便說一句,我對你的loadData功能中的免費st->name有點不舒服。第一次調用函數會發生什麼?希望st->nameNULL,但更好的方法是有一個單獨的銷燬功能,釋放整個樹。然後你可以配對loadDatadestroyData函數。通過這種方式分配和釋放總是最好的。它使它不太可能你會泄漏內存,雙倍免費等

+0

感謝您的答案,它的工作...以及...我有另一個問題..當我complie它說[fscanf(fp,「 %s「,&st); insert(root,st.surname)] st.surname是int,但希望st.surname是一個字符(當我調用insert時,請看LoadData函數)....它說([Warning]通過'insert'的arg 2使得整型指針沒有強制轉換) – Spyros 2011-05-22 17:12:12

+0

是的,你已經混淆了你的指針和非指針類型,你希望第二個參數'insert'變成'char *'類型有'char'。當你在'insert'遞歸時,你希望參數只是'sname',而不是'* sname'。 – andrewdski 2011-05-22 17:26:36

+0

謝謝謝謝!!!它工作正常!祝福你! – Spyros 2011-05-22 17:59:28