Tengo un trabajo a domicilio que está casi hecho, pero he pegado somewhere.I que advertirle de que es la primera vez que estoy usando punteros y todas estas cosas raras, así que estoy bastante perdido. Mi propósito es leer una lista de los estudiantes txt datos (Nombre Apellido ID). El truco es que tengo que usar un árbol de búsqueda binaria para almacenar los apellidos (he hecho esto) y para crear en el interior del primer árbol a otro árbol de búsqueda binario que almacena los nombres de los estudiantes y el ID (parcialmente completo). El problema es que cuando algún estudiante tiene el mismo apellido y nombre diferente que no debe crear un nuevo nodo para los apellidos, pero tengo que poner los nuevos estudiantes de primer nombre y la identificación dentro de un nodo existente del apellido. Debe ser como: Cameron James 12131313
Andrew 17286378 (su apellido es también Cameron)
El código es:
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 *);
En lo principal que yo llamo el loadData () para importar los estudiantes
loadData(&temp);
Y el loadData () es
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);
}
Me llamo el add_node () que insertar un nuevo nodo en mi árbol principal (Apellidos). Este alo funciona ..
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;
}
Mi problema comienza con (topname = add_node_nameANDid (topname, Temp 2);), que es un functon como add_node () pero añade nuevos nodos nameANDid si los estudiantes tienen el mismo apellido .. No sé qué argumentos utilizar ... no me gusta punteros porque no tengo experiencia con su uso (no mojado por lo menos) ... Y el add_node_nameANDid () es
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;
}
En add_node_nameANDid () i intentado utilizar variables similares a ser más fácil de entender .. ¿Cómo debo usar los punteros en el add_node_nameANDid () porque cuando copmpile lo que dice [Aviso] arg paso 1 del `add_node_nameANDid' de tipo de apuntador incompatible en línea
topname->nleft=add_node_nameANDid(topname->nleft,temp);}(in add_node_nameANDid())
o tipo incompatible para el argumento 2 de `add_node_nameANDid'
topname=add_node_nameANDid(topname,temp2);}
cuando llamo al add_node_nameANDid () desde add_node ().
Puede complacer a alguien que me ayude con este lío?













