У меня есть домашняя работа, которая почти сделана, но я где-то застрял. Я должен предупредить, что я впервые использую указатели и все эти странные вещи, так что я довольно потерян.Моя цель состоит в том, чтобы прочитать из списка данных студентов txt как (Фамилия Имя ID).Хитрость заключается в том, что мне нужно использовать одно двоичное дерево поиска для хранения фамилий (я это сделал) и создать внутри первого дерева другое двоичное дерево поиска, в котором хранятся имена учеников и ID (частично заполнены).Проблема заключается в том, что, когда у какого-то ученика одинаковая фамилия и другое имя, я не должен создавать новый узел для фамилий, но я должен поместить имя и идентификатор нового ученика в существующий узел фамилии.Это должно быть как: Кэмерон Джеймс 12131313
Эндрю 17286378 (его фамилия также Кэмерон)
Код:
typedef struct nameANDid{
char first[20];
int ID;
struct node *nleft;
struct node *nright;
}yohoho;
typedef struct node{
char last[20];
struct nameANDid yohoho;
struct node *left;
struct node *right;
}node;
///
struct node temp;
struct nameANDid temp2;
struct node *top=NULL;
struct nameANDid *topname=NULL;
void loadData();
struct nameANDid * add_node_nameANDid(struct nameANDid *, struct nameANDid *);
/////
struct node * add_node (struct node *, struct node *);
struct node * search_node (struct node *, char *);
void print_node (struct node *);
void print_tree (struct node *);
В основном я вызываю loadData () для импорта студентов
loadData(&temp);
И loadData () -
void loadData(struct node *temp){
int i;
FILE *fp;
fp=fopen(FILENAME,"r");
if (fp == NULL) printf("File does not exist\n");
for (i=0; i<20; i++){
fscanf(fp,"%s",&temp->last);
fscanf(fp,"%s",&temp->yohoho.first);
fscanf(fp,"%d",&temp->yohoho.ID);
top=add_node(top,temp);
}
fclose(fp);
printf("\n\nFile loaded\n");
}
Я вызываю add_node (), который вставляет новый узел в мое главное дерево (фамилии).Это тоже работает ..
struct node * add_node (struct node *top, struct node *temp){
struct node *newNode;
if (top == NULL){
newNode=(struct node *)malloc(sizeof(struct node));
temp->left=NULL;
temp->right=NULL;
if (memcpy(newNode,temp,sizeof(struct node)) == NULL) {
printf("Node addition failed\n");
return NULL;}
else {
//printf("Node added\n");
return newNode;}
}
else {
if (stricmp(temp->last,top->last) < 0){
// printf("left\n");
top->left=add_node(top->left,temp);}
else if (stricmp(temp->last,top->last) == 0){
// printf("Last names are equal\n");
topname=add_node_nameANDid(topname,temp2);} //Here is one of my problems
else {
// printf("right\n");
top->right=add_node(top->right,temp);}
// printf("Node added\n");
return top;
}
return NULL;
}
Моя проблема начинается с (topname = add_node_nameANDid (topname, temp2);), который представляет собой функцию, подобную add_node (), но она добавляет новые узлы nameANDid, если у студентов одинаковая фамилия.. Я не знаю, какие аргументы использовать ... Я ненавижу указатели, потому что у меня нет опыта их использования (по крайней мере, не мокрый) ... И add_node_nameANDid () это
struct nameANDid * add_node_nameANDid (struct nameANDid *topname, struct nameANDid *temp){
struct nameANDid *newNode_nameANDid;
if (topname == NULL){
newNode_nameANDid=(struct nameANDid *)malloc(sizeof(struct nameANDid));
temp->nleft=NULL;
temp->nright=NULL;
if (memcpy(newNode_nameANDid,temp,sizeof(struct nameANDid)) == NULL){
printf("Node addition failed\n");
return NULL;}
else {
//printf("Node added\n");
return newNode_nameANDid;}
}
else {
if (stricmp(temp->first,topname->first) <= 0){
// printf("leftname\n");
topname->nleft=add_node_nameANDid(topname->nleft,temp);}
else {
// printf("rightname\n");
topname->nright=add_node_nameANDid(topname->nright,temp);}
// printf("Node added\n");
return topname;
}
return NULL;
}
В add_node_nameANDid () я пытался использовать похожие переменные, чтобы их было легче понять. Как я должен использовать указатели в add_node_nameANDid (), потому что когда я копирую его, он говорит [Предупреждение], передавая аргумент 1 `add_node_nameANDid 'из несовместимого типа указателяв строке
topname->nleft=add_node_nameANDid(topname->nleft,temp);}(in add_node_nameANDid())
или несовместимый тип для аргумента 2 `add_node_nameANDid '
topname=add_node_nameANDid(topname,temp2);}
, когда я вызываю add_node_nameANDid () из add_node ().
Может пожалуйстакто-нибудь поможет мне с этим беспорядком?