数据结构课程设计家谱c语言,数据结构课程设计 用二叉树实现家谱的相关运算 怎么编?谢谢!...

1a76d1e2284a64184a9fccc98718f924.png

稍微修改下就应该能用了..

#include <stdio.h>

typedef struct node

{

int tag;

union{struct node *sublist;

char data;

}dd;

struct node *link;

}NODE;

NODE *creat_GL(char **s)

{

NODE *h;

char ch;

ch=*(*s);

(*s)++;

if(ch!='\0')

{

h=(NODE*)malloc(sizeof(NODE));

if(ch=='(')

{

h->tag=1;

h->dd.sublist=creat_GL(s);

}

else

{

h->tag=0;

h->dd.data=ch;

}

}

else

h=NULL;

ch=*(*s);

(*s)++;

if(h!=NULL)

if(ch==',')

h->link =creat_GL(s);

else

h->link=NULL;

return(h);

}

void prn_GL(NODE *p)

{

if(p!=NULL)

{

if(p->tag==1)

{

printf("(");

if(p->dd.sublist ==NULL)

printf(" ");

else

prn_GL(p->dd.sublist );

}

else

printf("%c",p->dd.data);

if(p->tag==1)

printf(")");

if(p->link!=NULL)

{

printf(",");

prn_GL(p->link);

}

}

}

NODE *copy_GL(NODE *p)

{

NODE *q;

if(p==NULL) return(NULL);

q=(NODE *)malloc(sizeof(NODE));

q->tag=p->tag;

if(p->tag)

q->dd.sublist =copy_GL(p->dd.sublist );

else

q->dd.data =p->dd.data;

q->link=copy_GL(p->link);

return(q);

}

int depth(NODE *p)

{

int h,maxdh;

NODE *q;

if(p->tag==0) return(0);

else

if(p->tag==1&&p->dd.sublist==NULL) return 1;

else

{

maxdh=0;

while(p!=NULL)

{

if(p->tag==0) h=0;

else

{q=p->dd.sublist;

h=depth(q);

}

if(h>maxdh)

maxdh=h;

p=p->link;

}

return(maxdh+1);

}

}

int count(NODE *p)

{

int m,n;

if(p==NULL) return(0);

else

{

if(p->tag==0) n=1;

else

n=count(p->dd.sublist);

if(p->link!=NULL)

m=count(p->link);

else m=0;

return(n+m);

}

}

main()

{

NODE *hd,*hc;

char s[100],*p;

p=gets(s);

p=s;

hd=creat_GL(&p);

hc=copy_GL(hd);

printf("\ncopy after:");

prn_GL(hc);

printf("\ndepth=%d ",depth(hc));

printf("\ncount=%d",count(hc));

getch();

}

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个比较棘手的任务,需要用到C语言的基本语法和数据结构知识,以及文件操作相关的知识。下面是一个简单的程序框架,供参考: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LEN 20 #define MAX_ID_LEN 20 #define MAX_DATE_LEN 20 typedef struct _person { char name[MAX_NAME_LEN]; // 姓名 char gender; // 性别,M表示男性,F表示女性 char spouse[MAX_NAME_LEN]; // 配偶姓名 char id[MAX_ID_LEN]; // 身份证号 int age; // 年龄 char birthdate[MAX_DATE_LEN]; // 出生日期 struct _person *father; // 父亲 struct _person *mother; // 母亲 struct _person *spouse_ptr; // 配偶指针 struct _person *child_head; // 孩子链表头指针 struct _person *next; // 兄弟指针 } Person; Person *create_person(char *name, char gender, char *spouse, char *id, int age, char *birthdate) { // TODO: 创建一个Person节点并初始化 } void add_child(Person *parent, Person *child) { // TODO: 将child添加到parent的孩子链表中 } Person *find_person(char *name) { // TODO: 在家谱中查找姓名为name的Person节点 } void print_person(Person *person) { // TODO: 输出一个Person节点的信息 } void print_family(Person *person, int level) { // TODO: 递归输出一个家族的信息 } void load_family(char *filename) { // TODO: 从文件中加载家族信息 } void save_family(char *filename) { // TODO: 将当前家族信息保存到文件中 } void add_person() { // TODO: 添加一个Person节点到家谱中 } void find_children() { // TODO: 查找某人的所有儿子并输出信息 } void find_parents() { // TODO: 查找某人的双亲并输出信息 } void print_menu() { // TODO: 输出菜单 } int main() { // TODO: 实现菜单循环 return 0; } ``` 该程序框架包含了常见的家族关系操作,如添加节点、查找儿子、查找双亲等。其中,节点采用了孩子表示法,即每个节点维护了一个孩子链表头指针,以及指向配偶、父亲和母亲的指针。 你可以根据自己的理解和需要,对程序框架进行修改和扩展。在写代码的过程中,需要注意内存泄露、空指针等问题,并且要保证家族信息的正确性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值