【问题标题】:Linked Lists Integrated into a Tree Struct链接列表集成到树结构中
【发布时间】:2011-11-19 20:00:52
【问题描述】:

我正在创建一个树结构,该树结构的每个节点都包含一个数据(数字)链表。现在,在我看来,这意味着每个链接的链接显然都需要有一个与之关联的头,这样我就可以访问它们中的数据并循环遍历,显示该 TreeNode 的所有数字。问题是,我碰到了一堵砖墙,真的不知道从我现在的位置采取什么步骤(见下文)。我需要为每个链表返回一个头,对于每个 TreeNode,我不确定如何。

下面是我到目前为止的代码,此时,它将名称添加到节点,并将数字添加到列表中,但是将多个数字添加到列表中,我不确定下一步是什么采取,然后如何返回一个项目以允许我的(及时)打印功能循环。

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);
void 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);  
}   
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;
}

【问题讨论】:

    标签: c tree linked-list


    【解决方案1】:

    希望我正确理解了您的问题...

    我建议您向列表添加另一个级别的间接...您可以创建一个 List 结构来保存 List 的头部、尾部等,并添加一个 List(或指向其中的指针)而不是ListNode* 到 TreeNode 结构。这样你就可以拥有一个List* getList(TreeNode*) 并拥有直接在返回的列表上运行的函数(我认为这更干净)。这意味着您的列表实现将与您的树完全分离,这意味着您可以轻松地在此项目之外使用它。

    另一种方法是将 List 完全封装在 TreeNode 结构中,我认为您正在尝试这样做。要添加到列表中,您可能需要一个函数 addNumber(TreeNode*, char*) 并且其他列表操作函数将类似地完成。他们只需要一个指向提供对列表的访问的 TreeNode 的引用或指针。

    要做你想做的事,如果你有TreeNode*,你已经可以访问ListNode*

    TreeNode* tn = something; 
    for(ListNode* ln = tn->numbers; ln != NULL; ln = ln->next) {
        // do something here (print, etc.) with ln->number
    }
    

    您可以轻松地将其弹​​出到以TreeNode* 作为参数的函数中。这是你想要做的吗?

    【讨论】:

    • 不,我只能使用 C。抱歉,我无法从我当前的代码中完成它,我想尝试坚持我的第一个解决方案的想法。跨度>
    • 是的,我想说的是addNumber(TreeNode*,int) 部分...让我知道什么不清楚。几乎将所有适用于列表的功能添加到 TreeNodes 上,这实际上是您的列表。看起来您正在使用带有空哨兵的单链表,对吧?
    • 是的,我将使用单链表,但是不,我已经研究了一段时间,仍然没有进展,我只是看不到从哪里开始
    • @user1048116 我仍然认为TreeNode 包含一个包含所有名称、编号和列表的结构类型会更好。这将大大简化事情。但是看看我的编辑是否对你有帮助。
    【解决方案2】:

    我做了一个基本的打印功能来打印树节点。我还修改了函数原型以使生活更轻松:)

    我希望这会有所帮助。

    #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; 
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多