C中的二叉树 - 多数据

Posted

技术标签:

【中文标题】C中的二叉树 - 多数据【英文标题】:binary tree in C - multiple data 【发布时间】:2019-12-09 19:35:18 【问题描述】:

我需要创建一个二叉搜索树来存储许多竞赛成员。

typedef struct Member
char name[30];
char surname[30];
int id;
char email[30];
member;

用于添加节点的键是名称(字母顺序)。我知道我需要使用 strcmp 来定义放置新成员的位置,但我不知道如何实现树。我的结构应该是这样的吗:

typedef struct Member
char name[30];
char surname[30];
int id;
char email[30];
struct mnode *left; 
struct mnode *right;
member;

或者我应该保留旧结构并为节点创建一个结构,然后将指针作为数据类型传递给成员:

typedef struct mnode  
    struct member *aMember; 
    struct tnode *left; 
    struct tnode *right;
 MTree;

如果是这样,是否正确? :

MTree* addMember(MTree* nodeP, char name, char surname, int id, char email)
    if( nodeP == NULL )
    
        nodeP = (struct tnode*) malloc( sizeof( struct mnode ) );
        (nodeP->mBook)->name = name;
        (nodeP->mBook)->surname = surname;
        (nodeP->mBook)->id = id;
        (nodeP->mBook)->email = email;

        /* initialize the children to null */
        (nodeP)->left = NULL;    
        (nodeP)->right = NULL;  
    
    else if(name > (nodeP->aBook)->name)
    
        addMember(&(nodeP)->left,name,surname,id,email);
    
    else if(year < (nodeP->aBook)->year)
    
        addMember(&(nodeP)->right,name,surname,id,email);
    
    return nodeP;

【问题讨论】:

两种结构都可以。至于“是否正确”:确定的方法是测试代码。事实上,你真的没有任何具体的问题。我鼓励您通过测试代码来继续您的工作。如果您遇到实际问题,请返回以 minimal verifiable example 显示您的代码并询问有关特定问题的问题。 另外,请注意您可以编辑原始问题。因此,将任何更新/更改放入问题本身,而不是作为 cmets。 请注意,名称通常有多个字母;您需要在函数签名中使用char *namechar *surname。您还需要使用strcpy() 或等效项将名称复制到结构中——普通的分配不起作用。 还要注意&amp;(nodeP)-&gt;left&amp;(nodeP-&gt;left) 相同,并且通常写成&amp;nodeP-&gt;left — 不需要括号。 【参考方案1】:

如果编码正确,则可以使用增强结构或附加结构技术——两者都有效,而且有时都需要。

但是,限定词“如果编码正确”至关重要。您的第一个增强结构显示为:

typedef struct Member

    char name[30];
    char surname[30];
    int id;
    char email[30];
    struct mnode *left; 
    struct mnode *right;
 member;

此时,还没有已知的struct mnode,因此您有两个指向与成员结构无关的结构的指针。您需要:

typedef struct Member

    char name[30];
    char surname[30];
    int id;
    char email[30];
    struct Member *left; 
    struct Member *right;
 member;

或:

typedef struct Member member;

struct Member

    char name[30];
    char surname[30];
    int id;
    char email[30];
    member *left; 
    member *right;
;

两者都有效;没有一个强有力的理由支持另一个 - 但是当你需要它们时,第二个适合“不透明数据类型”。

同样,你有:

typedef struct mnode  
    struct member *aMember; 
    struct tnode *left; 
    struct tnode *right;
 MTree;

还没有显示类型struct member(有一个struct Member——记住,C 区分大小写),也没有struct tnode。这种结构就目前而言是无用的,但如果更正为:

typedef struct mnode
 
    struct Member *aMember; 
    struct mnode  *left; 
    struct mnode  *right;
 MTree;

然后它可以用于原始struct Member 结构的树(其中没有指针的树)。您也可以不使用指向成员的指针:

typedef struct mnode
 
    struct Member aMember; 
    struct mnode *left; 
    struct mnode *right;
 MTree;

这样做的好处是少了一块内存来分配和释放;它简化了簿记。

您必须妥善控制结构标签和 typedef 名称。没有理由一直发明新名称。您可以使用:

typedef struct Tag Tag;

或:

typedef struct Tag  …structure definition…  Tag;

然后struct TagTag 都指向同一个类型。结构(以及联合和枚举)标记的命名空间与普通标识符命名空间(这是 typedef 名称的命名空间)分开。 C++ 自动提供此功能;您必须在 C 中手动完成,如图所示。 Linux 内核编码指南不允许结构类型的 typedef — 您必须始终编写 struct WhatEver 并且不要创建像 typedef struct WhatEver WhatEver;typedef struct WhatEver WhatIsIt; 这样的名称。您不必在自己的代码中遵循 Linux 指南——我不需要——但它们并非完全没有优点。

【讨论】:

以上是关于C中的二叉树 - 多数据的主要内容,如果未能解决你的问题,请参考以下文章

Cuda C中的二叉树搜索 - 并行

C ++在不同类型的二叉树中搜索二叉树

JS中的二叉树遍历

C语言实现二叉树(初阶数据结构)

用C语言编写程序,创建一个二叉树的二叉链表结构,然后输出从根结点到所有叶子结点的路径。

数据结构 第5章 树的二叉树 单元小结遍历二叉树和线索二叉树