#数据结构:家谱管理
家谱管理
一、问题描述
设计一个程序,采用二叉树表示一个家谱关系。
二、基本要求
1) 用缩进表示法输出家谱二叉树。
2) 查找某人所有的儿子。
3) 查找某人所有的祖先。
三、算法思想
二叉树的建立,遍历,查询,插入(判断、右插入或左插入)
四、数据结构
typedef struct Node
{
char data;
int flag; //标志位 (0代表未被访问,1代表被访问)
struct Node* lchild;
struct Node* rbrother;
}SLNode;
五、模块划分
(1)typedef struct Node定义结构体并重新命名
(2)void Initiate结构体初始化
(3)SLNode* Insertright从右插入
(4)SLNode* Insertleft从左插入
(5)void input输入家谱内的相关信息
(6)void PrintTree打印家谱(二叉树)
(7)void Searchchild寻找孩子
(8)void SearchAncestor寻找祖先
(9)int main主函数,构建菜单并调用多个函数实现其功能
六、源程序
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
char data;
int flag; //标志位 (0代表未被访问,1代表被访问)
struct Node* lchild;
struct Node* rbrother;
}SLNode;
//全局变量p 用来存储儿子结点地址,使其不会因为递归而改变
SLNode* p;
void Initiate(SLNode** T)
{
*T = (SLNode*)malloc(sizeof(SLNode));
(*T)->lchild = NULL;
(*T)->rbrother = NULL;
}
SLNode* Insertright(SLNode* arr, char x)
{
SLNode* m, * t;
if (arr == NULL) return NULL;
//在arr和arr->right的中间插入,为保证顺序插入需要让arr向后移一个
if (arr->rbrother != NULL) arr = arr->rbrother;
t =arr->rbrother;
m = (SLNode*)malloc(sizeof(SNodLe));
m->data = x;
m->rbrother = t;
m->lchild = NULL;
arr->rbrother =m;
return arr->rbrother;
}
//左孩子写在右兄弟下面,因为要用左孩子调用右兄弟,编译器是顺序编译
SLNode* Insertleft(SLNode* arr, char x)
{
SLNode* m, * t;
if (arr == NULL) return NULL;
//左孩子为空,插入左结点
else if (arr->lchild == NULL)
{
t = arr->lchild;
m = (SLNode*)malloc(sizeof(SLNode));
m->flag = 0;
m->data = x;
m->lchild = t;
m->rbrother = NULL;
arr->lchild = m;
return arr->lchild;
}
//当左孩子不为空时,插入右兄弟结点
else Insertright(arr->lchild, x);
}
//递归,先访问结点右兄弟,再访问结点孩子
void input(SLNode* arr)
{
char p = 0;
if (arr == NULL) return;
printf("请输入%c所有的儿子结点,若没有儿子或者输完所有儿子,输入#即可:\n", arr->data);
getchar();
scanf("%c", &p);
while (p != '#')
{
Insertleft(arr, p);
getchar();
scanf("%c", &p);
}
//递归兄弟结点,再递归孩子结点(使所有兄弟输完接着输兄弟的孩子)
if (arr->rbrother != NULL )
input(arr->rbrother);
if (arr->lchild != NULL )
input(arr->lchild);
}
void PrintTree(SLNode* T, int n)
{
int i;
if (T)
{
for (i = 1; i < n; i++) printf(" ");
printf("%c", T->data);
printf("\n");
//左孩子n+1,整体向右推移一位,右兄弟依然是n
PrintTree(T->lchild, n + 1);
PrintTree(T->rbrother, n);
}
}
void Searchchild(SLNode* T, char x)
{
SLNode* p;
//要用T data和x比较,所以要保证T不为空指针
if (T != NULL && T->data != x)
{
Searchchild(T->lchild, x);
Searchchild(T->rbrother, x);
}
//加入限定条件只允许T data==x时通过
if (T != NULL && T->lchild != NULL && T->data == x)
{
printf("%c结点的儿子结点为:%c ", T->data, T->lchild->data);
p = root->lchild;
while (p->rbrother != NULL)
{
printf("%c", p->rbrother->data);
p = p->rbrother;
printf("\n");
}
}
}
void SearchAncestor (TreeNode* T, char x)
{
if (T != NULL && T->data != x)
{
SearchAncestor (T->lchild, x);
SearchAncestor (T->rbrother, x);
}
//保证p为不变的指针,指向选择的结点
if (T != NULL && T->data == x)
{
p = T;
}
if (T != NULL &&T->lchild != NULL && (T->lchild == p || T->lchild->rbrother == p))
{
printf("%c ", T->data);
p = T;
}
}
int main()
{
SLNode* T;
char p;
int n;
Initiate(&T);
do
{
printf(" ");
printf(" \n 家谱树(孩子兄弟表示法) \n");
printf("************************************************************");
printf("\n\n");
printf(" 1 建立家谱\n");
printf(" 2 查询家谱树\n");
printf(" 3 查询儿子\n");
printf(" 4 查询祖先\n");
printf(" 0 退出\n");
printf("\n\n");
printf("************************************************************"); printf("\n 请选择需要的功能:");
char ch1;
ch = getchar();
switch (ch1)
{
case '1':
{
printf("请输入祖先结点:");
getchar();
scanf("%c", &p);
Insertleft(T, p);
input(T->lchild); getchar(); break;
};
case '2':
{
PrintTree(T, 1); getchar(); break;
};
case '3':
{
printf("请输入要查询的结点的所有儿子:");
getchar();
scanf("%c", &p);
Searchchild(T, p); getchar(); break;
};
case '4':
{
printf("请输入要查询的结点的所有祖先:");
getchar();
scanf("%c", &p);
SearchAncestor (T->lchild, p); getchar(); break;
};
case '0':exit(0);
default:
{
printf("输入有误,请重新输入:\n");
ch = getchar();
}
}
} while (1);
}
七、测试数据
1
2 3
4 5 6 7
八、运行及测试情况
#数据结构:家谱管理相关推荐
- 基于C语言的数据结构课程设计(学生管理系统、停车场管理、家谱管理、校园导航系统)
一.设计目的 本课程设计是软件工程学生的必修课程,数据结构与算法课程设计既是一门基础课程,又是一门实践性课程.通过本实训课程的学习和训练,使同学学会分析研究数据对象的特性,学会数据的组织方法,以便选择 ...
- java数字家谱管理系统设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
java数字家谱管理系统设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 java数字家谱管理系统设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 本源码技 ...
- java计算机毕业设计数字家谱管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计数字家谱管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计数字家谱管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署 本源码技 ...
- JAVA毕业设计数字家谱管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
JAVA毕业设计数字家谱管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计数字家谱管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构 ...
- 家谱管理系统设计报告c语言,家谱管理系统设计报告.doc
家谱管理系统设计报告 目 录 第一章 绪论2 第二章需求分析3 2.1题目3 2.2设计任务3 2.3数据测试3 第三章 概要设计3 3.1 设计思想3 3.2 实现方法4 第四章 详细设计4 4.1 ...
- JAVA毕设项目数字家谱管理系统设计与实现(Vue+Mybatis+Maven+Mysql+sprnig+SpringMVC)
JAVA毕设项目数字家谱管理系统设计与实现(Vue+Mybatis+Maven+Mysql+sprnig+SpringMVC) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysq ...
- redis 数据结构 内存管理 持久化
为什么80%的码农都做不了架构师?>>> Redis 内存数据结构与编码 OBJECT encoding key.DEBUG OBJECT key 简单动态字符串(simple ...
- 数据结构—— 家谱处理
这是一道PTA中的题目,在这里先给出题干. 7-2 家谱处理 (30 分) 人类学研究对于家族很感兴趣,于是研究人员搜集了一些家族的家谱进行研究.实验中,使用计算机处理家谱.为了实现这个目的,研究人员 ...
- 数据结构--宿舍管理查询软件
景德镇陶瓷大学 实践周课程设计报告 实验名称 编写宿舍管理查询软件 姓 名 杨茹 班 级 17信管一班 学 号 117060300109 完成日期 2018年12月27日 实验目的 ...
最新文章
- 百度离职员工吐槽:整天除了工作还要演好戏,拍马屁,心太累!
- eclipse配置Maven中的Tomcat的使用
- git恢复删除前的版本
- springboot项目中mybatis实现数据的基本查询
- grep命令与正则表达式
- ubuntu10.04 NFS服务
- 【Sql Server】经典SQL语句大全
- [ 物联网篇 ] ESP32 AWS IoT and Amazon Alexa Development / FreeRTOS平台的Alexa语音助手
- 佛系前端面试题记录--第五周
- 关于深度学习人工智能模型的探讨(一)(1)
- shell笔记(C语言中文网)
- 如何教你获取1688店铺所有商品,商品详情数据分析
- eclipse与DW联合开发java web项目
- JS 获取第一个和最后一个,子节点、子元素
- spark、hadoop、storm、solr、es在车辆分析上的分析与比较
- Unknown column 'JOIN.id' in 'order clause'和 Unknown column 'XXXX.id' in 'order clause'的解决办法
- PowerPMAC技术培训------2、PowerPMAC产品介绍
- JAVA网易云热评接口_网易云音乐热评爬虫(一): 反编译加密参数
- 百度搜索数据库——Tera 设计和实践全攻略
- Ubuntu 下谷歌浏览器、搜狗输入法的下载安装