#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 50
#define MAX_GEN 5
#define HASH_TABLE_SIZE 100
// 树节点定义
typedef struct FamilyNode {
char name[MAX_NAME_LEN];
char styleName[MAX_NAME_LEN];
char posthumousName[MAX_NAME_LEN];
char history[MAX_NAME_LEN];
struct FamilyNode *father;
struct FamilyNode *firstChild;
struct FamilyNode *nextSibling;
} FamilyNode;
// 哈希表节点定义
typedef struct HashNode {
char key[MAX_NAME_LEN];
FamilyNode *member;
struct HashNode *next;
} HashNode;
// 哈希表结构体
typedef struct {
HashNode *buckets[HASH_TABLE_SIZE];
} FamilyHash;
// 树结构操作函数
FamilyNode* createFamilyMember(const char* name, const char* style,
const char* posthumous, const char* history) {
FamilyNode* node = (FamilyNode*)malloc(sizeof(FamilyNode));
strcpy(node->name, name);
strcpy(node->styleName, style);
strcpy(node->posthumousName, posthumous);
strcpy(node->history, history);
node->father = node->firstChild = node->nextSibling = NULL;
return node;
}
void insertChild(FamilyNode* parent, FamilyNode* child) {
if (!parent || !child) return;
child->father = parent;
child->nextSibling = parent->firstChild; // 新节点作为长子,原长子成为下一个兄弟
parent->firstChild = child;
}
void queryAncestors(FamilyNode* member) {
if (!member) {
printf("成员不存在\n");
return;
}
printf("===== 五代祖先查询 =====\n");
FamilyNode* current = member->father;
int generation = 1;
while (current && generation <= MAX_GEN) {
printf("%d代祖: %s(%s-%s-%s)\n", generation,
current->name, current->styleName,
current->posthumousName, current->history);
current = current->father;
generation++;
}
if (generation == 1) printf("无祖先信息\n");
}
// 哈希表操作函数
int hashFunc(const char* key) {
int sum = 0;
while (*key) sum += *(key++);
return sum % HASH_TABLE_SIZE;
}
// 修复:插入哈希表时正确处理字符串长度
void insertByKey(FamilyHash* hash, const char* key, FamilyNode* member) {
int index = hashFunc(key);
HashNode* newNode = (HashNode*)malloc(sizeof(HashNode));
strncpy(newNode->key, key, MAX_NAME_LEN-1); // 防止缓冲区溢出
newNode->key[MAX_NAME_LEN-1] = '\0'; // 确保字符串终止
newNode->member = member;
newNode->next = hash->buckets[index];
hash->buckets[index] = newNode;
}
void insertHash(FamilyHash* hash, FamilyNode* member) {
insertByKey(hash, member->name, member);
insertByKey(hash, member->styleName, member);
insertByKey(hash, member->posthumousName, member);
}
FamilyNode* searchMember(FamilyHash* hash, const char* key) {
int index = hashFunc(key);
HashNode* current = hash->buckets[index];
while (current) {
if (strcmp(current->key, key) == 0) {
return current->member;
}
current = current->next;
}
return NULL;
}
void removeFromHash(FamilyHash* hash, const char* key) {
int index = hashFunc(key);
HashNode* prev = NULL;
HashNode* current = hash->buckets[index];
while (current) {
if (strcmp(current->key, key) == 0) {
if (prev) {
prev->next = current->next;
} else {
hash->buckets[index] = current->next;
}
free(current); // 修复:释放哈希表节点内存
return;
}
prev = current;
current = current->next;
}
}
int deleteMember(FamilyHash* hash, const char* key) {
FamilyNode* target = searchMember(hash, key);
if (!target) return 0;
// 断开父子关系
if (target->father) {
FamilyNode* father = target->father;
if (father->firstChild == target) {
father->firstChild = target->nextSibling;
} else {
FamilyNode* sibling = father->firstChild;
while (sibling && sibling->nextSibling != target) {
sibling = sibling->nextSibling;
}
if (sibling) sibling->nextSibling = target->nextSibling;
}
}
// 删除哈希表中的索引
removeFromHash(hash, target->name);
removeFromHash(hash, target->styleName);
removeFromHash(hash, target->posthumousName);
// 如需物理删除节点(连同家族数据),请取消注释
// free(target);
return 1;
}
// 辅助函数:初始化哈希表
void initHashTable(FamilyHash* hash) {
for (int i = 0; i < HASH_TABLE_SIZE; i++) {
hash->buckets[i] = NULL;
}
}
// 新增:子孙查询函数(递归实现)
void printDescendant(FamilyNode* node, int level) {
if (!node) return;
printf("%*s%-2d代: %s(%s-%s-%s)\n", level*4, "", level,
node->name, node->styleName, node->posthumousName, node->history);
printDescendant(node->firstChild, level + 1);
printDescendant(node->nextSibling, level);
}
void queryDescendants(FamilyNode* member) {
if (!member) {
printf("成员不存在\n");
return;
}
printf("===== 五代子孙查询 =====\n");
printDescendant(member->firstChild, 1); // 从长子开始查询
}
// 测试函数
void testCase1() {
FamilyHash hash;
initHashTable(&hash);
// 创建第一代:王览
FamilyNode* wangLan = createFamilyMember("王览", "玄通", "贞", "西晋光禄大夫,王祥异母弟");
insertHash(&hash, wangLan);
// 创建第二代:王导、王敦
FamilyNode* wangDao = createFamilyMember("王导", "茂弘", "文献", "东晋丞相,历仕三朝");
insertChild(wangLan, wangDao);
insertHash(&hash, wangDao);
FamilyNode* wangDun = createFamilyMember("王敦", "处仲", "", "大将军");
insertChild(wangLan, wangDun);
insertHash(&hash, wangDun);
// 创建第三代:王悦、王洽
FamilyNode* wangYue = createFamilyMember("王悦", "长豫", "康", "王导长子,中书侍郎");
insertChild(wangDao, wangYue);
insertHash(&hash, wangYue);
FamilyNode* wangQia = createFamilyMember("王洽", "敬和", "", "中领军");
insertChild(wangDao, wangQia);
insertHash(&hash, wangQia);
// 测试祖先查询:王悦的祖先
printf("===== 测试用例1:查询王悦的祖先 =====\n");
FamilyNode* member = searchMember(&hash, "王悦");
queryAncestors(member);
// 测试删除无子孙成员:王悦
printf("\n===== 测试用例2:删除王悦 =====\n");
deleteMember(&hash, "王悦");
// 测试子孙查询:查看王导的子孙(应包含王洽)
printf("===== 测试用例3:查询王导的子孙 =====\n");
member = searchMember(&hash, "王导");
queryDescendants(member);
}
int main() {
testCase1();
return 0;
}
以上代码是否有错误,请加以修改
最新发布