C语言版家谱管理系统
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#pragma warning(disable:6011)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <assert.h>
#define STR_LEN 128
#define CHILD_LEN 64
#define BUFFER_SIZE 1024
typedef struct _tMember {
char name[STR_LEN];
char wife[STR_LEN];
}Member, * pMember;
typedef struct _tTreeNode {
Member member;
struct _tTreeNode* parent;
struct _tTreeNode* children[CHILD_LEN];
int count;
int level;
}TreeNode, * pTreeNode;
pTreeNode createTreeNode(pTreeNode parent, pMember member) {
pTreeNode node = (pTreeNode)calloc(1, sizeof(TreeNode));
if (node) {
node->member = *member;
if (parent) {
node->parent = parent;
node->level = parent->level + 1;
parent->children[parent->count++] = node;
}
}
return node;
}
void removeTreeNode(pTreeNode cursor) {
if (cursor) {
if (cursor->parent) {
pTreeNode parent = cursor->parent;
int position = -1;
for (int index = 0; index < parent->count; ++index) {
if (parent->children[index] == cursor) {
position = index;
break;
}
}
if (position != -1) {
for (int index = position + 1; index < parent->count; ++index) {
parent->children[index - 1] = parent->children[index];
}
--parent->count;
}
}
}
}
int countMemberLevel(const char content[]) {
int level = 0;
const char* cursor = content;
while (*cursor == ' ') {
++level;
++cursor;
}
return level;
}
void inputSex(char sex[]) {
do {
int option;
printf("\n");
printf("----------\n");
printf(" 1 男\n");
printf(" 2 女\n");
printf("----------\n");
printf(" 请选择:");
scanf("%d", &option);
switch (option) {
case 1:
strcpy(sex, "男");
return;
case 2:
strcpy(sex, "女");
return;
}
} while (1);
}
int checkDate(const char date[]) {
int yyyy, mm, dd;
if (strlen(date) != 10) return 0;
if (sscanf(date, "%4d-%2d-%2d", &yyyy, &mm, &dd) != 3) return 0;
if (yyyy < 1999)return 0;
if (yyyy >= 3000) return 0;
if (mm < 1) return 0;
if (mm > 12) return 0;
if (dd < 1) return 0;
if (dd > 31) return 0;
return 1;
}
void inputDate(char date[]) {
do {
scanf("%s", date);
if (checkDate(date)) break;
printf("格式错误,请重新输入!(yyyy-mm-dd)\n");
} while (1);
}
void editFamilyMember(pMember member) {
printf("╔-----------------------------------------╗\n");
printf(" * 编辑家谱成员信息 *\n");
if (strlen(member->name)) {
printf(" 姓名:%s\n", member->name);
}
else {
printf(" 姓名:");
scanf("%s", member->name);
}
printf(" 妻子:");
scanf("%s", member->wife);
printf("╚-----------------------------------------╝\n");
}
void showFamilyMemberTitle() {
printf(" %-10s", "姓名");
printf(" %-10s", "妻子");
printf("\n");
}
void showFamilyMember(pMember member, int newline) {
printf(" %-10s", member->name);
printf(" %-10s", member->wife);
if (newline) {
printf("\n");
}
}
void recursiveFamilyTreeNodeShow(pTreeNode cursor, int brother_line[], int flag, int all) {
if (cursor) {
char generation[STR_LEN] = { 0 };
if (all) {
showFamilyMember(&cursor->member, 0);
}
sprintf(generation, "【%d世】", cursor->level + 1);
printf("%10s", generation);
if (cursor->level > 0) {
for (int index = 0; index < cursor->level - 1; ++index) {
if (brother_line[index]) {
printf(" │");
}
else {
printf(" ");
}
}
if (flag) {
printf(" ├─>");
}
else {
printf(" └─>");
}
}
printf(" %s %s\n", cursor->member.name, cursor->member.wife);
for (int index = 0; index < cursor->count; ++index) {
int flag = (index < cursor->count - 1);
if (flag) {
brother_line[cursor->level] = 1;
}
else {
brother_line[cursor->level] = 0;
}
pTreeNode child = cursor->children[index];
recursiveFamilyTreeNodeShow(child, brother_line, flag, all);
}
brother_line[cursor->level] = 0;
}
}
void recursiveFamilyTreeNodeSave(pTreeNode cursor, FILE* output) {
if (cursor) {
if (cursor->level > 0) {
char format[STR_LEN] = { 0 };
sprintf(format, "%%%ds", cursor->level);
fprintf(output, format, " ");
}
fprintf(output, "%s ", cursor->member.name);
fprintf(output, "%s ", cursor->member.wife);
fprintf(output, "\n");
for (int index = 0; index < cursor->count; ++index) {
pTreeNode child = cursor->children[index];
recursiveFamilyTreeNodeSave(child, output);
}
}
}
pTreeNode recursiveFamilyTreeNodeFind(pTreeNode cursor, const char name[]) {
if (cursor) {
if (strcmp(cursor->member.name, name) == 0 || strcmp(cursor->member.wife, name) == 0) {
return cursor;
}
for (int index = 0; index < cursor->count; ++index) {
pTreeNode child = cursor->children[index];
pTreeNode result = recursiveFamilyTreeNodeFind(child, name);
if (result) {
return result;
}
}
}
return NULL;
}
int recursiveFamilyTreeNodeCount(pTreeNode cursor) {
int count = 0;
if (cursor) {
count = 1;
for (int index = 0; index < cursor->count; ++index) {
pTreeNode child = cursor->children[index];
count += recursiveFamilyTreeNodeCount(child);
}
}
return count;
}
void recursiveFamilyTreeNodeClear(pTreeNode cursor) {
if (cursor) {
for (int index = 0; index < cursor->count; ++index) {
pTreeNode child = cursor->children[index];
recursiveFamilyTreeNodeClear(child);
}
free(cursor);
}
}
pTreeNode loadFamilyTree() {
pTreeNode root = NULL;
FILE* input = fopen("familytree.txt", "r");
if (input) {
pTreeNode cursor = NULL;
char buffer[BUFFER_SIZE] = { 0 };
while (fgets(buffer, sizeof(buffer), input)) {
Member member = { 0 };
if (sscanf(buffer, "%s %s", member.name, member.wife) == 2) {
int level = countMemberLevel(buffer);
if (level == 0) {
assert(root == NULL);
root = createTreeNode(NULL, &member);
cursor = root;
}
else {
int step = level - cursor->level;
assert(step <= 1);
if (step != 1) {
int count = 0 - step + 1;
while (count) {
cursor = cursor->parent;
--count;
}
}
cursor = createTreeNode(cursor, &member);
}
}
}
fclose(input);
}
return root;
}
void saveFamilyTree(pTreeNode root) {
FILE* output = fopen("familytree.txt", "w");
if (output) {
recursiveFamilyTreeNodeSave(root, output);
fclose(output);
}
}
void showFamilyTree(pTreeNode root, int all) {
printf("╔-----------------------------------------╗\n");
printf(" * 显示家谱信息 *\n");
int* brother_line = (int*)calloc(1024, sizeof(int));
if (all) {
showFamilyMemberTitle();
}
recursiveFamilyTreeNodeShow(root, brother_line, 0, all);
free(brother_line);
printf("╚-----------------------------------------╝\n");
}
void addFamilyTree(pTreeNode* root) {
char name[STR_LEN] = { 0 };
printf("╔-----------------------------------------╗\n");
printf(" * 添加家谱成员 *\n");
printf(" 输入新成员姓名:");
scanf("%s", name);
if (*root) {
if (!recursiveFamilyTreeNodeFind(*root, name)) {
pTreeNode target = NULL;
char parentname[STR_LEN] = { 0 };
printf(" 输入新成员的父亲或者母亲名字(指定关系):");
scanf("%s", parentname);
target = recursiveFamilyTreeNodeFind(*root, parentname);
if (target) {
Member member = { 0 };
strcpy(member.name, name);
editFamilyMember(&member);
createTreeNode(target, &member);
saveFamilyTree(*root);
showFamilyMemberTitle();
showFamilyMember(&member, 1);
printf("----------------\n");
printf("成功添加以上家谱成员!\n");
}
else {
printf("添加失败,家谱中未找到该名字!\n");
}
}
else {
printf("添加失败,该成员名称已经存在!\n");
}
}
else {
Member member = { 0 };
strcpy(member.name, name);
editFamilyMember(&member);
*root = createTreeNode(NULL, &member);
saveFamilyTree(*root);
showFamilyMemberTitle();
showFamilyMember(&member, 1);
printf("----------------\n");
printf("成功添加以上家谱成员!\n");
}
printf("╚-----------------------------------------╝\n");
}
void removeFamilyTree(pTreeNode* root) {
pTreeNode target = NULL;
char name[STR_LEN] = { 0 };
printf("╔-----------------------------------------╗\n");
printf("* 删除家谱成员 *\n");
printf(" 输入姓名:");
scanf("%s", name);
target = recursiveFamilyTreeNodeFind(*root, name);
if (target) {
showFamilyMemberTitle();
showFamilyMember(&target->member, 1);
removeTreeNode(target);
recursiveFamilyTreeNodeClear(target);
if (target == *root) {
*root = NULL;
}
saveFamilyTree(*root);
printf("----------------\n");
printf("成功删除以上家谱成员!\n");
}
else {
printf(" 没有找到相关信息!\n");
}
printf("╚-----------------------------------------╝\n");
}
void findFamilyTree(pTreeNode root) {
pTreeNode target = NULL;
char name[STR_LEN] = { 0 };
printf("╔-----------------------------------------╗\n");
printf(" * 查找家谱成员 *\n");
printf(" 输入姓名:");
scanf("%s", name);
target = recursiveFamilyTreeNodeFind(root, name);
if (target) {
int* brother_line = (int*)calloc(1024, sizeof(int));
printf("---------------\n");
showFamilyMemberTitle();
showFamilyMember(&target->member, 1);
printf("---------------\n");
printf("【所有孩子】\n");
recursiveFamilyTreeNodeShow(target, brother_line, 0, 0);
free(brother_line);
printf("【所有祖先】\n");
showFamilyMemberTitle();
while (target->parent) {
target = target->parent;
showFamilyMember(&target->member, 1);
}
}
else {
printf(" 没有找到相关信息!\n");
}
printf("╚-----------------------------------------╝\n");
}
void modifyFamilyTree(pTreeNode root) {
pTreeNode target = NULL;
char name[STR_LEN] = { 0 };
printf("╔-----------------------------------------╗\n");
printf(" * 修改家谱成员 *\n");
printf(" 输入姓名:");
scanf("%s", name);
target = recursiveFamilyTreeNodeFind(root, name);
if (target) {
showFamilyMemberTitle();
showFamilyMember(&target->member, 1);
printf("----------------\n");
editFamilyMember(&target->member);
printf("----------------\n");
saveFamilyTree(root);
printf("成功修改以上家谱成员!\n");
}
else {
printf(" 没有找到相关信息!\n");
}
printf("╚-----------------------------------------╝\n");
}
void statFamilyTree(pTreeNode root) {
int count = recursiveFamilyTreeNodeCount(root);
printf("╔-----------------------------------------╗\n");
printf(" * 统计家谱成员 *\n");
printf(" 成员数量:%d\n", count);
printf("╚-----------------------------------------╝\n");
}
void menuOptions(pTreeNode root) {
system("title 家族谱管理系统");
while (1) {
int option = 0;
printf("╔-----------------------------------------╗\n");
printf(" * 家族谱管理系统 *\n");
printf(" 1 . 显示家谱(精简)\n");
printf(" 2 . 显示家谱(完整)\n");
printf(" 3 . 添加家谱成员\n");
printf(" 4 . 删除家谱成员\n");
printf(" 5 . 查找家谱成员\n");
printf(" 6 . 修改家谱成员\n");
printf(" 7 . 统计家谱成员\n");
printf(" 0 . 退出\n");
printf("╚-----------------------------------------╝\n");
printf(" 请选择:");
scanf("%d", &option);
if (option == 0) break;
switch (option) {
case 1:
showFamilyTree(root, 0);
break;
case 2:
showFamilyTree(root, 1);
break;
case 3:
addFamilyTree(&root);
break;
case 4:
removeFamilyTree(&root);
break;
case 5:
findFamilyTree(root);
break;
case 6:
modifyFamilyTree(root);
break;
case 7:
statFamilyTree(root);
break;
}
}
}
int main() {
pTreeNode root = loadFamilyTree();
if (root) {
menuOptions(root);
recursiveFamilyTreeNodeClear(root);
}
return 0;
}
小编第一次上传,见谅
C语言版家谱管理系统相关推荐
- C语言家谱管理程序,C语言二叉树家谱管理系统.doc
C语言二叉树家谱管理系统 摘 要 本文设计了一个对数据输入,输出,储存,查找的多功能软件,本文需要保存家族的基本信息,包括姓名及它们的关系,但是由于家族信息很巨大而且关系很复杂所以采用二叉树来表示它们 ...
- 家族查询系统c语言源程序,家谱管理系统(含源代码).docx
家谱管理系统(含源代码) 家谱管理系统--C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结 ...
- 医院挂号系统c语言yan,C语言版医院管理系统
本文实例为大家分享了C语言实现医院管理系统的具体代码,供大家参考,具体内容如下 #include "stdio.h" #include "string.h" # ...
- C语言实现家谱管理系统
文章目录 head.h family.cpp main.cpp head.h #include <stdio.h> #include <stdlib.h> #include & ...
- c语言版票务管理系统,火车票务管理系统(C语言版)【TXT文件,改后缀即可】
大一的时候做的程序设计,好用!将文本下载后后缀改为".c"就能使用.带注释,有刷屏功能,一点也不乱.[原创哦!] /* 头文件 */ #include #include #incl ...
- 门诊挂号c语言程序代码,C语言版医院管理系统
#include "stdio.h" #include "string.h" #include "stdlib.h" #include &q ...
- c语言版票务管理系统,求救求救 票务管理系统 好人一生平安
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 [问题描述] 一火车站每天有n个发车班次,每个班次都有一班次号,固定的发车时间,固定的路线(起始站.终点站),大致的行车时间,固定的额定载客量,如: 车次 ...
- C语言版学生管理系统
思路 输入加载文件,显示菜单,选择功能,若不选择退出,则在while循环中,使用二进制读写文件,实现新增.查看全部学生.查找学生功能. Display_Menu()菜单Load_File()加载文件A ...
- 教师查询系统C语言,教师管理系统c语言版
<教师管理系统c语言版>由会员分享,可在线阅读,更多相关<教师管理系统c语言版(7页珍藏版)>请在人人文库网上搜索. 1.include/头文件#include/字符处理头文件 ...
最新文章
- 这味儿上头,前有文言文,又来东北话,中文编程玩得挺得劲!
- mac设置linux环境,如何在mac或者linux配置oh-my-zsh
- 指尖检测的几种新方法
- 如何让网站用上HTML5 Manifest
- c++ 遍历所有点且距离最短_L3图论第08课 图的遍历
- boost::units模块实现确保最小的 + - * / 单元类功能齐全的测试程序
- Python中的进程间通信
- php管理智能dns,负载均衡之DNS轮询
- springboot profile_SpringBoot简单配置
- spring + springmvc + mybatis + mysql 整合使用案例
- C++ string获取字符串元素:[]和at()
- 计算机桌面时间设置,桌面的时钟怎么设置
- SDUT OJ 2144 数据结构实验之图论九:最小生成树
- 大数据的“多维度”与“时效性”
- DSPE-PEG-SH, 磷脂PEG巯基
- JAVA实现链接生成二维码
- CAE-仿真案例学习
- OpenGL入门北斗星点绘制
- Spark 实时处理 总文章
- 网络 3.0 路由器概述
热门文章
- Android加载web页时有的手机会弹出手机自带的浏览器解决方法
- matlab换挡程序,一种基于MATLAB换挡过程中快速锁定分析数据的方法与流程
- 电脑开机时网络连接一直转圈,出现红叉
- 基于ZooKeeper的分布式锁和队列
- ICCID IMSI IMEI MEID
- PS一次性导出多倍图@1x、@2x、@3x
- 计算机里面不显示光驱位硬盘,Windows10系统识别不了光驱位机械硬盘怎么办?解决方法...
- lasso,lars算法详细推导过程-数学
- 使用TIM捕获测量PWM频率和占空比
- linux su -含义,linux su命令详解步骤