當前位置:首頁 » 編程語言 » 家譜管理程序c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

家譜管理程序c語言

發布時間: 2023-04-11 21:12:50

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);
}

Ⅱ c語言編寫家譜

c語言編寫家譜搞定了沒 我粗線了

Ⅲ 家譜管理系統設計與實現。編制一個家譜資料管理軟體,實現對一個家族所有的資料進行收集整理。

這玩意都到網路來,來錯地方了,去專門代編程序設計網站吧,花點錢,會讓你很滿意的,不捨得花錢的話,就去網路貼吧吧,那裡人多

Ⅳ 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]!='';i++){
if(a[i]=='')
n++;
else
break;
}
returnn;
}

charfam[200][20];
intnum[200]={0};

intsearch(chara[],intn){
inti=1;
while(1){
if(!strcmp(a,fam[i]))
returni;
i++;
}
return0;
}

intsearch1(intn,intx){
inti=1;
while(i<x){
if(num[i]==n)
returni;
i++;
}
return0;
}

charname[1000],word[1000],n1[100],n2[100],d[100];
intmain(){
intn,m,i,j,a,b,t,x,k,h;
while(scanf("%d%d",&n,&m)!=EOF){
memset(fam,'',sizeof(fam));
memset(num,'',sizeof(num));
scanf("%s",fam[1]);
getchar();
a=b=2;
t=1;
num[1]=1;
for(i=2;i<=n;i++){
memset(name,'',sizeof(name));
gets(name);
b=kong(name);
if(b>a){
if(fam[search1(t*2+1,i)][0]!='')
t=t*2+1;
else
t=t*2;
}
else{if(b<a){
h=(a-b)/2;
while(h>=1){
t=t/2;
h--;
}
}}
if(fam[search1(t*2,i)][0]!='')
x=t*2+1;
elsex=t*2;
num[i]=x;
for(j=b;name[j]!='';j++)
fam[i][j-b]=name[j];
a=b;
}
for(i=0;i<m;i++){
gets(word);
k=0;h=0;
memset(n1,'',sizeof(n1));
memset(n2,'',sizeof(n2));
memset(d,'',sizeof(d));
for(j=0;word[j]!='';j++){
if(word[j]==''){
k++;
h=0;
continue;
}
if(k==0)
n1[j]=word[j];
if(k==5){
n2[h]=word[j];
h++;
}
if(k==3){
d[h]=word[j];
h++;
}
}
if(!strcmp(d,w[0])){
a=search(n1,n);a=num[a];
b=search(n2,n);b=num[b];
if(a==b*2||a==(b*2+1))
printf("True ");
elseprintf("False ");
continue;
}
if(!strcmp(d,w[1])){
a=search(n1,n);a=num[a];
b=search(n2,n);b=num[b];
if(b==a*2||b==(a*2+1))
printf("True ");
elseprintf("False ");
continue;
}
if(!strcmp(d,w[2])){
a=search(n1,n);a=num[a];
b=search(n2,n);b=num[b];
if((a==b+1&&a==b/2*2+1)||(a==b-1&&b==a/2*2+1))
printf("True ");
elseprintf("False ");
continue;
}
if(!strcmp(d,w[3])){
a=search(n1,n);a=num[a];
b=search(n2,n);b=num[b];
while(a>0){
a=a/2;
if(a==b){
printf("True ");
break;
}
if(a==0)
printf("False ");
}
continue;
}
if(!strcmp(d,w[4])){
a=search(n1,n);a=num[a];
b=search(n2,n);b=num[b];
while(b>0){
b=b/2;
if(a==b){
printf("True ");
break;
}
if(b==0)
printf("False ");
}
continue;
}
}
}
return0;
}

聽說回答的夠長能夠自動採納

Ⅳ C語言家譜如何分層輸出

C語言家譜分層輸出代碼如下:
*/
#include
#include
#include
#include
#include"map.h"
#defineMAXN100
#defineMAXMEM100
#defineElemtypechar
//
//樹
typedefstructBiTNode
{undefined
intmark;//標記
intlevel;
charname[50];//姓名
charbirthday[50];//生日
charaddress[MAXN];//住址
boolmarriage;//婚否(true表示結婚,false表示沒結婚)
boollive;//建在(true表示活著,false表示過世)
boolsex;//性別(true表示男,false表示女)
charlivemassage[50];//死亡日期(如果其已經死亡)
Elemtypedata;//
structBiTNode*lc,*rc;
}BiTNode,*BiTree;
//
//樹的相關操作
charnametemp[50];//姓名
charbirthdaytemp[50];//生日
charaddresstemp[MAXN];//住址
boolmarriagetemp;//婚否(true表示結婚,false表示沒結婚)
boollivetemp;//建在(true表示或者,false表示過世)
boolsextemp;
charlivemassagetemp[MAXN];//死亡日期(如果其已經死亡)
charch;//額外使用
intleveltemp;//人的代數
intNth;//顯示第n代人時要用
charsearchdata[50];
charsearchname[50];
intcount;//計數
intchoice;//各種選擇
intuse;
BiTreetemp;
structBiTNodeList
{undefined
BiTreedata;
BiTNodeList*next;
};
BiTNodeList*Li
st;
voidCreatBiTree(BiTree&T,FILE*in)//建立雙鏈二叉樹
{undefined
fscanf(in,"%c",&ch);
//printf("%c ",ch);
if(ch=='@')
層,意為①重疊起來的東西;重疊起來的東西中的一部分:層次|表層|大氣層。②重疊;重復:層巒疊嶂|層出不窮。③量詞,用於可以分出層次的事物:三層樓|兩層意思|擦掉一層灰。
家譜:又稱族譜、宗譜等。是一種以表譜形式,記載一個家族的世系繁衍及重要人物事跡的書。家譜是一種特殊的文獻,就其內容而言,是中華文明史中具有平民特色的文獻,記載的是同宗共祖血緣集團世系人物和事跡等方面情況的歷史圖籍。據研究表明,中華古姓來源於圖騰崇拜,系氏族徽號或標志。