c语言写的家谱,总是在增删处进行不下去,早怎么改?
#include<stdio.h> #include<string.h>
#include<stdlib.h>
#include<math.h>
#define MAXSIZE 200
#define MAI 20
typedef int TElemType;
///////////////////////////////
////////////////////////////
struct node//结构体变量
{
char name[MAI]; //姓名
int dirthtime;//[MAI];//出生日期
int deathtime[MAI];//死亡日期
char sex;//性别,男为M,女为W
char homeplace[ MAXSIZE ];//出生地
char homeaddress[ MAXSIZE ];//家庭住址
char occuption[MAI];//职业
char resume[MAXSIZE]; //简历
int i;//辈分
}node;
///////////////////////////////
////////////////////////////
typedef struct scnode//孩子兄弟表示法
{
struct node l;
struct scnode *child;
struct scnode *brother;
}scnode;
///////////////////////////////
////////////////////////////
scnode *search(scnode *data,char name[])//按姓名查找
{
scnode *p;
if(data!=NULL)
{
if(data->l.name==name)
p=data;
else
{
p=search(data->child,name);
if(p!=NULL)
return p;
else
p=search(data->brother,name);
}
}
return p;
}
///////////////////////////////
////////////////////////////
scnode *firshrood()//建立第一个祖先
{
scnode *data;
data=(scnode *)malloc(sizeof(scnode));//分配存储空间
printf("输入祖先名字:");
scanf("%s",&data->l.name );
printf("输入祖先出生日期:");
scanf("%d",&data->l.dirthtime );
printf("输入祖先死亡日期:");
scanf("%d",&data->l.deathtime );
printf("输入祖先性别:");
scanf("%s",&data->l.sex );
printf("输入祖先出生地:");
scanf("%s",&data->l.homeplace );
printf("输入祖先家庭住址");
scanf("%s",&data->l.homeaddress );
printf("输入祖先职业:");
scanf("%s",&data->l.occuption );
printf("输入祖先简历:");
scanf("%s",&data->l.resume );
data->l.i =1;
printf("家祖载入成功\n");
data->child =NULL;
data->brother =NULL;
return data;
}
///////////////////////////////
////////////////////////////
scnode *add():/增加成员
{
scnode *data,*n;
char name[MAI];
int i;
printf("请输入相关人姓名");
scanf("%s",name);
n=search(data,name);
while(n==NULL)
{
printf("没有此人,请重新输入姓名:");
scanf("%s",name);
n=search(data,name);
}
printf("选择家庭成员类别选项:\n");
printf("1.孩子; 2.为此人兄弟\n");
scanf("%d",&i);
if(i==1)
{
if(n->child==NULL)
{
n->child=(scnode *)malloc(sizeof(scnode));//分配存储空间
}
printf("输入孩子名字:");
scanf("%s",n->child->l.name );
printf("输入孩子出生日期:");
scanf("%d",n->child->l.dirthtime );
printf("输入孩子死亡日期:");
scanf("%d",n->child->l.deathtime );
printf("输入孩子性别:");
scanf("%s",n->child->l.sex );
printf("输入孩子出生地:");
scanf("%s",n->child->l.homeplace );
printf("输入孩子家庭住址");
scanf("%s",n->child->l.homeaddress );
printf("输入孩子职业:");
scanf("%s",n->child->l.occuption );
printf("输入孩子简历:");
scanf("%s",n->child->l.resume );
n->l.i+=1;
n->child->brother =NULL;
n->child ->child =NULL;
return n->child;
}
if(i==2)
{
if(n->brother ==NULL)
{
n->brother =(scnode *)malloc(sizeof(scnode));//分配存储空间
n->brother ->brother =NULL;
n->brother ->child =NULL;
}
printf("输入兄弟名字:");
scanf("%s",&n->l.name );
printf("输入兄弟出生日期:");
scanf("%d",&n->l.dirthtime );
printf("输入兄弟死亡日期:");
scanf("%d",&n->l.deathtime );
printf("输入兄弟性别:");
scanf("%s",&n->l.sex );
printf("输入兄弟出生地:");
scanf("%s",&n->l.homeplace );
printf("输入兄弟家庭住址");
scanf("%s",&n->l.homeaddress );
printf("输入兄弟职业:");
scanf("%s",&n->l.occuption );
printf("输入兄弟简历:");
scanf("%s",&n->l.resume );
n->l.i=data->l.i;
return n;
}
return 0;
}
///////////////////////////////
////////////////////////////
void chazhao()//查找此人相关信息
{
scnode *data;
scnode *n,*t;
char name[MAI];
printf("输入姓名,查找相关信息:\n");
scanf("%c",name);
n=search(data,name);
while(n==NULL)
{
printf("此人不存在,请再次输入:\n");
scanf("%c",name);
n=search(data,name);
}
printf("此人:\n");//?
printf("%s %d %d %s %s %s %s\n",n->l.name,n->l.dirthtime ,n->l.deathtime,n->l.sex, n->l.homeplace, n->l.homeaddress ,n->l.occuption);
if(n->brother==NULL)
printf("此人没有兄弟!\n");
else printf("%s %d %d %s %s %s %s\n",n->l.name,n->l.dirthtime ,n->l.deathtime,n->l.sex, n->l.homeplace, n->l.homeaddress ,n->l.occuption );
printf("此人的孩子:\n");
if(n->child==NULL)
printf("此人没有孩子!\n");
else if(n->brother->child==NULL)
printf("%s %d %d %s %s %s %s\n",n->l.name,n->l.dirthtime ,n->l.deathtime,n->l.sex, n->l.homeplace, n->l.homeaddress ,n->l.occuption );
else{
printf("%s %d %d %s %s %s %s\n",n->l.name,n->l.dirthtime ,n->l.deathtime,n->l.sex, n->l.homeplace, n->l.homeaddress ,n->l.occuption );
t=n->brother ->child;
while(t!=NULL)
{
printf("%s %d %d %s %s %s %s\n",n->l.name,n->l.dirthtime ,n->l.deathtime,n->l.sex, n->l.homeplace, n->l.homeaddress ,n->l.occuption );
t=t->child;
}
}
}
///////////////////////////////
////////////////////////////
void shanchu()//删除
{
scnode *data;
scnode *n;
char name[MAI];
printf("输入姓名,查找相关信息:\n");
scanf("%c",&name);
n=search(data,name);
while(n==NULL)
{
printf("此人不存在,请再次输入:\n");
scanf("%c",&name);
n=search(data,name);
}
printf("找到此人");
free(n->brother);
free(n->child );
free(n);
printf("已删除");
}
///////////////////////////////
////////////////////////////
void jisuan()
{
scnode *data;
int j=0,k=0,y=0,c=0,b=0,v=0,z=0,w=0,o=0;
while(data==NULL )//计算男女人数
{
if(data->l.sex=='M')
k++;
else
j++;
data->child;
data->brother;
}
printf("男有%d女有%d\n",k,j);
while(data==NULL)//计算年代人数
{
y=data->l .dirthtime ;
y/=10000;
y=y%10;
switch(y)
{
case 9:c++;break;
case 8:b++;break;
case 7:v++;break;
case 6:z++;break;
case 5:w++;break;
default:o++;break;
}
data->child;
data->brother;
}
printf("90后有%d人;80后有%d人;70后有%d人;60后有%d人;50后有%d人;其他有%d人",c,b,v,z,w,o);
}
///////////////////////////////
////////////////////////////
int main()
{
scnode *data;
data=firshrood();//头节点
//firshrood();
int m;
while(1)
{
//data=firshrood();
printf("选项:\n") ;
printf("*****1.输入祖先*****2.添加成员*****\n*****3.删除成员*****4.查找成员信息*****\n*****5.查看家族信息*****0.退出系统*****\n");
printf ("请输入选项m:");
scanf("%d",&m);
if(m==1)//创建家祖
{
firshrood();//调用函数
}
if(m==2)//添加成员
{
add();//调用函数
}
if(m==3)//删除成员
{
shanchu();//调用函数
}
if(m==4)//查找成员信息
{
chazhao();//调用函数
}
if(m==5)//查询家族信息
{
while(1)
{
int a;
printf("*****1.男女比例&年龄分布*****2.迁徒历史*****\n*****3.家族名人录*****4.退出*****\n");
printf ("请输入选项a:");
scanf("%d",&a);
if(a==1)
{
jisuan();//调用函数,男女比例
//调用函数, 年龄分布
}
if(a==2)
{
printf("1890年从福建某某迁到某某地\n");// 迁徒历史
}
if(a==3)
{
printf("张衡(78年-139年),生平:。。。。。,成就:。。。。。。\n ");//家族名人录
}
if(a==0)
{
break;
}
}
}
if(m==0)//退出
{
printf("谢谢使用!\n");
break;
}
}
return 0;
}