首页 > 其他分享 >LYU 族谱系统

LYU 族谱系统

时间:2024-06-12 13:29:09浏览次数:17  
标签:LYU name mem 系统 Mem mem1 printf NULL 族谱

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include"mem.txt"


int found=0;
int count=0;

typedef struct Mem {
    char name[20];            
    int generation;           
    struct Mem* parent;    
    struct Mem* lchild; 
    struct Mem* rchild;
} Mem;
 
Mem* familyRoot = NULL;
 
 
Mem* findMem(Mem* bt,char *na)
{
    Mem *lresult,*rresult;
    if(!bt)
    {
        return NULL;
    }
    if(strcmp(bt->name,na)==0)
    return bt;
    else
    {
        lresult=findMem(bt->lchild,na);
        rresult=findMem(bt->rchild,na);
        return lresult?lresult:(rresult?rresult:NULL);
    }
}

void findDescendants(Mem* mem) {
    if (mem == NULL) {
        return;
    }
    if (mem->lchild != NULL) {
        findDescendants(mem->lchild);
    }
    if (mem->rchild != NULL) {
        findDescendants(mem->rchild);
    }
    printf("%s ", mem->name);
}
 
void findAncestors(Mem* mem) {
	if(mem==NULL)
	{
		printf("无祖先\n");
		return;
	}
    while (mem != NULL) {
        printf("%s ", mem->name);
        mem = mem->parent;
    }
}
 
void printGeneration(char* name) {
    Mem* mem = findMem(familyRoot,name);
    if (mem == NULL) {
        printf("%s 成员不存在\n", name);
    } else {
        printf("%s 的辈分为 %d\n", name, mem->generation);
    }
}
 
void printByGeneration(Mem* p,int root) {
	if(p==NULL) return;
    //printf("第 %d 辈成员:\n", root);
	if(p->generation==root)
	{
		printf("%s ",p->name);
		found=1;
	}
	printByGeneration(p->lchild,root);
	printByGeneration(p->rchild,root);
}
 
void addMem(char* name, char* parentName) {
    Mem* mem= (Mem*)malloc(sizeof(Mem));
    strcpy(mem->name, name);
    mem->generation = -1; // 先默认为-1,之后再计算
    mem->parent = NULL;
    mem->lchild = NULL;
    mem->rchild = NULL;
 
    if (familyRoot == NULL) { // 如果还没有根节点,则当前成员为根节点
        familyRoot = mem;
    } 
	else {
        Mem* parent = findMem(familyRoot,parentName);
        if (parent == NULL) { // 如果父亲不存在,则直接将新成员挂到根节点下
            mem->parent = familyRoot;
            familyRoot->lchild = mem;
        } 
		else {
            if (parent->lchild == NULL) {
                parent->lchild = mem;
            } 
			else if (parent->rchild == NULL) {
                parent->rchild = mem;
            } 
			else { // 父亲已有两个孩子,不能再添加了
                printf("无法添加 %s 成员,因为 %s 已经有两个孩子了\n", name, parent->name);
                free(mem);
                return;
            }
            mem->parent = parent; // 设置父亲指针
        }
    }
 
    // 计算成员辈分
    Mem* p = mem;
    int gen = 1;
    while (p->parent !=NULL) {
        gen++;
        p = p->parent;
    }
    mem->generation = gen;
 
    printf("%s 成员添加成功,辈分为 %d\n", name, gen);
}

void deleteMem(Mem* mem) {
    if (mem == NULL) {
        return;
    }
    deleteMem(mem->lchild);
    deleteMem(mem->rchild);
    if (mem->parent == NULL) { 
		return;
    } 
	else { 
        if (mem->parent->lchild == mem) {
            mem->parent->lchild = NULL;
        } 
		else {
            mem->parent->rchild = NULL;
		}
    }
    printf("%s 成员删除成功\n", mem->name);
    free(mem);
}
 
Mem* findL(Mem* m1, Mem* m2) {
    if (m1 == NULL || m2 == NULL) {
        return NULL;
    }
    if (m1 == m2) {
        return m1;
    }
    Mem* p1 = m1;
    while (p1 != NULL) {
        Mem* p2 = m2;
        while (p2 != NULL) { 
            if (p1 == p2) {
                return p1;
            }
            p2 = p2->parent;
        }
        p1 = p1->parent;
    }
    return NULL; 
}
 
int countson(Mem* gen)
{
	if(!gen) return 0;
	return countson(gen->lchild)+countson(gen->rchild)+1;
}
int main() {
	int num;
	char name[20];
	char parentname[20];
	int root;
	Mem* mem1;
	Mem* mem2;
	FILE* fp = fopen("mem.txt", "r");
	if (fp == NULL) {
    	printf("无法打开文件:mem.txt\n");
    	return 1;
	}
	char line[100];
	while (fgets(line, 100, fp) != NULL) {
    	sscanf(line, "%s %s", name, parentname);
    	addMem(name, parentname);
	}
	fclose(fp);
	while (1) {
    	printf("----------家谱管理系统-----------\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("	9. 输出节点所有子孙数\n");
    	printf("	10. 退出程序\n");
    	printf("---------------------------------\n");;
    	printf("请输入选项(1-9):");
    	scanf("%d", &num);
    	switch (num) {
        	case 1: 
            	printf("请输入成员姓名:");
            	scanf("%s", name);
            	mem1 = findMem(familyRoot,name);
            	if (mem1 == NULL) {
                	printf("%s 成员不存在\n", name);
            	} 
				else {
                	printf("%s 成员辈分为 %d,父亲是 %s\n", name, mem1->generation,
                    	   mem1->parent == NULL ? "NULL" : mem1->parent->name);
            	}
            	break;
        	case 2: 
            	printf("请输入成员姓名:");
            	scanf("%s", name);
            	mem1 = findMem(familyRoot,name);
            	if (mem1 == NULL) {
                	printf("%s 成员不存在\n", name);
            	}
				else {
                	printf("%s 的所有子孙为:", name);
					if(mem1->lchild)
                	findDescendants(mem1->lchild);
					if(mem1->rchild)
					findDescendants(mem1->rchild);
                	printf("\n");
            	}
            	break;
        	case 3: 
            	printf("请输入成员姓名:");
            	scanf("%s", name);
            	mem1 = findMem(familyRoot,name);
            	if (mem1 == NULL) {
                	printf("%s 成员不存在\n", name);
            	} 
				else {
                	printf("%s 的所有祖先为:", name);
                	findAncestors(mem1->parent);
                	printf("\n");
            	}
            	break;
        	case 4:
            	printf("请输入成员姓名:");
            	scanf("%s", name);
            	printGeneration(name);
            	break;
        	case 5:
            	printf("请输入辈份:");
            	scanf("%d", &root);
				printf("第 %d 辈成员:\n", root);
            	printByGeneration(familyRoot,root);
				if (!found) {
        			printf("没有第 %d 辈的成员\n", root);
    			}
    			printf("\n");
				found=0;
            	break;
        	case 6: 
           		printf("请输入成员姓名和父亲姓名(用空格分隔):");
            	scanf("%s %s", name, parentname);
            	addMem(name, parentname);
            	break;
        	case 7: 
            	printf("请输入成员姓名:");
            	scanf("%s", name);
            	mem1 = findMem(familyRoot,name);
            	if (mem1 == NULL) {
            	    printf("%s 成员不存在\n", name);
            	} 
				else {
                	deleteMem(mem1);
            	}
            	break;
        	case 8: 
            	printf("请输入两个成员的姓名(用空格分隔):");
            	scanf("%s %s", name, parentname);
				mem2 = findMem(familyRoot,parentname);
            	mem1 = findMem(familyRoot,name);
            	if (mem1 == NULL || mem2 == NULL) {
                printf("至少有一个成员不存在\n");
            	} 
				else {
                	Mem* l = findL(mem1, mem2);
                	if (l == NULL) {
                    	printf("%s 和 %s 没有最近公共祖先\n", name, parentname);
                	} 
					else {
                    	printf("%s 和 %s 的最近公共祖先为 %s\n", name, parentname, l->name);
                	}
            	}
            	break;
        	case 9: 
				printf("请输入要查寻的名字\n");
				scanf("%s",&name);
				mem1=findMem(familyRoot,name);
				if(mem1==NULL)
				{
					printf("不存在该名字");
				}
				else{
					//countson(mem1);
					printf("该节点的子孙数为 %d\n",countson(mem1)-1);
				}
				count = 0;
            	break;
			case 10:
				return 0;
        	default:
            	printf("输入错误,请重新输入\n");
    	}
	}
	return 0;
} 

初始族谱使用文本输入

格式为:第一行为根节点姓名,之后每一行两个名字,第一个名字为第二个名字的孩子,用空格隔开

标签:LYU,name,mem,系统,Mem,mem1,printf,NULL,族谱
From: https://blog.csdn.net/CYL408/article/details/139623976

相关文章

  • 【S087】Springboot+Thymleaf在线答疑系统项目源码 java源代码
    运行截图:登录学生注册教师注册学生发起问题联系我们后台首页常见问题管理添加常见问题人工答疑学生管理个人信息修改密码项目组成:项目源码:源码获取⬇⬇⬇......
  • 【S086】基于Springboot图书馆管理系统项目源码 java图书借阅管理 含文档
    运行截图:登录后台主页图书列表图书上架借阅图书归还图书用户列表添加用户公告列表发布公告个人信息详情个人信息编辑项目组成:项目源码:项目文档:源码获取⬇⬇⬇......
  • Centos7系统下BackupPc 部署安装
    1、安装epel-release数据源yum--enablerepo=extras-yinstallepel-release2、安装BackupPC-XS和rsync-bpcyum--enablerepo=epel-testing-yinstallBackupPC-XSrsync-bpc3、安装BackupPC的依赖软件yum-yinstallbzip2httpdmod_perlpar2cmdlineperl-Arch......
  • 【龙溪系统docker 安装Oracle ,并连接本地数据库】
    安装docker(龙蜥系统)/安装docker/[root@localhostdockers]#cd/etc/yum.repos.d/查看配置文件/sudoyumupdate-y/更新YUM包/[root@localhostdockers]#sudofirewall-cmd--zone=public--permanent--add-port=443/tcp[root@localhostdockers]#sudofirewal......
  • 【龙溪系统docker 安装Oracle ,并连接本地数据库】(下)
    win10系统设置找到tnsnames.ora文件,然后写入:ORCL_DOCKER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=本机IP地址)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=helowin)))创建数据库角色Oracle/创建用户和角色/SELECT*FROM......
  • 金地集团:性能考量为首要,核心系统的数据库选型|OceanBase 《DB大咖说》(七)
    OLTP是关系型数据库的典型使用场景。然而,在实际应用中,除了OLTP外,OLAP能力也至关重要,因此催生了HTAP技术的发展。金地集团的核心系统,新一代预算管理系统,凭借OceanBase的HTAP能力,仅花费一年便实现了从研发到投入使用,其测算的性能效率显著提升,达到了90倍的飞跃,成功满足了集团整体......
  • 这才是CSDN最系统的网络安全学习路线(建议收藏)
      01什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也......
  • 这才是CSDN最系统的网络安全学习路线(建议收藏)
      01什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也......
  • 这才是CSDN最系统的网络安全学习路线(建议收藏)
      01什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也......
  • stm32系统时钟RCC简析
    一概念STM32本身十分复杂,外设非常多  但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费  并且,同一个电路,时钟越快功耗越快,同......