完成对家谱成员信息的建立、查找、插入、修改、删除等功能。首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能。写出C语言代码,要求运行结果如下:按后根遍历显示的结点次序为: E F B C D G H A 输入欲删除第几个结点(k):3 释放: G 第3个孩子结点,删除成功! 按先根遍历显示的结点次序为: A B E F C D H
时间: 2024-03-04 19:47:54 浏览: 34
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 家族成员结构体
typedef struct {
char name[MAX_SIZE]; // 姓名
int age; // 年龄
} Person;
// 家族成员树结点
typedef struct TreeNode {
Person person; // 成员信息
struct TreeNode *firstChild; // 第一个孩子结点
struct TreeNode *nextSibling; // 兄弟结点
} TreeNode, *Tree;
// 初始化树
void initTree(Tree *tree) {
*tree = NULL;
}
// 创建结点
TreeNode *createNode(Person person) {
TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));
node->person = person;
node->firstChild = NULL;
node->nextSibling = NULL;
return node;
}
// 插入孩子结点
void insertChild(Tree *tree, TreeNode *parent, TreeNode *child) {
if (*tree == NULL) {
*tree = child;
} else if (parent->firstChild == NULL) {
parent->firstChild = child;
} else {
TreeNode *sibling = parent->firstChild;
while (sibling->nextSibling != NULL) {
sibling = sibling->nextSibling;
}
sibling->nextSibling = child;
}
}
// 构建家族成员树
void buildTree(Tree *tree) {
// 构建家族成员树
Person persons[MAX_SIZE] = {
{"A", 60}, {"B", 30}, {"C", 20}, {"D", 10},
{"E", 50}, {"F", 40}, {"G", 15}, {"H", 5}
};
TreeNode *nodes[MAX_SIZE];
for (int i = 0; i < MAX_SIZE; ++i) {
nodes[i] = createNode(persons[i]);
}
insertChild(tree, nodes[0], nodes[1]);
insertChild(tree, nodes[0], nodes[4]);
insertChild(tree, nodes[1], nodes[2]);
insertChild(tree, nodes[1], nodes[3]);
insertChild(tree, nodes[4], nodes[5]);
insertChild(tree, nodes[4], nodes[6]);
insertChild(tree, nodes[3], nodes[7]);
}
// 先根遍历
void preOrderTraversal(TreeNode *node) {
if (node != NULL) {
printf("%s ", node->person.name);
preOrderTraversal(node->firstChild);
preOrderTraversal(node->nextSibling);
}
}
// 后根遍历
void postOrderTraversal(TreeNode *node) {
if (node != NULL) {
postOrderTraversal(node->firstChild);
printf("%s ", node->person.name);
postOrderTraversal(node->nextSibling);
}
}
// 查找结点
TreeNode *findNode(Tree tree, int index) {
if (index == 1) {
return tree;
}
int i = 1;
TreeNode *node = tree->firstChild;
while (node != NULL) {
i++;
if (i == index) {
return node;
}
node = node->nextSibling;
}
return NULL;
}
// 删除结点
void deleteNode(Tree *tree, int index) {
if (index == 1) {
*tree = NULL;
} else {
int i = 1;
TreeNode *parent = *tree;
TreeNode *node = parent->firstChild;
while (node != NULL) {
i++;
if (i == index) {
parent->firstChild = node->nextSibling;
printf("释放: %s\n", node->person.name);
free(node);
return;
}
parent = node;
node = node->nextSibling;
}
}
}
int main() {
// 构建家族成员树
Tree tree;
initTree(&tree);
buildTree(&tree);
// 后根遍历
printf("按后根遍历显示的结点次序为: ");
postOrderTraversal(tree);
printf("\n");
// 删除结点
int k;
printf("输入欲删除第几个结点(k):");
scanf("%d", &k);
deleteNode(&tree, k);
// 先根遍历
printf("按先根遍历显示的结点次序为: ");
preOrderTraversal(tree);
printf("\n");
return 0;
}
```
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)