Mam pracę do domu, który jest prawie gotowy, ale mam zatrzymany somewhere.I trzeba ostrzec, że jest to pierwszy raz używam wskazówki i wszystkie te dziwne rzeczy, więc jestem całkiem zagubiony. Moim celem jest, aby odczytać dane z listy studentów txt jako (nazwisko imię ID). Sztuką jest to, że muszę używać jedno wyszukiwanie binarne drzewo do przechowywania nazwiska (i zostało to zrobione) oraz stworzenie wewnątrz pierwszego drzewa inny drzewo binarne wyszukiwania, które przechowuje imiona uczniów i ID (częściowo kompletne). Problem polega na tym, że gdy jakiś uczeń mają to samo nazwisko i imię innego nie musi utworzyć nowy węzeł nazwisk, ale mam umieścić nowych studentów imię i identyfikator wewnątrz istniejącego węzła nazwiska. Powinno być tak: James Cameron 12131313
Andrew 17286378 (jego nazwisko jest również Cameron)
Kod jest:
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 *);
W głównym nazywam loaddata (), aby importować studentów
loadData(&temp);
A loaddata () jest
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);
}
Wzywam add_node (), która wstawić nowy węzeł w moim głównym (nazwiska) drzewa. Ten alo działa ..
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;
}
Mój problem zaczyna się (topname = add_node_nameANDid (topname, temp2);), która jest functon jak add_node (), ale dodaje nowe węzły nameANDid jeśli studenci mają to samo nazwisko .. Nie wiem, jakich argumentów użyć ... nienawidzę wskazówek, bo nie jestem doświadczony z ich użyciem (nie mokre co najmniej) ... A add_node_nameANDid () jest
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;
}
W add_node_nameANDid () Próbuję użyć podobnych zmiennych będzie łatwiej je zrozumieć .. Jak stosować kursory w add_node_nameANDid (), ponieważ kiedy copmpile to mówi [Warning] przechodzącej argumentu 1 `add_node_nameANDid” z niekompatybilnego typu wskaźnika w kolejce
topname->nleft=add_node_nameANDid(topname->nleft,temp);}(in add_node_nameANDid())
lub niezgodne typu dla argumentu 2 `add_node_nameANDid”
topname=add_node_nameANDid(topname,temp2);}
kiedy wezwać add_node_nameANDid () z add_node ().
Może ktoś proszę mi pomóc z tego bałaganu?













