我做了一个基本的打印功能来打印树节点。我还修改了函数原型以使生活更轻松:)
我希望这会有所帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct ListNode ListNode;
typedef struct TreeNode TreeNode;
struct ListNode {
char *number;
ListNode *next;
};
struct TreeNode {
char *name;
ListNode *numbers;
TreeNode *left;
TreeNode *right;
};
TreeNode *new_tree_node(char *name);
ListNode *new_list_node(char *number);
void ListNode_AddNode(ListNode **plist, char *number);
void TreeNode_AddNode(TreeNode **proot, char *name, char *number);
void ListNode_Print(ListNode *list);
void TreeNode_Print(TreeNode *root);
TreeNode * TreeNode_FindNode(TreeNode * root,char *name);
/*________________________________________________________________________________________________
*/
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);
TreeNode_AddNode(&root, name, number);
}
printf("PRINTING TREENODE:\n");
TreeNode_Print(root);
printf("========================================================================= DONE\n\n");
printf("PRINTING (jaguar's numbers) :\n");
TreeNode *jaguar = TreeNode_FindNode(root,"jaguar");
if(jaguar)
ListNode_Print(jaguar->numbers);
else
printf("jaguar node not found");
printf("\n========================================================================= DONE\n\n");
return 0;
}
/*________________________________________________________________________________________________
*/
TreeNode *new_tree_node(char *name){
TreeNode *tree = calloc(1,sizeof(TreeNode));
if ( tree ) {
tree->name=strdup(name);
}
return tree;
}
ListNode * new_list_node(char *number){
ListNode *list = calloc(1,sizeof(ListNode));
if ( list ) {
list->number=strdup(number);
}
return list;
}
void ListNode_AddNode(ListNode **plist, char *number){
ListNode *list = *plist;
if( !list ) {
list = new_list_node (number);
*plist = list;
}
else{
ListNode_AddNode(&list->next,number);
}
return ;
}
void TreeNode_AddNode(TreeNode **proot, char *name, char *number) {
TreeNode *root = *proot;
if ( !root ) {
root = new_tree_node(name);
*proot = root;
}else {
int comparison = strcmp(name, root->name);
if (comparison < 0 ){
TreeNode_AddNode(&root->left, name, number);
return;
}
if (comparison > 0) {
TreeNode_AddNode(&root->right, name, number);
return;
}
}
ListNode_AddNode ( &root->numbers,number);
return ;
}
void ListNode_Print(ListNode *list){
if(!list) return;
printf("%s ",list->number);
ListNode_Print (list->next);
}
void print_tatbs(int n){
while( n ){
n--;
putchar('\t');
}
}
void TreeNode_Print(TreeNode *root){
static int tree_deep = 0;
if( !root )
return;
print_tatbs(tree_deep);
printf("Node: %s, Numbers: ",root->name);
ListNode_Print(root->numbers);
printf("\n");
if(root->left){
tree_deep++;
print_tatbs(tree_deep);
printf("Left:\n");
TreeNode_Print(root->left);
tree_deep--;
}
if(root->right){
tree_deep++;
print_tatbs(tree_deep);
printf("Right:\n");
TreeNode_Print(root->right);
tree_deep--;
}
}
TreeNode * TreeNode_FindNode(TreeNode * root,char *name){
if(!root) return root;
int comparison = strcmp(name, root->name);
if (comparison < 0 )
return TreeNode_FindNode(root->left, name);
if (comparison > 0)
return TreeNode_FindNode(root->right, name);
return root;
}