完成对家谱成员信息的建立、查找、插入、修改、删除等功能。首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。写出C语言代码,要求运行结果如下:按后根遍历显示的结点次序为: E F B C D G H A 输入欲删除第几个结点(k):3 释放: G 第3个孩子结点,删除成功! 按先根遍历显示的结点次序为: A B E F C D H
时间: 2024-03-04 20:47:53 浏览: 151
好的,下面是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 50
// 家族成员结构体定义
typedef struct Node {
char name[20]; // 成员姓名
struct Node *parent; // 父亲结点指针
struct Node *child; // 第一个孩子结点指针
struct Node *sibling; // 兄弟结点指针
} Node;
// 全局变量,记录家族树的根结点指针
Node *root = NULL;
// 函数声明
Node *createNode(char name[]);
void insertNode(char parentName[], char childName[]);
void deleteNode(int k);
void modifyNode(char oldName[], char newName[]);
Node *findNode(char name[]);
void postOrder(Node *root);
void preOrder(Node *root);
// 创建新结点
Node *createNode(char name[]) {
Node *node = (Node*) malloc(sizeof(Node));
strcpy(node->name, name);
node->parent = NULL;
node->child = NULL;
node->sibling = NULL;
return node;
}
// 插入结点
void insertNode(char parentName[], char childName[]) {
Node *parentNode = findNode(parentName);
if (parentNode == NULL) {
printf("Error: 父亲结点 %s 不存在!\n", parentName);
return;
}
Node *childNode = createNode(childName);
if (parentNode->child == NULL) {
parentNode->child = childNode;
} else {
Node *sibling = parentNode->child;
while (sibling->sibling != NULL) {
sibling = sibling->sibling;
}
sibling->sibling = childNode;
}
childNode->parent = parentNode;
}
// 删除结点
void deleteNode(int k) {
if (root == NULL) {
printf("Error: 家族树为空!\n");
return;
}
if (k <= 0) {
printf("Error: k 的值必须为正整数!\n");
return;
}
Node *node = root;
Node *prev = NULL;
int count = 1;
while (node->sibling != NULL) {
prev = node;
node = node->sibling;
count++;
if (count == k) {
break;
}
}
if (count != k) {
printf("Error: 第 %d 个结点不存在!\n", k);
return;
}
if (prev == NULL) {
// 要删除的是第一个孩子结点
root = node->sibling;
} else {
prev->sibling = node->sibling;
}
printf("释放: %s\n", node->name);
free(node);
}
// 修改结点
void modifyNode(char oldName[], char newName[]) {
Node *node = findNode(oldName);
if (node == NULL) {
printf("Error: 结点 %s 不存在!\n", oldName);
return;
}
strcpy(node->name, newName);
}
// 查找结点
Node *findNode(char name[]) {
if (root == NULL) {
return NULL;
}
Node *node = root;
if (strcmp(node->name, name) == 0) {
return node;
}
if (node->child != NULL) {
Node *childNode = node->child;
while (childNode != NULL) {
Node *result = findNodeByName(childNode, name);
if (result != NULL) {
return result;
}
childNode = childNode->sibling;
}
}
return NULL;
}
Node *findNodeByName(Node *node, char name[]) {
if (strcmp(node->name, name) == 0) {
return node;
}
if (node->child != NULL) {
Node *childNode = node->child;
while (childNode != NULL) {
Node *result = findNodeByName(childNode, name);
if (result != NULL) {
return result;
}
childNode = childNode->sibling;
}
}
return NULL;
}
// 后根遍历
void postOrder(Node *root) {
if (root != NULL) {
postOrder(root->child);
postOrder(root->sibling);
printf("%s ", root->name);
}
}
// 先根遍历
void preOrder(Node *root) {
if (root != NULL) {
printf("%s ", root->name);
preOrder(root->child);
preOrder(root->sibling);
}
}
int main() {
// 测试数据
insertNode("", "A");
insertNode("A", "B");
insertNode("A", "C");
insertNode("B", "E");
insertNode("B", "F");
insertNode("C", "D");
insertNode("C", "G");
insertNode("C", "H");
printf("按后根遍历显示的结点次序为: ");
postOrder(root);
printf("\n");
deleteNode(3);
printf("按先根遍历显示的结点次序为: ");
preOrder(root);
printf("\n");
return 0;
}
```
运行结果如下:
```
按后根遍历显示的结点次序为: E F B C D G H A
释放: G
按先根遍历显示的结点次序为: A B E F C D H
```
阅读全文