2011-11-19 70 views
0

最终问题/张贴在这!我觉得我现在非常接近!链接列表和树木

基本上,一棵树,其中每个节点包含一个数字列表,其中树按名称排序(树节点中包含的数据)。从本质上说,目前,我的名字已经添加到我的树中,并且该树的列表中给出了数字,但是我正在努力争取每个名称具有多个数字的能力,因此如果两个数字相同的名字用不同的数字输入。我有比较代码来检查相同的名称,但在那个时候,我不确定如何修改我的指针,以便我添加另一个元素到我的列表中,并在那里添加新的数字。

干杯,任何帮助/提示/线索等我们非常感激

下面是我当前的代码:

编辑:真正的问题是,我怎么现在,拿我的代码,并允许每个TreeNode的列表包含多个数字,当输入前一个treenode的相同名称时,将构建该名称的数字列表。

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 

typedef struct ListNode { 
    char   *number; 
    struct ListNode *next; 
}ListNode; 

typedef struct TreeNode { 
    char   *name; 
    ListNode  *numbers; 
    struct TreeNode *left; 
    struct TreeNode *right; 
}TreeNode; 

TreeNode* AddNode(TreeNode *, char *, char *); 
TreeNode* SearchTree(TreeNode *root, char *search); 
int N_Print(TreeNode *root); 

int main(void) { 
    char my_string[50], name[25], number[25]; 
    TreeNode *root = NULL; 
    while ((fgets(my_string, 50, stdin)) != NULL) { 
     if (my_string[0] == '.') 
      break;  
     sscanf(my_string, "%s %s", name, number); 
     root = AddNode(root, name, number); 
    } 
    N_Print(root); 
    return 0; 
} 

TreeNode* AddNode(TreeNode *root, char *name, char *number) { 
    int comparison; 
    if (root == NULL) { 
     root = (TreeNode *)malloc(sizeof(TreeNode)); 
     root->numbers = (ListNode *)malloc(sizeof(ListNode)); 
     root->name = strdup(name); root->numbers->number = strdup(number); 
     root->left = root->right = NULL; 
     root->numbers->next = NULL; 
    }else if ((comparison = strcmp(name, root->name)) < 0) 
     root->left = AddNode(root->left, name, number); 
    else if (comparison > 0) { 
     root->right = AddNode(root->right, name, number); 
    } else if (comparison == 0) { 
     root->numbers->number = strdup(number); 
     root->numbers->next = NULL; 
    } 
    return root; 
} 

TreeNode* SearchTree(TreeNode *root, char *search) { 
    int comparison; 
    if (root == NULL) { 
     printf("NOT FOUND\n"); 
     return NULL; 
    } else if ((comparison = stricmp(search, root->name)) == 0) { 
     return root; 
    } else if ((comparison = stricmp(search, root->name)) < 0) { 
     return SearchTree(root->left, search); 
    } else if ((comparison = stricmp(search, root->name)) > 0) 
     return SearchTree(root->right, search);  
} 

int N_Print(TreeNode *root) { 
    TreeNode *search_val; 
    char search[25]; 
    while(1) { 
     printf("Type a name please: "); 
     scanf("%24s", search); 
     if (search[0] == '.') 
      break; 
     search_val = SearchTree(root, search); 
     if (search_val == NULL) { 
      N_Print(root); 
     } 
     printf("%s\n", search_val->numbers->number); 
    } 
    return 0; 
} 

我的第一个猜测是,我需要添加代码,需要放在我的比较,如果语句中时的结果比较== 0,从而增加了列表,并添加数量那里。但这是我卡住的地方!

+0

这是一个功课题吗?如果是的话请重新标记。 –

+0

是的,我会重新标记。 – PnP

+0

你可以把它变成一个具体的问题吗? –

回答

1

我没有通过您的代码完全读,因为它使我的目光呆滞......

这是你的结构保存的数字。

typedef struct ListNode { 
    char   *number; 
    struct ListNode *next; 
}ListNode; 

如果一个名字有多个数字,你应该像这样声明它。

char   **number; 

使得第一指针*(* 数+ 0)是该名称的第一个数字,然后* *号+ 0)是下一个。这看起来更整洁一些,因此我建议像这样构建它,然后遍历列表,直到找到空值以获取该名称的所有可能数字。

0

由于此线程包含大部分代码,因此我认为最好在此处做出回应。

为了让你的代码工作,你需要内改变代码的“IF语句”你的函数AddNodecomparison == 0,你已经指出的。

TreeNode* AddNode(TreeNode *root, char *name, char *number) { 
int comparison; 
if (root == NULL) { 
    root = (TreeNode *)malloc(sizeof(TreeNode)); 
    root->numbers = (ListNode *)malloc(sizeof(ListNode)); 
    root->name = strdup(name); root->numbers->number = strdup(number); 
    root->left = root->right = NULL; 
    root->numbers->next = NULL; 
}else if ((comparison = strcmp(name, root->name)) < 0) 
    root->left = AddNode(root->left, name, number); 
else if (comparison > 0) { 
    root->right = AddNode(root->right, name, number); 
} else if (comparison == 0) { 

    // Create a new ListNode 
    newListNode = (ListNode *)malloc(sizeof(ListNode)); 

    newListNode -> number = strdup(number); 

    // Add newListNode to existing list 
    newListNode -> next = root -> numbers; 
    root -> numbers = newListNode; 
} 
return root; 
} 

你或许应该还调整了SearchTree功能,使其返回电话号码列表。