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 *name
和char *surname
。您还需要使用strcpy()
或等效项将名称复制到结构中——普通的分配不起作用。
还要注意&(nodeP)->left
与&(nodeP->left)
相同,并且通常写成&nodeP->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 Tag
和Tag
都指向同一个类型。结构(以及联合和枚举)标记的命名空间与普通标识符命名空间(这是 typedef 名称的命名空间)分开。 C++ 自动提供此功能;您必须在 C 中手动完成,如图所示。 Linux 内核编码指南不允许结构类型的 typedef — 您必须始终编写 struct WhatEver
并且不要创建像 typedef struct WhatEver WhatEver;
或 typedef struct WhatEver WhatIsIt;
这样的名称。您不必在自己的代码中遵循 Linux 指南——我不需要——但它们并非完全没有优点。
【讨论】:
以上是关于C中的二叉树 - 多数据的主要内容,如果未能解决你的问题,请参考以下文章