北京大学王悦博士给学生的话

良好的生活习惯是学习的基础,保持健康的同时,专注于一个问题并深入研究是提高学习效率的关键。利用网络资源,面对难题时不要放弃,而是要耐心寻找解决方案,拼凑理解的知识点,最终能获得深刻的理解。

**给未来学生的话

  1. 良好的作息时间、均衡的饮食、适当的运动是身体健康和头脑发展的基石。22:30-7:00睡眠;将精神状态好的大段时间或零碎时间投入学习、研究。请尽量靠近。
  2. One big Thing at a time. & Stay with your problem longer. 爱因斯坦天才耀眼,传说曾有人问他,怎么想出来的。他说,我只不过与我的问题多呆了一段时间。你有待解决的问题吗?有个大目标和小目标。Stay with your problem longer. 一次多与你待解决的问题多呆一会儿,每周匀出一段时间,坚持下来就发现自己走得很远了。这就是专注的力量!
  3. 网络时代的学习成本较低,当你想了解一个新知识时,如果在书本里看不懂,不要泄气。搜搜网文,找找课程,刚开始只去理解你能理解了的,把你理解的只言片语拼凑起来,想一想,通常就能理解到不少了。BTW: 学生可以去我的优快云博客去获取一些基础知识的导读和学习研究方法的体会。**
#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; } 以上代码是否有错误,请加以修改
最新发布
05-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值