1. c语言的家谱图。。想求一个运用结构链表的源程序
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
struct BiNode{
//用结构体定义结点类型。
//数据域信息包含家谱中该对的男、女名字,其双亲名字,以及这对夫妇位于家谱中的辈分
//指针域指向他们的第一个孩子以及其他兄弟
char man[10],woman[10],father[10],mother[10];
int level;
struct BiNode *firstchild,*nextsibling;
};
struct SqStack{
//对栈类型进行定义
BiNode *base;
BiNode *top;
int stacksize;
};
//函数声明
Status InitStack (SqStack &S);
Status Push (SqStack &S,BiNode e);
Status CreateBiTree(BiNode *s);
Status Pop(SqStack &S,BiNode e);
Status EmptyStack(SqStack &S);
Status Preorder(BiNode *T,char name[10],BiNode *p);
//Status CreateParent(BiNode *s);
void findchildren(BiNode *p);
void putoutchildren(BiNode *q,int n);
void findparents(BiNode *p);
void levelhome(BiNode *T);
void leveling(SqStack S1,SqStack S2,int n);
void print(BiNode *p);
//主函数
void main()
{
BiNode *home=NULL,*p=NULL;
char name[10];
printf("请按先序遍历的顺序根据提示输入家谱信息,不存在则输入“#”\n");
CreateBiTree(home);
printf("层次化的家谱信息为\n");
levelhome(home);
printf("请输入要查找的人的名字");
gets(name);
Preorder(home,name,p);
if(!p)printf("家谱中无此人");
else{
printf("辈分:%d\n",p->level);
printf("孩子信息");
findchildren(p);
printf("父母信息:");
findparents(p);
}
}
//函数定义
Status InitStack (SqStack &S){
//初始化函数
S.base=(BiNode*)malloc(STACK_INIT_SIZE * sizeof(BiNode));
if(!S.base) return ERROR;
S.top=S.base;
S.stacksize =STACK_INIT_SIZE;
return OK;
}
Status Push (SqStack &S,BiNode e){
//将e结点推入栈,作为栈顶元素
if(S.top-S.base >=S.stacksize ){
S.base=(BiNode *)realloc(S.base ,(S.stacksize +STACKINCREMENT)*sizeof(BiNode));
if(!S.base ) return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,BiNode e){
//取出栈顶元素
if(S.base==S.top) return ERROR;
e=*--S.top;
return OK;
}
Status EmptyStack(SqStack &S){
//若栈空,则返回0
return (S.top == NULL);
}
Status CreateBiTree(BiNode *root){
//创建家谱二叉树
char man1[10],woman1[10],father[10],mother[10];
printf("man:");//男方名字,不存在则输入“#”
gets(man1);
printf("woman:");//女方名字,不存在则输入“#”
gets(man1);
if(strcmp(man1,"#")==0&&strcmp(woman1,"#")==0)//若该结点男女都不存在,则说明该结点为空,即该子树的根结点不存在
{
root=NULL;
}
else{
root=(BiNode *)malloc(sizeof(BiNode));
strcpy(root->man,man1); //将男女的名字赋给该结点的数据域
strcpy(root->woman,woman1);
printf("father:"); //输入该结点的双亲名字
gets(father);
printf("mother:");
gets(mother);
CreateBiTree(root->firstchild); //递归创建该结点的左、右子树
CreateBiTree(root->nextsibling);
root->level=0;//将改结点的层数暂时定义为0
}
return OK;
}
Status Preorder(BiNode *T,char name[10],BiNode *p){
//先序遍历家谱树,查找与name名字相同的结点位置
if(T){
if(strcmp(T->man,name)==0||strcmp(T->woman,name)==0){
p=T;
return OK;
}
else{
if(Preorder(T->firstchild,name,p))return OK;
else return(Preorder(T->nextsibling,name,p));
}
}
else return ERROR;
}
void findchildren(BiNode *p){
//查找所得名字的孩子信息,输出他们的名字,若无孩子,则输出无孩子
int n=1;
BiNode *q;
if(p->firstchild){//该结点的firstchild指针指向的为他的第一个孩子
q=p->firstchild;
putoutchildren(q,n);//输出
}
while(q->nextsibling){
//第一个孩子的nextsibling指针指向的为孩子的兄弟,即第二个孩子
//如此继续,知道结点的右指针为空
q=q->nextsibling;
putoutchildren(q,n);//输出
}
if(n==1)printf("无孩子");
}
void putoutchildren(BiNode *q,int n){
//输出其孩子的结点的信息,并把孩子数加一
printf("第%d个孩子,男方名字%s,女方名字%s\n",n++,q->man,q->woman);
}
void findparents(BiNode *s){
//查询该结点的双亲名字
if(s->father=="#"&&s->mother=="#")
printf("没有父母信息");
else{
if((s->father)!="#")printf("father:%s\n",s->father);
if((s->mother)!="#")printf("mother:%s\n",s->mother);
}
}
void levelhome(BiNode *T){
//按层输出该家谱
SqStack S,N; //定义两个栈并初始化
InitStack(S);
InitStack(N);
BiNode *p;
p=T;
int n=1;
printf("第%d层的信息为:\n");
if(p){
print(p);
p->level=n;//修改p所指向的结点的辈分信息
Push(S,*p);//将该结点推进栈S
}
while(p=p->nextsibling){
//用循环来查找该层的所有信息,只要其nextsibling指向的结点不空,均为同一层
print(p);
p->level=n;
Push(S,*p);
}
while(!EmptyStack(S)||!EmptyStack(N)){
//循环,知道栈S和N都为空,说明按辈分遍历完成
leveling(S,N,n++);
leveling(N,S,n++);
}
printf("\n");
}
void leveling(SqStack S1,SqStack S2,int n){
//将S1栈保存的信息一一取出,查找他孩子的结点,输出其名字,并推入栈S2.
//即S2栈保存的结点是S1的下一辈
BiNode *p,*q;
printf("第%d层的信息为:\n");
while(!EmptyStack(S1)){
Pop(S1,*p);
q=p->firstchild;
if(q){
print(q);
q->level=n;
Push(S2,*q);
while(q=q->nextsibling){
print(q);
q->level=n;
Push(S2,*q);
}
}
}
}
void print(BiNode *p){
//输出该结点处的夫妇名字
printf("%s,%s\\",p->man,p->woman);
}
2. 如何编写《家谱》
我印象里记得我们家族的家谱
第一本 前面几页是编撰人对家族的期望 一般写一些 什么愿赵氏(鄙人姓赵)腾飞什么玩意的 想不起来了 其实就是尊重编撰人 不让他们白忙活(也给工资我爷爷也参加了 编撰 我还去了几次呢) 然后后面就是我们家族的族规 然后后面就是 我们家族怎么来到现在居住的地方的 为什么来 。然后我们是第几代编撰的一类话 还有编撰家谱谁捐款了 等等然后就是目录了 。当然 第一本是写不完的 以此类推
然后后面就是目录 然后就是我们老祖宗的一个表一张纸 一个枝干表 谁是谁的儿子 谁是第几代 那个祖宗和那个祖宗是什么关系 全是枝干表
然后就开始再往后排下一代人的姓名 再下一代 再下一代 家住哪里辈分等等写的清清楚楚 。。。一直写到现在的(我是第19代 我们家谱共26本 我的名字在第17本)
然后 最后几本写的是我们家族的名人 我记得看到有个是中了 举人的还是状元啥玩意 的人把他写过的文章和诗(说实话 写的不怎么样)都写在族谱上了 反正是只要是名人全写 最后的实在是想不起来了 (还有3本吧 写的什么不记得了 ,,,这都是 一年前看过的了。。我那时候刚刚复员 回家没事帮着抄去了,,)
3. 求指导家谱用啥软件制作,流程
以word 2007为例,方法如下:
1、依次单击“插入”、插图框中的“SmartArt”,在出现的对话框中选择“层次结构”、在右边出现的“组织结构图”中选中竖排或横排的结构图例,双击出现的“文本”,填写家谱姓氏辈份等信息。
2、家族人丁兴旺的可以在不同的辈份(行或列)添加多个文本,具体方法是点击想要添加位置附近文本框,在菜单栏中点击“添加形状”,在子菜单中选择在后、前、上、下添加即可。
4. 家谱怎么做
1、电脑打开Word文档。
家谱的作用:
家谱是一个巨大的资料宝库,可供从事社会学、历史学、考古学、经济学、民俗学、人口学、民族学、文学、政治学、宗教学、法学、姓氏学的研究人员从中查询资料,寻找依据,进行研究。家谱的作用主要有:
1、宗法思想研究资料。家谱和宗法的关系从一开始就密不可分。宗法制度是封建王朝维护其统治的重要基础之一,而家谱的族规、族约、家法、乡约等,正是加强宗法制度的有力工具。
2、家庭道德研究资料。族规、家规中保留了许多对我们当代极为有益的东西,如孝父母、和夫妇、勉讳书、尚节俭、戒赌博、戒淫秽、戒懒惰、戒奢侈等,对我们建设现代家庭道德和精神文明都有很好看借鉴意义。
3、家族制度研究资料。家族制度是利用血缘关系统治族人的社会制度。在许多家谱中都有家族制度的极为详细的资料,如家族的组织系统、家族的财产管理、家族的赈济方法等,为我们研究家族在古代社会中的地位、作用、组织形式、管理方法等提供了丰富的资料。
4、经济史资料。家谱中保存有相当数量的经济史资料,这些资料包括家族的集体田产如祠田、坟田、庄田、山林等的数量、形成、经营、管理、收支情况等。有的家谱还记录了家庭成员经商、贸易的事迹。这都为我们研究古代经济史提供了很好的素材。
5、人口问题资料。家谱的中心部分是家族人口的世系传承,在家谱的“房派图”、“支派分布图”、“迁徙图”、“先世考”、“世系图”以及家谱的一些序跋中,记录了家族人口的数量、迁徙、分布、婚姻状况等资料,可提供人口学研究者使用。
6、历史人物传记。家谱是世系的记录,许多家谱中既有简单的世系,又有十分详细的传记、行状、墓志、年谱等,对研究历史人物及其家世大有帮助。
5. C语言 家谱问题
#include<stdio.h>
#include<string.h>
charw[5][20]={{"child"},{"parent"},{"sibling"},{"descendant"},{"ancestor"}};
intkong(chara[]){
intn=0,i;
for(i=0;a[i]!='