```////////////////////////////////
//家谱管理系统
///////////////////////////////
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
//创建一个结构体
struct node//结构体变量
{
char family[20];//家庭成员
int generation;//辈分
node *lchild, *rchild;//左孩子是孩子,右孩子是兄弟
};
//各个功能函数声明
void Display();//显示主界面并调用功能函数
int add_child(node *head);//添加家庭成员
int add_brother(node *head);//添加兄弟成员
int beifen(node *p, char *name);//确定成员辈分
void output(node *head, char *name);//输出指定家庭成员
void preOrder(node *head);//先序遍历 输出家庭成员
void chengyuan(node *head, int name);//输出相应辈分成员
node *create();//建立祖先
void Delete(node *head, char *name);//删除成员
////////////////////////////////////////////////
//函数名: Display()
//函数功能:1.显示主界面
// 2.清屏函数
// 3.调用各个功能函数
////////////////////////////////////////////////
void Display()//显示主界面
{
while(1)
{
system("cls");//清屏
printf(" ******************************************\n");
printf(" * *\n");
printf(" * 欢迎进入家谱管理系统 *\n");
printf(" * *\n");
printf(" ******************************************\n\n");
printf(" * 1.设立家谱祖先 *\n");
printf(" * 2.添加家庭成员(孩子) *\n");
printf(" * 3.添加家庭成员(兄弟) *\n");
printf(" * 4.输出指定家庭成员 *\n");
printf(" * 5.确定成员辈分 *\n");
printf(" * 6.输出指定辈的所有成员 *\n");
printf(" * 7.删除家庭成员 *\n");
printf(" * 8.先序遍历输出家庭成员 *\n");
printf(" * 0.退出 *\n");
printf(" 提示:按相应数字进行相应操作,请先输入操作数再进行运算 \n\n");
int num;// 定义输入的序号
node *head;//定义头节点
int generation;//辈分
char name[20];//存放名字
scanf("%d", &num);
if(num >= 1 && num <= 8)
{
system("cls");//清屏
}
if(num == 0)
{
printf("Thank you for using!\n");
return ;
}
switch(num)
{
case 1://创建家谱 (姓名 性别 )
head = create();//调用函数
break;
case 2://添加家庭成员
add_child(head);//调用函数
break;
case 3://添加兄弟成员
add_brother(head);//调用函数
break;
case 4://输出指定家庭成员
printf("请输入父亲节点:");
scanf("%s", &name);
printf("\n成员为: ");
output(head, name);//调用函数
printf("\n");
break;
case 5://确定成员辈分
printf("请输入姓名:");
scanf("%s", &name);
printf("辈分为:");
beifen(head, name);//调用函数
printf("\n");
break;
case 6://退出
printf("请输入辈分:");
scanf("%d", &generation);
printf("\n成员为: ");
chengyuan(head, generation);//调用函数
printf("\n");
break;
case 7:
printf("请输入要删除的成员:");
scanf("%s", &name);
Delete(head, name);//调用函数
break;
case 8:
printf("所有成员先序遍历输出:\n");
preOrder(head);
break;
case 0:
printf("Thank you for using!\n");
break;
default:
printf("Input error !\n");
system("pause");
system("cls");
continue;
}
}
}
/////////////////////////////////////////////
//功能: 创建祖先
//函数名:*create
/////////////////////////////////////////////
node *create()//建立祖先
{
node *head;//头结点
head = (node *)malloc(sizeof(node));//分配存储空间
char name[20];
printf("输入祖先名字:");
scanf("%s", &name);
strcpy(head->family, name);// 赋值
head->generation = 1;//分配辈分
printf("祖先载入成功!\n");
system("pause");
return head;//返回祖先节点(根节点)
}
//////////////////////////////////////////////////////
// 功能: 添加家庭成员
// 函数名: add_child
// 说明: 非递归法
//////////////////////////////////////////////////////
int add_child(node *head)
{
char child[20], father[20];//用来储存孩子信息和父亲信息
node *pchild, *q;//定义新变量pchild为孩子,q为父亲节点
q = head;
printf("输入加入父节点姓名:");
scanf("%s", &father);//输入父节点
pchild = (node *)malloc(sizeof(node));//动态分配存储空间
printf("输入要添加的孩子:");
scanf("%s", &child);//输入孩子信息
strcpy(pchild->family, child);//赋值到节点
pchild->lchild = NULL;//新节点左孩子为空
pchild->rchild = NULL;//新节点右孩子为空
while(q != NULL)//循环左孩子查找
{
if(strcmp(father, q->family) == 0)//比较
{
if(q->lchild == NULL)//如果此结点没有孩子则添加到左孩子
{
pchild->generation = q->generation + 1;//孩子为父节点的辈分加1
q->lchild = pchild;//新节点为父节点的左孩子节点
return 1;
}
else//如果左结点有孩子,则找到孩子,再找到最后一个兄弟,并添加到后面
{
q = q->lchild;
while(q->rchild != NULL)//循环到最后一个//系统在此处有错误?会自动停止
{
q = q->rchild;//兄弟指向右孩子
}
pchild->generation = q->generation;//兄弟辈分相同
q->rchild = pchild;//新节点为父节点的右孩子节点
return 1;
}
}
q = q->lchild;//指向左孩子
}
q = head;
while(q != NULL)//循环右孩子查找
{
if(strcmp(father, q->family) == 0)//比较
{
if(q->lchild == NULL)//如果此结点没有孩子则添加到左孩子
{
pchild->generation = q->generation+1;//孩子为父节点的辈分加1
q->lchild = pchild;//新节点为父节点的左孩子节点
return 1;
}
else//如果此结点有孩子,则找到孩子,再找到最后一个兄弟,并添加到后面
{
q = q->lchild;
while(q->rchild != NULL)//循环到最后一个
{
q = q->rchild;//兄弟指向右孩子
}
pchild->generation = q->generation;//兄弟辈分相同
q->rchild = pchild;//新节点为父节点的左孩子节点
return 1;
}
}
q = q->rchild;//指向右孩子
}
//system("pchildause");
}
//////////////////////////////////////////////////////
// 功能: 添加兄弟成员
// 函数名: add_brother
// 说明: 非递归法
//////////////////////////////////////////////////////
int add_brother(node *head)
{
node *p, *s; //定义新变量
char bro[20], bro1[20];//用来储存兄弟节点和要添加的兄弟信息
p = head;
s=(node *)malloc(sizeof(node));//动态分配存储空间
printf("输入加入兄弟节点姓名");
scanf("%s", &bro1);//输入兄弟节点姓名
printf("请输入要添加的兄弟:");
scanf("%s", &bro);//输入添加信息
strcpy(s->family, bro);//赋值
s->lchild = NULL;//新节点左孩子为空
s->rchild = NULL;//新节点右孩子为空
//system("pause");
while(1)//循环左孩子查找
{
if(strcmp(p->family,bro1) == 0)//比较
{
if(p->rchild == NULL)//如果兄弟节点为空,赋给兄弟节点
{
s->generation = p->generation;//兄弟辈分相同
p->rchild = s;//兄弟为右孩子
return 1;
}
else//否则找到最后一个兄弟,在其后添加结点
{
while(p->rchild != NULL)//循环到最后节点
{
p = p->rchild;//指向下一个右孩子
}
s->generation = p->generation;//兄弟辈分相同
p->rchild = s;//兄弟为右孩子
return 1;
}
}
p = p->lchild;//指向左孩子
}
p = head;
while(1)//循环右孩子查找
{
if(strcmp(p->family,bro1) == 0)//比较
{
if(p->rchild == NULL)//如果兄弟节点为空,赋给兄弟节点
{
s->generation = p->generation;//兄弟辈分相同
p->rchild = s;//兄弟为右孩子
return 1;
}
else//否则找到最后一个兄弟,在其后添加结点
{
while(p->rchild != NULL)//循环到最后节点
{
p = p->rchild;//指向下一个右孩子
}
s->generation = p->generation;//兄弟辈分相同
p->rchild = s;//兄弟为右孩子
return 1;
}
}
p = p->rchild;//指向右孩子
}
//system("pause");
}
//////////////////////////////////////////////////////
// 功能: 输出指定家庭成员
// 函数名: output
// 说明: 递归法
//////////////////////////////////////////////////////
void output(node *head, char *name)
{
if(head != NULL)
{
if(strcmp(head->family,name) == 0)//若输入的名字name与head->family相等
{
if(strcmp(head->family, "0") != 0)//head->family不等于0
printf("%s-", head->family);//找到后先输出该成员,再调用函数输出其子孙
if(head->lchild != NULL)
{
head = head->lchild;
preOrder(head);//调用函数,输出孩子节点
}
}
output(head->lchild, name);//递归
output(head->rchild, name);//递归
}
}
//////////////////////////////////////////////////////
// 功能: 确定成员辈分
// 函数名: beifen
// 说明: 递归法
//////////////////////////////////////////////////////
int beifen(node *p, char *name)
{
if(p!=NULL)
{
if(strcmp(p->family, name) == 0 && strcmp(p->family, "0") != 0)//如果找到且不为字符 0 则输出
{
printf("%d", p->generation);//输出
return 1;
}
beifen(p->lchild, name);//递归
beifen(p->rchild, name);//递归
}
}
//////////////////////////////////////////////////////
// 功能: 先序遍历输出家庭成员
// 函数名: preOrder
// 说明: 递归法
//////////////////////////////////////////////////////
void preOrder(node *head)
{
if(head != NULL)
{
if(strcmp(head->family,"0") != 0)//判断是否为空
printf("-%s-", head->family);//输出
preOrder(head->lchild);//递归
preOrder(head->rchild);//递归
}
}
//////////////////////////////////////////////////////
// 功能: 输出相应辈分成员
// 函数名: chengyuan
// 说明:输出相应辈分成员 递归法
//////////////////////////////////////////////////////
void chengyuan(node *head, int name)
{
if(head != NULL)
{
if(head->generation == name)//找到后且该成员未被删除 则输出
{
if(strcmp(head->family, "0") != 0)//查找
printf("-%s-", head->family);//输出
}
chengyuan(head->lchild, name);//递归
chengyuan(head->rchild, name);//递归
}
}
//////////////////////////////////////////////////////
// 功能: 删除成员
// 函数名: Delete
// 说明:其实未删除,只是将其姓名设为字符 0 递归法
//////////////////////////////////////////////////////
void Delete(node* head,char *name)
{
if(head != NULL)
{
if(strcmp(head->family, name) == 0)//比较找到
strcpy(head->family, "0");//值归0
Delete(head->lchild, name);//递归
Delete(head->rchild, name);//递归
}
}
//////////////////////////////////////////////
// 主函数 main()
// 调用主界面函数 Display()
//////////////////////////////////////////////
int main()
{
Display();//显示主界面
return 0;
}
int add_child(node *head) 这个语句里有错误,让整个程序正确运行
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- devmiao 2018-12-25 02:46关注
int AddNodeAtHead ( struct List *L, void *nd )
{
Link pn;pn = CreateNode ( L, nd ); if ( pn == NULL ) return ( 0 ); /*--- Add the node ---*/ if ( LLHead == NULL ) /* is it the first node? */ { LLHead = LLTail = pn; /*--- yes ---*/ } else /*--- no ---*/ { LLHead->prev = pn; /* first goes node before Head */ pn->next = LLHead; /* put Head next */ LLHead = pn; /* then point Head to us */ } NodeCount += 1; return ( 1 );
}
解决 无用评论 打赏 举报
悬赏问题
- ¥15 lammps Gpu加速出错
- ¥15 关于PLUS模型中kapaa值的问题
- ¥15 关于博途V17进行仿真时无法建立连接问题
- ¥15 请问下这个红框里面是什么文档或者记事本编辑器
- ¥15 机器学习教材中的例题询问
- ¥15 求.net core 几款免费的pdf编辑器
- ¥15 为什么安装HCL 和virtualbox之后没有找到VirtualBoxHost-OnlyNetWork?
- ¥15 C# P/Invoke的效率问题
- ¥20 thinkphp适配人大金仓问题
- ¥20 Oracle替换.dbf文件后无法连接,如何解决?(相关搜索:数据库|死循环)