Έχω μια δουλειά στο σπίτι το οποίο είναι σχεδόν έτοιμο, αλλά έχω κολλήσει somewhere.I πρέπει να προειδοποιήσω ότι είναι η πρώτη φορά που είμαι με τη χρήση δεικτών και όλα αυτά τα περίεργα πράγματα, έτσι είμαι πολύ χαθεί. Ο σκοπός μου είναι να διαβάσει από μια λίστα μαθητών txt δεδομένα (Επώνυμο Όνομα ID). Το κόλπο είναι ότι έχω να χρησιμοποιήσετε ένα δυαδικό δέντρο αναζήτησης για να αποθηκεύουν τα επώνυμα (έχω κάνει αυτό) και να δημιουργήσουν μέσα στο πρώτο δέντρο άλλη δυαδικό δέντρο αναζήτησης που αποθηκεύει τα ονόματα των μαθητών και την ταυτότητα (εν μέρει πλήρη). Το πρόβλημα είναι ότι όταν κάποιοι μαθητή έχουν το ίδιο επώνυμο και διαφορετικό όνομα δεν πρέπει να δημιουργήσει ένα νέο κόμβο για τα επώνυμα, αλλά εγώ πρέπει να θέσει τους νέους φοιτητές όνομα και ταυτότητα μέσα σε ένα υπάρχον κόμβο της επώνυμο. Θα πρέπει να είναι όπως: Cameron James 12131313
Andrew 17286378 (το επώνυμό του είναι επίσης Cameron)
Ο κώδικας είναι:
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 (), η οποία εισάγει ένα νέο κόμβο στο κύριο (επώνυμα) το δέντρο μου. Αυτό alo λειτουργεί ..
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)?) το οποίο είναι ένα functon όπως 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 () γιατί όταν εγώ copmpile λέει [Προσοχή] πέρασμα arg 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 ().
Μπορεί παρακαλώ κάποιος να με βοηθήσει με αυτό το χάλι;













