二叉树的应用:利用C语言编写简单的家谱管理系统

/*采用树型结构实现如下系统功能:
1)输入文件以存放最初家谱中各成员的信息。 成员的信息中均应包含以下内容:
姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)也可附加其它信息、但不是必需的。
2)实现数据的存盘和读盘。
3)以图形方式显示家谱。
4)显示第n代所有人的信息。
5)按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
6)按照出生日期查询成员名单。
7)输入两人姓名,确定其关系。
8)某成员添加孩子。
9)删除某成员(若其还有后代,则一并删除)。
10)修改某成员信息。
11)按出生日期对家谱中所有人排序。
12)打开一家谱时,提示当天生日的健在成员。
测试要求:
1)建立至少10个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。
2)对界面的要求是:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

注:有关文件的操作我做的不好,另外图形化界面做的不太好,增加孩子的时候空格不好控制,这是CodeBlocks的硬伤
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<fstream>
#define MAXSIZE 100
using namespace std;
typedef struct Infomation{
    char name[20];
    char birth[20];
    int wedding;
    char add[20];
    int health;
    char death_date[20];
}Info;
typedef struct bnode{
    Info person;
    struct bnode *lchild,*rchild;
}BNode,*BiTree;

typedef struct{   //循环队列的定义
    BiTree queue[MAXSIZE];
    int front,rear;
}Queue;
void InitQ(Queue &Q)  //初始化
{
    Q.front=Q.rear=0;
}

void EnQueue(Queue &Q,BiTree e)  //入队
{
    Q.rear=(Q.rear+1)%MAXSIZE;
    Q.queue[Q.rear]=e;
}

void DeQueue(Queue &Q,BiTree &e)  //出队
{
    Q.front=(Q.front+1)%MAXSIZE;
    e=Q.queue[Q.front];
}

int QEmpty(Queue Q)  //判队空
{
    return Q.front==Q.rear;
}

int QFull(Queue Q)  //判队满
{
    if((Q.rear+1)%MAXSIZE==Q.front)
        return 1;
    return 0;
}
void new_left(BiTree p,Info info)
{
    BiTree q=(BiTree)malloc(sizeof(BNode));
    q->person=info;
    q->lchild=q->rchild=NULL;
    p->lchild=q;
}
void new_right(BiTree p,Info info)
{
    BiTree q=(BiTree)malloc(sizeof(BNode));
    q->person=info;
    q->lchild=q->rchild=NULL;
    p->rchild=q;
}
BiTree create()
{
    struct Infomation human[11]={
  
  {"John","19000511",1,"nefu",0,"19800401"},
                                {"Jack","19200721",1,"hit",0,"19900402"},
                                {"Mary","19230526",1,"mit",0,"19981221"},
                                {"Tom","19440501",1,"bit",0,"20080419"},
                                {"Lily","19480711",0,"nefu",0,"20010201"},
                                {"Ben","19480505",1,"hit",0,"20070401"},
                                {"June","19490541",1,"baidu",0,"20141111"},
                                {"Mark","19600430",0,"nefu",1,"I am alive!"},
                                {"Lucy","19760301",0,"jingdong",1,"I am alive!"},
                                {"Steven","19770519",1,"alibaba",1,"I am alive!"},
                                {"Ann","20000101",0,"nefu",1,"I am alive!"}};
    BiTree bt;
    bt=(BiTree)malloc(sizeof(BNode));
    bt->person=human[0];
    bt->lchild=bt->rchild=NULL;
    new_left(bt,human[1]);
    new_right(bt,human[2]);
    new_left(bt->lchild,human[3]);
    new_right(bt->lchild,human[4]);
    new_left(bt->rchild,human[5]);
    new_right(bt->rchild,human[6]);
    new_left(bt->lchild->lchild,human[7]);
    new_right(bt->lchild->lchild,human[8]);
    new_left(bt->rchild->rchild,human[9]);
    new_right(bt->rchild->rchild->lchild,human[10]);
    return bt;
}
void output(BiTree p)//输出某结点的信息
{
    printf("%-7s%-7s%7d%12s%10d%17s\n",p->person.name,p->person.birth,p->person.wedding,p->person.add,p->person.health,p->p
很高兴为您解答。下面是一个使用C语言编写简单家谱管理系统的示例: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构 typedef struct Node { char name[20]; struct Node* left; struct Node* right; } Node; // 创建新节点 Node* createNode(char name[]) { Node* newNode = (Node*)malloc(sizeof(Node)); strcpy(newNode->name, name); newNode->left = NULL; newNode->right = NULL; return newNode;} // 插入子节点 void insertChild(Node* root, char parentName[], char childName[]) { if (root == NULL) { return; } if (strcmp(root->name, parentName) == 0) { if (root->left == NULL) { root->left = createNode(childName); } else if (root->right == NULL) { root->right = createNode(childName); } else { printf("该节点已经有两个子节点了。\n"); } } else { insertChild(root->left, parentName, childName); insertChild(root->right, parentName, childName); } } // 遍历打印家谱 void printFamilyTree(Node* root) { if (root == NULL) { return; } printf("%s\n", root->name); printFamilyTree(root->left); printFamilyTree(root->right); } int main() { // 创建家谱树 Node* root = createNode("曾祖父"); insertChild(root, "曾祖父", "祖父"); insertChild(root, "曾祖父", "曾祖母"); insertChild(root, "祖父", "父亲"); insertChild(root, "祖父", "叔叔"); insertChild(root, "祖父", "姑姑"); insertChild(root, "父亲", "我"); insertChild(root, "父亲", "兄弟"); // 打印家谱 printf("家谱树:\n"); printFamilyTree(root); return 0; } ``` 这个示例中,我们使用了二叉树的数据结构来表示家谱。每个节点包含一个名字和两个指针,分别指向左子节点和右子节点。通过插入子节点的操作,我们可以构建一个完整的家谱树。最后,通过遍历打印家谱树,我们可以将家谱信息输出到屏幕上。
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值