家谱里的“父系、母系”分别怎么划分?
直系血亲
●父系
◢高祖父--曾祖父--祖父--父亲
◢高祖母--曾祖母--祖母--父亲
注:祖父一辈人的称呼:
祖父的哥哥
伯祖父(伯公)
祖父的嫂嫂
伯祖母(姆婆)
祖父的弟弟
叔祖父(叔公)
祖父的弟妇
叔祖母(婶婆)
祖父的姐夫、妹夫
姑祖父(姑公)
祖父的姐姐、妹妹
姑祖母(姑婆)
祖母的哥哥、弟弟
舅祖父(舅公)
祖母的嫂嫂、弟妇
舅祖母(妗婆)
祖母的姐夫、妹夫
姨祖父(姨公)
祖母的姐姐、妹妹
姨祖母(姨婆)
●母系
◢高外祖父--曾外祖父--外祖父--母亲
◢高外祖母--曾外祖母--外祖母--母亲
●子孙
◢儿子:夫妻间男性的第一子代。
◢女儿:夫妻间女性的第一子代。
◢孙:夫妻间的第二子代,依性别又分孙子、孙女。有时孙子是一种不分性别的称呼。
◢曾孙:夫妻间的第三子代。
◢玄孙:夫妻间的第四子代。
■旁系血亲
●父系
◢伯:父亲的兄长,也称伯父、伯伯、大爷
◢伯母:伯父的妻子,也称大妈、大娘
◢叔:父亲的弟,也称叔父、叔叔
◢婶:叔叔的妻子,也称叔母
◢姑:父亲的姊妹,也称姑姑、姑母、姑妈
◢姑父:姑姑的丈夫
●母系
◢舅:母亲的兄弟,也称舅舅
◢舅母:舅舅的妻子也称舅妈、妗母、妗子
◢姨:母亲的姐妹,也称阿姨、姨妈、姨母
◢姨父:阿姨的丈夫
●晚辈
◢侄儿:兄弟的儿子
◢侄女:兄弟的女儿
◢外甥:男性称姊妹的儿子
◢外甥女:男性称姊妹的女儿
◢姨甥:女性称姊妹的儿子
◢姨甥女:女性称姊妹的女儿
■姻亲
◢丈夫:结婚的女人对自己伴侣的称呼
◢妻:或媳妇,结婚的男人对自己伴侣的称呼
◢公公:丈夫的父亲,也直称爸爸
◢婆婆:丈夫的母亲,也直称妈妈
◢岳父:丈人,妻子的父亲,也直称爸爸
◢岳母:丈母娘,妻子的母亲,也直称妈妈
◢儿媳:对儿子的妻子的称呼
◢女婿:对女儿的丈夫的称呼
◢嫂:对兄长妻子的称呼
◢弟妹、弟媳:对弟弟妻子的称呼
◢姐夫:对姐姐丈夫的称呼
◢妹夫:对妹妹丈夫的称呼
◢妯娌:兄弟的妻子间互相间的称呼或合称
◢连襟:姐妹的丈夫间互相间的称呼或合称,也称襟兄弟
◢大姑子:对丈夫的姐姐的称呼
◢小姑子:对丈夫妹妹的称呼
◢大舅子:对妻子哥哥的称呼
◢小舅子:对妻子弟弟的称呼
◢大姨子:对妻子姐姐的称呼
◢小姨子:对妻子妹妹的称呼
欧式家谱体例,是现在用得最多的家谱模式。它是北宋大文学家欧阳修家族家谱模式的简称。它的特点就是:世代分格,由右向左;五世一表,一表一提。上下为父子,左右为兄弟。
1、 欧式家谱一般是一页左右十竖行,上下五层横格。上下为父子,左右为兄弟。
2、上下五层横格,为五世。从上往下数,一、二、三、四、五,五世。每上下相邻的两层均为父子关系。
3、同一层横格中左右相排的人均为同辈的兄弟。以年齿论,右边的排行为长,向左依次递减为老二、老三、……。
4、父亲只有一子,则竖行中父子名讳上下相对;如果父有三子,正对父亲名下的是长子,紧邻长子左边的两格则填写老二老三的名讳。
5、同辈的人数较多,一页填写不完可往下页延续,但表示世系辈分的横格不能舛错,不然的话,世系辈分就乱了。
6、一个竖格,填写夫妇二人名讳,右边写男人名讳,左边写妻子名讳。需要加注的,名字旁边加注小字。
7、首页五世,这五世不论占了几页,都是同表,都得一提。提,就是把本表最下一横层中,第五世的所有名字,都提到下一表中最上层的第一层横格中,按原来的顺序从右到左依次排好。提的作用就是上下两表关系的承上启下,互相衔接,不致舛错、断裂。
8、提到第二表的五世,领续下面的六、七、八、九四世。由于此表领续的五世是上表未世的重复,所以此表实际上只续了四世。下边后续的各表都是如此,这叫"五世一提,实续四世"。
9、家族较大,支系众多,可续完一支,再续另外一支,在卷首编好目录页码,便于日后的查阅。
10、以上9项,都是世系排序的元素。世系是家谱的主要内容,除世系外,还有凡例、序言、影像、家规、题名、耆寿、节烈等诸多项目。由于各个家族具体情况不同,所以家谱编写的内容也不尽相同。
C++语言: 二叉树实现的简单家谱树
/
File Name: BiTreecpp
Author: Geng Lequn[glq2000@126com]
Thur July 1 2010
Discription: 建立二叉家谱树,实现输入任意两个人的名字,查找得到其关系
/
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <mathh>
using namespace std;
typedef struct _Node
{
string sex; //性别 m 男; f 女
string name; //此人的姓名
string spause; //配偶的姓名
unsigned short level; //层次 辈分最高一层为1,下一层为为2,以此类推
struct _Node l_child; //指向其第一个孩子的指针
struct _Node r_brother; //指向其某一个兄弟姐妹的指针, 即左孩子为其后代,右孩子为其兄弟姐妹
struct _Node btr; //指向其父亲或者母亲的指针
_Node():level(0),l_child(NULL),r_brother(NULL),btr(NULL){cout<<"constructor"<<endl;}
~_Node(){cout<<name<<" destructor"<<endl;}
}Node, PNode;
void CreateBiTreePreOrder(PNode &pn, PNode pback, unsigned short depth);//建立二叉家谱树,以先序方式
void VisitBiTreePreOrder(PNode root); //前序遍历此二叉树
void TellRelation(PNode root); //判断两人关系
void DestroyBiTreePostOrder(PNode root); //销毁二叉树,释放节点占用的空间
void FindPersonMiddleOrder(PNode root, string name, PNode &presult); //返回家谱中指向某人的指针,找不到返回NULL
Node root=NULL; //全局变量,二叉树的根节点
unsigned findPersonFlag = 0; //标志位,0 没找到; 1 找到,找到后就不再搜索直接返回;利用此flag可避免将整个tree遍历一遍(若该name在tree中存在的话)
int main()
{
cout<<"请按先序遍历的顺序根据提示输入家谱信息,不存在则输入\"#\""<<endl;
CreateBiTreePreOrder(root, NULL, 1);//建立二叉家谱树,以先序方式
VisitBiTreePreOrder(root); //前序遍历此二叉树
TellRelation(root); //判断两人关系
DestroyBiTreePostOrder(root); //销毁二叉树
getchar();getchar();getchar();
return 0;
}
/
function:建立二叉家谱树,以先序方式
argument:
pn: 指向二叉树节点的引用
pback: pn这个节点的btr指针的值,即指向其parent的指针
depth: 该节点的层次,分最高一层为1,下一层为为2,以此类推
/
void CreateBiTreePreOrder(PNode &pn, PNode pback, unsigned short depth)
{
string str;
cin>>str; //输入该人信息,格式是 sex-name-spausename,如不存在则输入#
if(str == "#") //如: M-tom-marry, 表示此人叫tom, 男性, 配偶名字marry
{
pn = NULL;
return;
}
//如果是自定义的struct/class,应该使用构造函数。如果是内建数据类型,
//比如int,应该memset。 当然,更好的建议是使用vector取代new出来的数组
pn = new Node;
//处理输入的字符串
vector<string> v;
for(size_t b=0, e=strfind('-'); ; e=strfind('-', b))
{
if(e == string::npos)
{
vpush_back(strsubstr(b));
break;
}
else
vpush_back(strsubstr(b, e-b));
b = e+1;
}
//初始化该节点
pn->sex = v[0];
pn->name = v[1];
pn->spause = v[2];
pn->btr = pback;
pn->level = depth;
//递归建立左右子树的节点
CreateBiTreePreOrder(pn->l_child, pn, depth+1); //注意后两个参数的值
CreateBiTreePreOrder(pn->r_brother, pback, depth); //注意后两个参数的值
}
/
function: 前序遍历此二叉树
/
void VisitBiTreePreOrder(PNode pn)
{
if(!pn)
return;
cout<<endl<<"sex:"<<pn->sex<<endl;
cout<<"name:"<<pn->name<<endl;
cout<<"spause:"<<pn->spause<<endl;
cout<<"level:"<<pn->level<<endl;
cout<<"father's name:"<<((pn->btr == NULL)"NULL":pn->btr->name)<<endl;
cout<<"======================"<<endl;
VisitBiTreePreOrder(pn->l_child);
VisitBiTreePreOrder(pn->r_brother);
}
/
function: 中序遍历找到家谱中的一个人,返回其指针,若找不到,返回NULL
isSpause 1表示是找到的节点的配偶 0表示不是所找到的节点的配偶
/
void FindPersonMiddleOrder(PNode pn, string name, PNode &presult)
{
if(!pn)
return;
FindPersonMiddleOrder(pn->l_child, name, presult);
if(findPersonFlag) return;
if(name == pn->name || name == pn->spause)
{
presult = pn;
findPersonFlag = 1; //全局标志位,0 没找到; 1 找到,找到后就不再搜索直接返回;利用此全局flag可避免将整个tree遍历一遍(若该name在tree中存在的话)
return; //下次使用前不要忘记置为0
}
FindPersonMiddleOrder(pn->r_brother, name, presult);
}
/
function: 判断两人关系,若两人中至少一人不在树中,则两人无关系
若两人在树中,先判断两人是否同层次,若同层,判断是否是亲兄弟姐妹;
若不同层,设辈分大的人为A,辈分小的人为B,判断A和B是亲的还是表的,
比如,A为男性,且比B大一倍,判断A是否为B的爸爸,或亲叔叔(舅舅),或表叔叔(舅舅)
简单起见,此处没有区分是叔叔还是舅舅
比如,A为男性,且比B大两倍,判断A是否为B的亲爷爷(姥爷),或亲爷爷(姥爷)的亲兄弟
,或亲爷爷(姥爷)的表兄弟
简单起见,此处没有区分是叔叔和舅舅等做进一步区分
简单起见,查询时只输入节点中的name,不查询spause,否则处理起来太麻烦
/
void TellRelation(PNode pn)
{
string name1, name2;
//p1指向name1, p2指向name2, pbig指向辈分大的,psmall指向辈分小的
PNode p1 = NULL, p2 = NULL, pbig = NULL, psmall = NULL;
int differ = 0; //两人辈分数的差别
string title;
Label:
cout<<endl<<"输入想查询关系的两个人的名字,不想查则将两人名字输成#:"<<endl;
while(cin>>name1 && cin>>name2)
{
if(name1=="#" && name2=="#") return;
p1 = NULL; p2 = NULL; //因为程序是循环执行的,需要将上次遗留的值清掉
findPersonFlag = 0;
FindPersonMiddleOrder(root, name1, p1);
findPersonFlag = 0;
FindPersonMiddleOrder(root, name2, p2);
if(!p1 || !p2) //若有一个为空或都为空,说明至少有一个人不在家谱中,故两人无亲缘关系
{
cout<<name1<<((!p1)" 不在":" 在")<<" 家谱树中"<<endl;
cout<<name2<<((!p2)" 不在":" 在")<<" 家谱树中"<<endl;
cout<<name1<<" 和 "<<name2<<" 间没有关系"<<endl<<endl;
goto Label;
}
differ = (int)abs(p1->level - p2->level);
if(!differ) //辈分一样大
{
if(p1->sex == p2->sex)
{
if(p1->sex == "M") title = "兄弟关系";
else title = "姐妹关系";
}
else title = "兄妹(姐弟)关系";
if(p1->btr == p2->btr) //parent相同
cout<<name1<<" 和 "<<name2<<" 间是 "<<" 亲 "<<title<<endl;
else
cout<<name1<<" 和 "<<name2<<" 间是 "<<" 表 "<<title<<endl;
}
else //辈分不一样大
{
if(p1->level < p2->level) {pbig = p1; psmall = p2;}
else {pbig = p2; psmall = p1;}
switch(differ)
{
case 1:
if(psmall->btr == pbig)
title = ((pbig->sex == "M")"爸爸":"妈妈");
else
{
if(psmall->btr->btr == pbig->btr)
title = ((pbig->sex == "M")"亲叔(舅)":"亲姑(姨)");
else
title = ((pbig->sex == "M")"表叔(舅)":"表姑(姨)");
}
break;
case 2:
if(psmall->btr->btr == pbig)
title = ((pbig->sex == "M")"爷爷(姥爷)":"奶奶(姥姥)");
else
{
string tmp = ((pbig->sex == "M")"兄弟":"姐妹");
if(psmall->btr->btr->btr == pbig->btr)
title = ((psmall->btr->btr->sex == "M")"爷爷(姥爷)的亲":"奶奶(姥姥)的亲") + tmp;
else
title = ((psmall->btr->btr->sex == "M")"爷爷(姥爷)的表":"奶奶(姥姥)的表") + tmp;
}
break;
default:
string tmp2;
PNode pt = psmall;
int n = differ-2; //计算"老"字 (即grand这个字) 出现的个数
for(int i=0; i<n; ++i)
tmp2 += "老";
for(int i=0; i<differ; ++i)
pt = pt->btr;
if(pt == pbig)
title = tmp2 + ((pbig->sex == "M")"爷爷(姥爷)":"奶奶(姥姥)");
else
{
string tmp3 = ((pbig->sex == "M")"兄弟":"姐妹");
if(pt->btr == pbig->btr)
{title = tmp2 + ((pt->sex == "M")"爷爷(姥爷)的亲":"奶奶(姥姥)的亲"); title+=tmp3;}
else
{title = tmp2 + ((pt->sex == "M")"爷爷(姥爷)的表":"奶奶(姥姥)的表"); title+=tmp3;}
}
break;
}
cout<<pbig->name<<" 是 "<<psmall->name<<" 的 "<<title<<endl;
}
goto Label;
}
}
/
function: 后序遍历销毁此二叉树,释放节点占用的内存空间
/
void DestroyBiTreePostOrder(PNode pn)
{
if(!pn) return;
DestroyBiTreePostOrder(pn->l_child);
DestroyBiTreePostOrder(pn->r_brother);
delete pn;
}
1计算一般树的叶子节点很多种方法:
a若树是双亲表示法,其实就是个一维数组表示法,数组的元素有两个域数据域data和双亲位置域parent,每个元素对应一个数组下标。很明显双亲位置域存的就是数组下标,就可以查双亲位置域,双亲位置域出现过了的数组下标,不可能为叶结点,肯定就是没有出现过的就是叶结点。
b孩子表示法,把每个节点的孩子节点排列起来,看成一个线性表,且以单链表作存储结构,则n个节点有n个孩子链表,叶子的孩子链表为空表,因此只要计算有多少个空表,就知道有多少个叶结点。
c孩子兄弟链表法,这种方法更简单,孩子兄弟表示法又称二叉树表示法,即遍历该树,若该树节点中孩子域firstchild为空,则为叶结点。那么只要统计有多少个节点孩子域为空。
2孩子兄弟链表表示法,遍历树的方法:
step1:先访问根节点;
step2:若根节点有孩子则访问该节点的孩子,若没有则访问兄弟域节点;
step3:以孩子节点或者兄弟节点递归调用step1
“堂”这个词语主要是指同一个宗族,同一个祠堂的人。中国人是很注重家庭观念的,在过去每一个家族都会有一个祠堂,并且也会有一本世代流传的家谱,记录着家族每个人的姓名。同一个辈分的人,他们的姓名中都会有一样的字号,但是这样做并不是因为更好起名字,而是为了体现同一个祠堂的人亲近的血缘关系。
并且,“堂”这个词在以前有正统和嫡传的意思。古代的时候是父权社会,只有男方的那一边亲戚才会称作“堂”。现代延续了古代的说法,把跟父亲有直接血缘关系的兄弟姐妹的孩子称之为自己的堂兄弟姐妹。
“表”这个词语主要指的是一些外戚,这种关系主要是通过建立婚姻建立起来的,母亲那一边的亲戚统称为”表”。跟母亲有直接血缘关系的兄弟姐妹,孩子是自己的表兄弟姐妹。在以前的观念中,“表”没有别的那么亲的。不过,现在男女平等的观念逐渐建立起来。“堂”和“表”并不是用来区分血缘关系的远近,而只是为了将父亲和母亲的亲戚进行区分。无论是堂兄弟姐妹还是表兄弟姐妹,对于自己来说都是一样的亲近。
在古代中男尊女卑的思想还是很深厚的,在很多家庭中男性都是处于主导地位,而女性只属于从属地位。女子嫁给男子之后所生的子女是要随父亲的名字的,女子的姓氏是没有延续性的,随着血脉一直延续下去的是男方一边的姓氏。
家谱里的“父系、母系”分别怎么划分?
本文2023-10-17 14:56:47发表“资讯”栏目。
本文链接:https://www.lezaizhuan.com/article/275331.html