家谱管理

一、问题描述

设计一个程序,采用二叉树表示一个家谱关系。

二、基本要求

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

八、运行及测试情况

#数据结构:家谱管理相关推荐

  1. 基于C语言的数据结构课程设计(学生管理系统、停车场管理、家谱管理、校园导航系统)

    一.设计目的 本课程设计是软件工程学生的必修课程,数据结构与算法课程设计既是一门基础课程,又是一门实践性课程.通过本实训课程的学习和训练,使同学学会分析研究数据对象的特性,学会数据的组织方法,以便选择 ...

  2. java数字家谱管理系统设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署

    java数字家谱管理系统设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 java数字家谱管理系统设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 本源码技 ...

  3. java计算机毕业设计数字家谱管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计数字家谱管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计数字家谱管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署 本源码技 ...

  4. JAVA毕业设计数字家谱管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计数字家谱管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计数字家谱管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构 ...

  5. 家谱管理系统设计报告c语言,家谱管理系统设计报告.doc

    家谱管理系统设计报告 目 录 第一章 绪论2 第二章需求分析3 2.1题目3 2.2设计任务3 2.3数据测试3 第三章 概要设计3 3.1 设计思想3 3.2 实现方法4 第四章 详细设计4 4.1 ...

  6. JAVA毕设项目数字家谱管理系统设计与实现(Vue+Mybatis+Maven+Mysql+sprnig+SpringMVC)

    JAVA毕设项目数字家谱管理系统设计与实现(Vue+Mybatis+Maven+Mysql+sprnig+SpringMVC) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysq ...

  7. redis 数据结构 内存管理 持久化

    为什么80%的码农都做不了架构师?>>>    Redis 内存数据结构与编码 OBJECT encoding key.DEBUG OBJECT key 简单动态字符串(simple ...

  8. 数据结构—— 家谱处理

    这是一道PTA中的题目,在这里先给出题干. 7-2 家谱处理 (30 分) 人类学研究对于家族很感兴趣,于是研究人员搜集了一些家族的家谱进行研究.实验中,使用计算机处理家谱.为了实现这个目的,研究人员 ...

  9. 数据结构--宿舍管理查询软件

    景德镇陶瓷大学 实践周课程设计报告 实验名称 编写宿舍管理查询软件 姓    名 杨茹 班    级 17信管一班 学    号 117060300109 完成日期 2018年12月27日 实验目的 ...

最新文章

  1. 百度离职员工吐槽:整天除了工作还要演好戏,拍马屁,心太累!
  2. eclipse配置Maven中的Tomcat的使用
  3. git恢复删除前的版本
  4. springboot项目中mybatis实现数据的基本查询
  5. grep命令与正则表达式
  6. ubuntu10.04 NFS服务
  7. 【Sql Server】经典SQL语句大全
  8. [ 物联网篇 ] ESP32 AWS IoT and Amazon Alexa Development / FreeRTOS平台的Alexa语音助手
  9. 佛系前端面试题记录--第五周
  10. 关于深度学习人工智能模型的探讨(一)(1)
  11. shell笔记(C语言中文网)
  12. 如何教你获取1688店铺所有商品,商品详情数据分析
  13. eclipse与DW联合开发java web项目
  14. JS 获取第一个和最后一个,子节点、子元素
  15. spark、hadoop、storm、solr、es在车辆分析上的分析与比较
  16. Unknown column 'JOIN.id' in 'order clause'和 Unknown column 'XXXX.id' in 'order clause'的解决办法
  17. PowerPMAC技术培训------2、PowerPMAC产品介绍
  18. JAVA网易云热评接口_网易云音乐热评爬虫(一): 反编译加密参数
  19. 百度搜索数据库——Tera 设计和实践全攻略
  20. Ubuntu 下谷歌浏览器、搜狗输入法的下载安装

热门文章

  1. java: 未报告的异常错误java.lang.IllegalAccessException; 必须对其进行捕获或声明以便抛出
  2. VUE的父传子 子传父
  3. JDBCUtil工具类,单线程模式
  4. MIUI系统获取短信权限问题
  5. 3DMAX安装未完成,某些产品无法安装的解决方法
  6. 3_1 操作系统定义、分类及功能【包含linux操作系统基础知识】
  7. 如何在Ubuntu上方便使用OpenAI API key
  8. 学习正则表达式 - 18位身份证号
  9. JS 如何清除页面缓存
  10. 华为也无奈,P20pro降到历史新低价,老用户:买太早