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]!='