2011-05-23 63 views
2

我有一个家庭工作即将完成,但我卡住了某处。我必须警告,这是我第一次使用指针和所有这些怪异的东西,米相当丢失。我的目的是从txt学生数据列表中读取(姓氏名称ID)。诀窍是我必须使用一个二叉搜索树来存储姓氏(我已经这样做了),并在第一棵树内创建另一个二叉搜索树,其中存储学生的名字和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(),它在我的主(姓氏)树中插入一个新节点。这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);)开始它就像一个add_node functon(),但她增加了新的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它上面说的`add_node_nameANDid [警告]通过ARG 1 '从兼容的指针类型管线

topname->nleft=add_node_nameANDid(topname->nleft,temp);}(in add_node_nameANDid()) 

或不兼容的类型的`add_node_nameANDid参数2'

topname=add_node_nameANDid(topname,temp2);} 

当我从add_node()调用add_node_nameANDid()。

可以请某人帮我解决这个问题吗?

回答

3

看起来问题在于,您对左右两个结构都使用node *。所以发生的是你正在复制一个struct nameANDidstruct node。我建议您在nameANDid中需要nleftnright作为指向struct nameANDid而不是struct node的指针。

编辑:还有其他各种问题,例如我认为其目的是要查看结构节点中的yohoho以获取名字的二进制树。 add_node_nameANDid也设置为temp->nlefttemp->nrightnull,不知道这是否正确。

+0

谢谢!!! ..肯定会在报告窗口中显示很多行,但是您是否知道如何从add_node()调用add_node_nameANDid()..它仍然说“参数2的ncompatible类型当我调用topname = add_node_nameANDid(topname,temp2)时,'add_node_nameANDid'; – Spyros 2011-05-23 09:25:18

+0

我按照你的建议和“topname = add_node_nameANDid(topname,&temp-> yohoho);”它的工作!!!! ...好祝福你!!!!!!!!!!!!!!!!!!!!!!!!!! – Spyros 2011-05-23 09:39:17