C语言家谱管理程序,[C语言]家谱 - 代码贴 - BCCN
#include
#include
#include
struct node;
node *creat();//建立祖先
int add_child(node *head);//添加家庭成员
int add_brother(node *head);//添加兄弟成员
void print(node *head,char *x);//输出指定家庭成员
int beifen(node *p,char *x);//确定成员辈分
void print1(node *head);//先序遍历 输出家庭成员
void chengyuan(node *head,int s);//输出相应辈分成员
node *shanchu(node *head,char *s);//删除成员
struct node//结构体变量
{
char data[20];//家庭成员
int n;//辈分
node *lchild,*rchild;//左孩子是孩子,右孩子是兄弟
};
node *creat()//建立祖先
{
node *head;
head=(node *)malloc(sizeof(node));//分配存储空间
char s[20];
printf("输入祖先名字:");
scanf("%s",&s);
strcpy(head->data,s);// 赋值
head->n=1;//分配辈分
printf("祖先载入成功!\n");
return head;//返回祖先节点(根节点)
}
int add_child(node *head)//添加家庭成员 非递归法
{
char y[20],x[20];
node *p,*q;//定义新变量
q=head;
printf("输入加入父节点姓名:");
scanf("%s",&x);//输入父节点
p=(node *)malloc(sizeof(node));//动态分配存储空间
printf("输入要添加的孩子:");
scanf("%s",&y);//输入孩子信息
strcpy(p->data,y);//赋值到节点
p->lchild=NULL;//新节点左孩子为空
p->rchild=NULL;//新节点右孩子为空
while(q!=NULL)//循环左孩子查找
{
if(strcmp(x,q->data)==0)//比较
{
if(q->lchild==NULL)//如果此结点没有孩子则添加到左孩子
{
p->n=q->n+1;//孩子为父节点的辈分加1
q->lchild=p;//新节点为父节点的左孩子节点
return 1;
}
else//如果此结点有孩子,则找到孩子,再找到最后一个兄弟,并添加到后面
{
q=q->lchild;
while(q->rchild!=NULL)//循环到最后一个
{
q=q->rchild;//兄弟指向右孩子
}
p->n=q->n;//兄弟辈分相同
q->rchild=p;//新节点为父节点的左孩子节点
return 1;
}
}
q=q->lchild;//指向左孩子
}
q=head;
while(q!=NULL)//循环右孩子查找
{
if(strcmp(x,q->data)==0)//比较
{
if(q->lchild==NULL)//如果此结点没有孩子则添加到左孩子
{
p->n=q->n+1;//孩子为父节点的辈分加1
q->lchild=p;//新节点为父节点的左孩子节点
return 1;
}
else//如果此结点有孩子,则找到孩子,再找到最后一个兄弟,并添加到后面
{
q=q->lchild;
while(q->rchild!=NULL)//循环到最后一个
{
q=q->rchild;//兄弟指向右孩子
}
p->n=q->n;//兄弟辈分相同
q->rchild=p;//新节点为父节点的左孩子节点
return 1;
}
}
q=q->rchild;//指向右孩子
}
}
int add_brother(node *head)//添加兄弟成员 非递归法
{
node *p,*s; //定义新变量
char y[20],x[20];
p=head;
s=(node *)malloc(sizeof(node));//动态分配存储空间
printf("输入加入兄弟节点姓名");
scanf("%s",&x);//输入兄弟节点姓名
printf("请输入要添加的兄弟:");
scanf("%s",&y);//输入添加信息
strcpy(s->data,y);//赋值
s->lchild=NULL;//新节点左孩子为空
s->rchild=NULL;//新节点右孩子为空
while(1)//循环左孩子查找
{
if(strcmp(p->data,x)==0)//比较
{
if(p->rchild==NULL)//如果兄弟节点为空,赋给兄弟节点
{
s->n=p->n;//兄弟辈分相同
p->rchild=s;//兄弟为右孩子
return 1;
}
else//否则找到最后一个兄弟,在其后添加结点
{
while(p->rchild!=NULL)//循环到最后节点
{
p=p->rchild;//指向下一个右孩子
}
s->n=p->n;//兄弟辈分相同
p->rchild=s;//兄弟为右孩子
return 1;
}
}
p=p->lchild;//指向左孩子
}
p=head;
while(1)//循环右孩子查找
{
if(strcmp(p->data,x)==0)//比较
{
if(p->rchild==NULL)//如果兄弟节点为空,赋给兄弟节点
{
s->n=p->n;//兄弟辈分相同
p->rchild=s;//兄弟为右孩子
return 1;
}
else//否则找到最后一个兄弟,在其后添加结点
{
while(p->rchild!=NULL)//循环到最后节点
{
p=p->rchild;//指向下一个右孩子
}
s->n=p->n;//兄弟辈分相同
p->rchild=s;//兄弟为右孩子
return 1;
}
}
p=p->rchild;//指向右孩子
}
}
void print(node *head,char *x)//输出指定家庭成员 递归法
{
if(head!=NULL)
{
if(strcmp(head->data,x)==0)//查找
{
if(strcmp(head->data,"0")!=0)//比较
printf("%s-",head->data);//找到后先输出该成员,再调用函数输出其子孙
if(head->lchild!=NULL)
{
head=head->lchild;
print1(head);//调用函数,输出孩子节点
}
}
print(head->lchild,x);//递归
print(head->rchild,x);//递归
}
}
int beifen(node *p,char *x)//确定成员辈分 递归法
{
if(p!=NULL)
{
if(strcmp(p->data,x)==0&&strcmp(p->data,"0")!=0)//如果找到且不为字符 0 则输出
{
printf("%d",p->n);//输出
return 1;
}
beifen(p->lchild,x);//递归
beifen(p->rchild,x);//递归
}
}
void print1(node *head)//先序遍历 输出家庭成员 递归法
{
if(head!=NULL)
{
if(strcmp(head->data,"0")!=0)//判断是否为空
printf("-%s-",head->data);//输出
print1(head->lchild);//递归
print1(head->rchild);//递归
}
}
void chengyuan(node *head,int s)//输出相应辈分成员 递归法
{
if(head!=NULL)
{
if(head->n==s)//找到后且该成员未被删除 则输出
{
if(strcmp(head->data,"0")!=0)//查找
printf("-%s-",head->data);//输出
}
chengyuan(head->lchild,s);//递归
chengyuan(head->rchild,s);//递归
}
}
node *shanchu(node *head,char *s)//其实未删除,只是将其姓名设为字符 0 递归法
{
if(head!=NULL)
{
if(strcmp(head->data,s)==0)//比较找到
strcpy(head->data,"0");//值归0
shanchu(head->lchild,s);//递归
shanchu(head->rchild,s);//递归
}
}
void caidan()//菜单
{
printf("* 1.设立家谱祖先 *\n");
printf("* 2.添加家庭成员(孩子) *\n");
printf("* 3.添加家庭成员(兄弟) *\n");
printf("* 4.输出指定家庭成员 *\n");
printf("* 5.确定成员辈分 *\n");
printf("* 6.输出指定辈的所有成员 *\n");
printf("* 7.删除家庭成员 *\n");
printf("* 0.退出 *\n");
}
int main()//主函数
{
node *head;//定义头节点
int n,m;
char s[20];
printf("\n******家谱(孩子兄弟表示法)********\n");
while(1)
{
caidan();
printf("输入选项:");
scanf("%d",&m);//输入选项
if(m==1)//创建祖先
{
head=creat();//调用函数
}
if(m==2)//添加孩子
{
add_child(head);//调用函数
}
if(m==3)//添加兄弟
{
add_brother(head);//调用函数
}
if(m==4)//输出一个家庭成员
{
printf("请输入父亲节点:");
scanf("%s",&s);
printf("\n成员为: ");
print(head,s);//调用函数
printf("\n");
}
if(m==5)//确定某人辈分
{
printf("请输入姓名:");
scanf("%s",&s);
printf("辈分为:");
beifen(head,s);//调用函数
printf("\n");
}
if(m==6)//输出指定辈分中所有人
{
printf("请输入辈分:");
scanf("%d",&n);
printf("\n成员为: ");
chengyuan(head,n);//调用函数
printf("\n");
}
if(m==7)//删除成员
{
printf("请输入要删除的成员:");
scanf("%s",&s);
shanchu(head,s);//调用函数
}
if(m==0)//退出
{
printf("谢谢使用家谱系统!\n");
break;
}
}
}
C语言家谱管理程序,[C语言]家谱 - 代码贴 - BCCN相关推荐
- C语言家谱管理程序,c语言的家谱——interesting~
C++是直接从C语言发展过来的,但最初这种语言不是叫C++,而是C with class,这是由于当时C语言在编程界居于老大的地位,要想发展一种新的语言,最强大的竞争对手就是C语言,所以当时有两个问题 ...
- C语言家谱管理程序,C语言二叉树家谱管理系统.doc
C语言二叉树家谱管理系统 摘 要 本文设计了一个对数据输入,输出,储存,查找的多功能软件,本文需要保存家族的基本信息,包括姓名及它们的关系,但是由于家族信息很巨大而且关系很复杂所以采用二叉树来表示它们 ...
- C语言家谱管理程序,C语言实现家谱管理
C语言上实现家谱管理系统 #include #include #include #include #define OK 1 #define ERROR -1 #define STACK_INIT_SI ...
- c语言婚姻管理程序,C语言实现婚姻匹配有关问题
C语言实现婚姻匹配问题 最近因为课程需要,看了看婚姻稳定匹配问题,用了两天把代码写完了. 具体问题就不详细写了,这里给出参看的网址. EOJ上面的问题叙述:http://202.120.106.94/ ...
- c语言婚姻管理程序,C语言实现婚姻匹配问题
最近因为课程需要,看了看婚姻稳定匹配问题,用了两天把代码写完了. 具体问题就不详细写了,这里给出参看的网址. 整个思路结合着老师的课件和这篇文章,用C语言完成了整个代码. // // main.c / ...
- 自动排课系统的代码c语言,[C语言]我们的排课系统 - 代码贴 - BCCN
#include"stdio.h" #include"malloc.h" #include"stdlib.h" #include" ...
- R语言使用tryCatch函数调试R代码实战:tryCatch函数运行正常R代码、tryCatch函数运行有错误(error)的R代码示例/tryCatch函数运行有警告(warning)的R代码示例
R语言使用tryCatch函数调试R代码实战:tryCatch函数运行正常R代码.tryCatch函数运行有错误(error)的R代码示例/tryCatch函数运行有警告(warning)的R代码示例 ...
- R语言广义线性模型Logistic回归案例代码
R语言广义线性模型Logistic回归案例代码 在实际应用中,Logistic模型主要有三大用途: 1)寻找危险因素,找到某些影响因变量的"坏因素",一般可以通过优势比发现危险因素 ...
- C 语言编程 — 结构化程序流的汇编代码与 CPU 指令集
目录 文章目录 目录 文章目录 为什么要保留汇编语言 顺序程序流 条件程序流 循环程序流 函数调用栈的工作原理 文章目录 <C 语言编程 - GCC 工具链> <C 语言编程 - 程 ...
最新文章
- SpringBoot自动配置的原理及实现
- html中如何实现选择存储路径的功能_HTML是Web前端的基础知识,刚入门的你真的学对了吗?...
- 【百战GAN】羡慕别人的美妆?那就用GAN复制粘贴过来
- boost::mpl模块实现insert_range相关的测试程序
- awk命令扩展使用操作
- Android studio实现底部导航,AndroidStudio制作底部导航栏以及用Fragment实现切换功能...
- 求解组合问题的一个迭代算法
- mysql 命令 kill_详解mysql数据库实用工具--percona-toolkit的7大分类
- 使用AT指令给飞信号发短信失败
- Python 蓝牙通信模块pybluez Win7
- masm5安装教程_汇编学习笔记(5)-程序的编译(MASM)
- 计算机右键管理 已停止工作,管理器停止工作,详细教您怎么解决资源管理器已停止工作...
- Zedboard(一)开发环境Vivado
- 2022-2027年中国开采沙石行业发展监测及投资战略研究报告
- 读《Ivor Horton's beginning Visual C++ 2010》有感
- Jenkins系列之——前言 Jenkins初识
- Mac 键盘符号说明
- 小程序开发API之获取系统信息wx.getSystemInfo()、wx.getSystemInfoSync()
- 针对发博客这件事自我检讨
- 1、Ray基本原理及使用