Двоичное дерево поиска Проблема Импорт имен из txt в C - PullRequest
0 голосов
/ 22 мая 2011

У меня есть домашнее задание, в котором меня просят вставить из текстового документа 100 имен и идентификаторов учеников, отформатированных как (ID имени фамилии), и поместить их в два бинарных дерева поиска.Основной BST будет содержать фамилии и указатель на другой BST, который будет содержать имена и идентификаторы.Это первый раз, когда я пытаюсь использовать указатели (*, ->, &), поэтому я потерян.Мне удалось импортировать текст с помощью следующей функции

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;

Может кто-нибудь помочь мне исправить функцию вставки, потому что я не могу понять, какие аргументы я должен использовать, чтобы сохранить фамилию, а все остальное я сделаю сам.Я думаю, что моя проблема заключается в функции вставки.В любом случае, спасибо.

1 Ответ

0 голосов
/ 22 мая 2011

На самом деле, у вас есть сложная часть. Проблема в strcpy вы просто хотите

strcpy(node->surname, sname)

для копирования переданной фамилии в структуру узла.

Кстати, мне немного неудобно, когда вы освобождаете st->name в вашей функции loadData. Что происходит при первом вызове функции? Надеюсь, st->name - это NULL, но предпочтительным способом было бы иметь отдельную функцию уничтожения, которая освобождает целое дерево. Затем вы можете выполнить сопряжение функций loadData и destroyData. Таким образом, всегда лучше выделять и освобождать пары. Это вряд ли приведет к утечке памяти, двойному освобождению и т. Д.

...