用c语言编写一个家族关系查询系统 设计要求: (1)建立家族关系并能存储到文件中。 (2)实现家族成员的添加。 (3)可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信,查找家族成员的祖先路径、确定成员是家族中的第几代。
时间: 2024-09-26 15:10:18 浏览: 18
数据结构课程设计家族关系.doc
在C语言中创建一个家族关系查询系统,我们可以使用结构体来表示家庭成员,数组或链表来存储他们,并提供一些函数来完成指定的操作。以下是基本的设计思路:
```c
#include <stdio.h>
#include <stdlib.h>
// 家庭成员结构体
typedef struct {
char name[50];
int relation; // 双亲(-1, 0, 1), 兄弟(-2), 孩子(2), 后代(3)
int parent_id; // 父母的索引,-1表示无父母
} FamilyMember;
// 家族数据结构
typedef struct {
FamilyMember members[];
int size;
FILE* file; // 文件指针用于保存和读取数据
} FamilyDatabase;
// 函数原型
void addMember(FamilyDatabase* db, char* name, int relation);
FamilyMember* findParent(FamilyDatabase* db, int member_id);
FamilyMember* findDescendant(FamilyDatabase* db, int member_id);
// 主函数
int main() {
FamilyDatabase db;
db.file = fopen("family_data.txt", "w+b"); // 打开文件
// 添加成员
addMember(&db, "爷爷", -1); // 假设已有成员
addMember(&db, "爸爸", 0); // 爸爸的父母是爷爷
// ... 更多添加
// 查询功能示例
FamilyMember* dad = findParent(&db, 2); // 查找爸爸的父母
if (dad) printf("%s is the parent of %s.\n", dad->name, db.members[2].name);
fclose(db.file); // 关闭文件
return 0;
}
// 实现函数
void addMember(FamilyDatabase* db, char* name, int relation) {
// 检查数据库大小,动态扩容如果必要
if (db->size == sizeof(db->members)) {
db->size *= 2;
db->members = realloc(db->members, db->size * sizeof(FamilyMember));
}
db->members[db->size - 1].name = name;
db->members[db->size - 1].relation = relation;
db->members[db->size - 1].parent_id = -1; // 初始化为无父母
// 写入文件
fwrite(&db->members[db->size - 1], sizeof(FamilyMember), 1, db->file);
db->size++;
}
FamilyMember* findParent(FamilyDatabase* db, int member_id) {
for (int i = 0; i < db->size; i++) {
if (db->members[i].parent_id == member_id) return &db->members[i];
}
return NULL; // 如果未找到,则返回NULL
}
FamilyMember* findDescendant(FamilyDatabase* db, int member_id) {
// 根据需要,你可以遍历整个数据库寻找符合条件的子孙节点,这里简化了处理
for (int i = 0; i < db->size; i++) {
if (db->members[i].relation > 0 && db->members[i].parent_id == member_id) return &db->members[i];
}
return NULL;
}
阅读全文