




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、家族關系查詢系統(tǒng)1課程設計介紹1.1課程設計項目簡介家譜是一種以表譜形式,記載一個以血緣關系為主體的家族世 系繁衍和重要人物事跡的特殊圖書載體。家譜是中國特有的文化 遺產,是中華民族的三大文獻之一,屬珍貴的人文資料,對于歷 史學,民俗學,人口學,社會學和經濟學的深入研究,均有不可 替代的重要功能。本項目對家譜管理進行簡單的模擬,以實現(xiàn)查 看祖先和子孫個人信息、插入家族成員等功能。1.2課設題目分析本程序的實質是完成對家譜成員信息的建立、查找、插入等 功能??梢允紫榷x家族成員的數(shù)據結構,然后將每個功能寫成 一個函數(shù)來完成對數(shù)據的操作,最后完成主函數(shù)以驗證各個函數(shù) 功能并得出運行結果。本程序包含
2、以下幾個模塊(1)建立家族關系樹。此模塊將構建一個家族關系,對數(shù)據初始 化,構造關系樹并錄入數(shù)據一遍后續(xù)程序使用。(2)添加新成員。此模塊將添加一個新成員,實現(xiàn)對家族關系的 修改。(3)家族關系的查詢。此模塊將實現(xiàn)對家族不同關系的查詢(4)主程序模塊。此模塊實現(xiàn)整個程序的進入和進出, 以及各種 初始化處理。(5)1.3課程題目原理與數(shù)據結構因為家族的成員之間存在一個對多個的層次結構關系, 所以不 能用線性表來表示和實現(xiàn)。家譜從形狀上看像一顆倒長的樹,所 以用樹結構來表示比較合適。樹形結構是一類非常重要的非線性 數(shù)據結構,直觀看來樹是以分支關系定義的層次結構。因此本課程設計可以采用的數(shù)據結構有樹
3、狀結構和隊列。樹狀 結構采用三叉鏈表來實現(xiàn),隊列采用鏈式隊列實現(xiàn)。14家族關系查詢系統(tǒng)1.4功能分析說明圖退出系統(tǒng)按關系查找各個家庭成員添加一個家庭成員打開一個家族關系建立一個家族關系<查找成員的子孫后代查找一個成員的孩子F查找成員的堂兄弟查找一個成員的兄弟查找一個成員雙親查找成員是第幾代查找成員祖先路徑查找一個成員的祖先2分析與實現(xiàn)2.1基本數(shù)據結構和棧隊的操作2.1.1結點基本數(shù)據結構和鏈隊的定義/*家族關系樹實現(xiàn)*/#include <string.h>#include <malloc.h>#i nclude<limits.h>#i nclude
4、<stdio.h>#in clude<stdlib.h>#i nclude<io.h>#in clude<math.h>#in clude<process.h>#defi ne TRUE 1#defi ne FALSE 0#defi ne OK 1#defi ne ERROR -1#defi ne INFEASIBLE -1typedef char DataType;#defi ne MAXNUM 20typedef struct TriTNode/*樹的三叉鏈表存儲結構*/ DataType dataMAXNUM;struct Tr
5、iTNode *parent; /* 雙親 */struct T訂Node *lchild; /* 左孩子 */struct T訂Node *rchild; /* 右孩子 */TriTree;typedef struct Node/*隊列的結點結構*/TriTree *info; struct Node *n ext;Node;typedef struct/*鏈接隊列類型定義*/struct Node *front;/* 頭指針 */struct Node *rear;/* 尾指針 */Lin kQueue;DataType fnameMAXNUM,family50MAXNUM; /* 全局變
6、量*/2.1.2鏈隊的基本操作LinkQueue *LQueueCreateEmpty( )/* 建立一個空隊列 */LinkQueue *plqu=(LinkQueue *)malloc( sizeof(LinkQueue);if (plqu!=NULL)plqu->fro nt=plqu->rear=NULL;elseprintf("內存不足! n");return NULL;retur n plqu;int LQueueIsEmpty(LinkQueue *plqu)/* 判斷鏈接表示隊列是否為空隊列*/return(plqu->fro nt=NUL
7、L);void LQueueEnQueue(LinkQueue *plqu,TriTree *x)/* 進隊列 */Node *p=(Node *)malloc( sizeof(Node);if(p=NULL)prin tf("內存分配失??! n");elsep->i nfo=x;p-> next=NULL;if (plqu->front=NULL) /* 原來為空隊 */plqu->fron t=p;elseplqu->rear- >n ext=p;plqu->rear=p;int LQueueDeQueue(LinkQueue
8、*plqu,T訂ree *x)/* 出隊列 */Node *p;if (plqu->fro nt=NULL)printf("隊列空! n");return ERROR;elsep=plqu->front;x=p->i nfo;plqu->fro nt=plqu->fro nt- >n ext;free(p);return OK;TriTree *LQueueGetFront(LinkQueue *plqu) /* 在非空隊列中求隊 頭元素*/return(plqu->fro nt->i nfo);2.2建立家族關系2.2.1建
9、立家族關系并存入文件基本思想:首先輸入家族關系的名稱,以此名稱為文件 名,建立文本文件接下來按層次輸入結點信息,輸入一個在文件 中寫入一行同時將輸入的信息保存到二位字符數(shù)組family中。字符數(shù)組family是全局變量,存儲 臨時信息.注意,輸入時每個結點信息占一行,一個結點有多個兄弟,以“ 作為兄弟結束標志,結點若無孩子,直接以“ 代替。依次輸入各節(jié)點信息,以“#”作為結束標志。最后使用函數(shù)CreateT訂ree建立家族關系樹.TriTree *Create(DataType familynameMAXNUM) /* 建立家族關 系并存入文件*/int i=0;/* i控制family數(shù)組下
10、標*/DataType ch,strMAXNUM;/* ch 存儲輸入的 y或n,str存儲輸入的字符串*/TriTree *t;FILE *fp;strcpy(fname,familyname); /*以家族名為文本文件名存儲*/strcat(fname".txt");fp=fopen(fname,"r");/*以讀取方式打開文件*/if(fp)/*文件已存在*/fclose(fp);printf("%s的家族關系已存在!重新建立請按“Y直接打開請按 “Nn",familyname);ch=getchar();getchar();/
11、* 接收回車 */if(ch='N'|ch=' n')t=Open(familyname);/* 直接打開 */ return t;if(!fp|ch='Y'|ch=y')/*重新建立,執(zhí)行以下操作*/fp=fopen(fname,"w");/*以寫入方式打開文件,不存在則新建*/prin tf("請按層次輸入結點,每個結點信息占一行n"); printf("兄弟輸入結束以“ 為標志,結束標志為“ #”.");/*將成員信息存儲到字符數(shù)組中*/* family數(shù)組下標后移*/*以
12、點提示符提示繼續(xù)輸入*/*寫到文件中,每個信息占一行*/gets(str); fputs(str,fp); fputc('n',fp); strcpy(familyi,str);i+;while(strO!=#) prin tf("."); gets(str); fputs(str,fp); fputc('n',fp);strcpy(familyi,str); /*將成員信息存儲到字符數(shù)組中*/i+;/* family數(shù)組下標后移*/fclose(fp);/* 關閉文件 */t=TriTreeCreate(); /*根據family數(shù)組信息創(chuàng)
13、建三叉樹*/ printf("家族關系已成功建立!n");return t;/* 返回樹 */222建立家族關系樹基本思想:采用指針數(shù)組作為指針,保存輸入的結點地址。隊列的尾指針指向當前結點。頭指針指向當前結點的雙親結點。 輸入的結點信息已存儲在字符數(shù)組family中。將信息復制到字符串數(shù)組“ ch”中,如果"ch"不是“則 建立一個新結點。若新結點是第一個結點,則它是根結點,將其 入隊,指針tree指向這個根節(jié)點;如果不是根結點,則將當前結 點鏈接到雙親結點上,即當前結點的雙親指針就是隊頭元素,然 后將當前結點入隊列。接著判斷flag的值,如果flag
14、=O,表示 當前結點沒有左孩子,那么當前結點就是雙親的左孩子。否則, 當前結點就是雙親的右孩子。用指針root指向剛剛入隊的結點。繼續(xù)復制數(shù)組family的下個元素。如果“ ch”是則flag=0(因為“ 后面的第一個孩子為左孩子),同時判斷“ 是否是 第一次出現(xiàn),如果是第一次,則令標志 star=1 ;如果不是第一次 出現(xiàn)。則出隊列,root指向隊頭元素(實際上root總是指向雙 親結點)。繼續(xù)復制family的下一個元素。知道遇到“ #”結束。 函數(shù)返回指針tree。/*建立家族關系樹*/TriTree *TriTreeCreate() T訂ree *t,*x=NULL,*tree,*ro
15、ot=NULL;int i=0,flag=0,start=0; DataType strMAXNUM; strcpy(str,familyi);i+;while(str0!= '#')while(str0!= '')if (root=NULL)LinkQueue *q=LQueueCreateEmpty()/* 建立一個空的隊列, 存儲指向樹的指針*/*存放family數(shù)組中信息*/*復制*/* family數(shù)組下標后移*/*沒遇到結束標志繼續(xù)循環(huán)*/*沒遇到兄弟輸入結束標志繼續(xù)*/*空樹*/root=(TriTree *)malloc( sizeof(TriT
16、ree);/* 申請空間*/strcpy(root->data,str); root->pare nt=NULL;root->lchild=NULL;root->rchild=NULL;LQueueE nQueue(q,root);/*將root存入隊列*/tree=root;else/*不為空樹*/t=(TriTree *)malloc( sizeof(T訂ree); /* 申請空間 */strcpy(t->data,str);t->lchild=NULL;t->rchild=NULL;t->pare nt=LQueueGetFr on t(q
17、);/*當前結點的雙親為隊頭元素*/LQueueEnQueue(q,t);/* 入隊*/if(!flag)/* flag為,當前結點沒有左孩子*/root->lchild=t;else /* flag為,當前結點已有左孩子*/root->rchild=t;root=t;/* root指向新的結點t */flag=1;/*標記當前結點已有左孩子*/strcpy(str,familyi);i+;if(start!=0)/*標記不是第一次出現(xiàn) “ */LQueueDeQueue(q,x);/* 出隊*/if (q->fro nt!=NULL)root=LQueueGetFront(
18、q);/* root 為隊頭元素 */start=1;/*標記已出現(xiàn)過 “ */flag=0;/*“越面的結點一定為左孩子*/strcpy(str,familyi);i+;return tree;/* 返回樹 */2.3打開一個家族關系首先輸入家族關系名,以家族名為文件名打開文件,如果家 族關系不存在,返回空;如果存在,文件打開,讀取文件。將文 件的每行信息依次存儲在數(shù)組family【】中。/*打開一個家族關系*/TriTree *Ope n(DataType family nameMAXNUM)int i=O,j=O;DataType ch;FILE *fp;TriTree *t;strcp
19、y(fname,familyname); /*以家族名為文本文件名存儲*/ strcat(fname".txt");fp=fopen(fname,"r");/*以讀取方式打開文件*/if(fp=NULL)/* 文件不存在 */printf("%s 的家族關系不存在! n",familyname);return NULL;elsech=fgetc(fp); while(ch!=EOF) if(ch!='n') familyij=ch;組中*/j+;else/*按字符讀取文件*/*讀到文件尾結束*/* ch不為一個結點信息
20、的結尾*/*將文件信息存儲到family數(shù)家族關系查詢系統(tǒng)familyij= '0'/* 字符串結束標志 */i+;/* family數(shù)組行下標后移*/j=0;/* family數(shù)組列下標歸零*/ ch=fgetc(fp);/*繼續(xù)讀取文件信息*/fclose(fp);/* 關閉文件 */t=TriTreeCreate(family); /*調用函數(shù)建立三叉鏈表*/ printf("家族關系已成功打開!n");return t;2.4在家族關系中查找一個成員是否存在用遞歸算法實現(xiàn)。如果樹空,返回NULL如果根節(jié)點就是要查找的成員,返回根節(jié)點;否則,遞歸查找它
21、的左右子樹。/*查找一個成員是否存在*/TriTree *Search(T 訂ree *t,DataType str)TriTree *temp;if(t=NULL)/*如果樹空則返回NULL */return NULL;elseif(strcmp(t->data,str)=0) /* 如果找到返回該成員指針 */ return t;else/*如果沒找到遍歷左右子樹進行查找*/temp=Search(t->lchild,str); /* 遞歸查找 */ if(temp)/*結點不空則查找*/return(Search(t->lchild,str);elsereturn(Se
22、arch(t->rchild,str);2.5向家族中添加一個新成員基本思想:添加的新成員要根據其雙親確定其在家族中的位 置。首先判斷該雙親是否在此家族關系中,若存在則查找其雙 親,將新結點插入其雙親的最后一個孩子之后;若沒有孩子,則 直接作為左孩子插入。以寫入的方式打開文件,如果成功打開, 則更新family數(shù)組中的信息,并查找新成員的雙親所在位置和其 對應的“ 個數(shù),如果“ 個數(shù)小于雙親位置,則添加“ 實質相等,新成員不插入到最后“ 之前。最后將family數(shù)組 中信息寫入文件保存,關閉文件。/*添加一個新成員*/void Appe nd(TriTree *t)int i=0,j,p
23、arpos=1,curpos ,nu m,e nd=0,co un t=-1;DataType chiMAXNUM,parMAXNUM; /* 存儲輸入的孩子 和其雙親結點*/TriTree *tpar,*temp;FILE *fp;printf("請輸入要添加的成員和其父親,以回車分隔!n.");gets(chi);printf(". ");/*以點提示符提示繼續(xù)輸入*/gets(par);tpar=Search(t,par); /*查找雙親結點是否存在*/if(!tpar)printf("%s該成員不存在!n");else/*存在
24、則添加其孩子*/temp=(T訂ree *)malloc( sizeof(T訂ree);/* 申請空間 */temp->pare nt=tpar; strcpy(temp->data,chi); temp->lchild=NULL;/*新結點左右孩子置空*/temp->rchild=NULL; if(tpar->lchild)/*成員存在左孩子*/37/*當前結點右孩子存在*/*繼續(xù)遍歷右孩子*/*將新結點添tpar=tpar->lchild; /*遍歷當前成員左孩子的右子樹*/while(tpar->rchild) tpar=tpar->rch
25、ild;tpar->rchild=temp;加到所有孩子之后*/*沒有孩子則直接添加*/elsetpar->lchild=temp;/*以寫入方式打開文件*/fp=fope n( fname,"w");if(fp)while(strcmp(par,familyi)!=O&&familyi0!='#')if(familyiO!=)/*查找雙親在數(shù)組中位置*/parpos+;i+;/* parpos 計數(shù) */* family數(shù)組行下標后移*/i=0;while(familyi0!=/* family數(shù)組行下標歸*/'#
26、9;)if(familyi0= '')數(shù),第一個不計*/coun t+;if (count=parpos)其前一個“之前為par的孩子*/curpos=i;i+;if (countvparpos)num=parpos-co unt; for(j=i;j<=i+nu m;j+)/*查找“ 的個/* count累加個數(shù)*/*說明此“ t/* curpos計當前位置*/* family數(shù)組行下標后移*/*“ (數(shù)小于 parpos數(shù) */*添加“ 個數(shù)為num */ /*從數(shù)組末尾添加“ */strcpy(familyj, "0");strcpy(famil
27、yi+num+1, "#0");/*“移到數(shù)組末尾*/strcpy(familyi+num-1,chi);/* 在最后一個 “ /* end為時標記已添加*/前添加新成員*/end=1; else for(j=i;j>=curpos;j-)/* 當前位置到數(shù)組最后的全部信息后移一行*/strcpy(familyj+1,familyj); strcpy(familycurpos,chi); /* 將新結點存儲到 “的前一行*/if(end=1)/*若enc為,則數(shù)組末尾下標后移num位*/i=i+num;for(j=0;j<=i+1;j+)/*將數(shù)組所有信息寫入文
28、件*/fputs(familyj,fp);fputc('n',fp);/* 一個信息存一行 */ fclose(fp);/* 關閉文件 */prin tf("添加新成員成功!n");elseprin tf("添加新成員失敗!n");2.6家族成員關系的相關查詢2.6.1查找一個家族的鼻祖判斷輸入的姓名是否在該家族中存在,如果存在,則返回 該家族的根節(jié)點信息。/*查找一個家族的祖先*/void Ancesstor(TriTree *t)/* 返回樹的根結點信息 */printf("該家族的祖先為 sn",t->da
29、ta);262查找一個成員的所有祖先路徑查找一個成員的所有祖先路徑,需要從它的雙親一直向上查 找到根結點。基本思想:對與結點t,先判斷它是否是根結點(根節(jié)點的雙親是 NULL,如果是根結點,直接輸出它本身;如果不是,查找它的 雙親指針指向的結點,將雙親信息輸出。繼續(xù)查找,直到找到根 結點。/*查找一個成員的所有祖先*/void An cesstorPath(TriTree *t)if(t->parent=NULL) /*若該成員為祖先,則直接輸出*/printf("%s 無祖先! n",t->data);else/*否則繼續(xù)查找祖先*/printf("
30、%s 所有祖先路徑:%s",t->data,t->data);while(t->parent!=NULL) /*若當前成員的雙親不是祖先, 則繼續(xù)查找*/printf(" -> %s",t->parent->data); /* 訪問當前成員的 雙親*/t=t->parent;/*繼續(xù)循環(huán)查找*/prin tf("n");2.6.3查找一個成員的雙親基本思想:先判斷結點t是否是根結點,過不是根結點,直接輸出該結點雙親指針的結點信息;若是根結點,輸出提示信 息,結點無雙親。/*查找一個成員的雙親*/void
31、 Pare nt(TriTree *t)if(t->parent!=NULL)/*若該成員為祖先,則無雙親*/printf("%s 的雙親為 sn",t->data,t->parent->data);elseprintf("%s 無雙親! n",t->data);264確定一個成員是第幾代確定一個成員是第幾代,只要知道從它本身到根結點包括的 祖先個數(shù)就可。因而對于跟結點t,從它本身開始一直向上查找 到根結點,查找的過程中用變量count (初值為1)計數(shù),最后輸 出 count。/*確定一個成員是第幾代*/ void Gen
32、eration(TriTree *t)int count=1;/* 計數(shù) */DataType strMAXNUM;strcpy(str,t->data);/* 存儲當前信息 */while (t->parent!=NULL) /* 查找其雙親 */ count+;/*累加計數(shù)*/ t=t->pare nt;printf( "%s 是第%d 代! n" ,str,count);2.6.5查找一個成員的兄弟一個成員的為其雙親除了該成員以外的所有孩子?;舅枷耄簩τ诮Y點t,先判斷它是否是跟結點,若是根 結點,則無兄弟;若不是根結點,則找到結點t的雙親。接著判
33、斷雙親的左孩子和左孩子的兄弟是否都存在(若只有左孩子,左 孩子就是要查找的這個成員),如果都不存在,則無兄弟;如果 都存在,對雙親的左孩子操作。若左孩子不是要查找的這個成 員,貝U將結點信息輸出。接下來查找左孩子的右兄弟,判斷當前 結點是否是要查找的這個成員,若不是,則將結點信息輸出,繼 續(xù)查找當前結點的右兄弟,直到NUL為止。/*查找一個成員的兄弟*/void Brothers(TriTree 氣DataType str) /* 查找兄弟 */if(t->parent!=NULL)/*若該結點是祖先,則無兄弟*/t=t->parent;/*該結點的兄弟即為其雙親除該成員以外的所有
34、孩子*/if(t->lchild&&t->lchild->rchild) /* 當前結點的左孩子及其右孩子都存在*/prin tf( "%s的所有兄弟有:",str);t=t->lchild;while(t)/*遍歷當前成員左孩子的右子樹*/if(strcmp(t->data,str)!=O) /* 遍歷右子樹,選擇 輸出*/printf("%s ",t->data); /* 訪問當前結點 */ t=t->rchild;prin tf( "n");elseprintf(&quo
35、t;%s 無兄弟! n",str);elseprintf("%s 無兄弟! n",str);266查找一個成員的堂兄弟一個成員的堂兄弟為其雙親的雙親結點的所有孩子的孩 子(該成員除外).基本思想:如果結點t的雙親和雙親的雙親(爺爺)都存在, 首先考慮爺爺?shù)淖蠛⒆?。如果爺爺?shù)淖蠛⒆硬皇墙Y點t的雙親,那么爺爺還有其他孩子。現(xiàn)對爺爺?shù)淖蠛⒆拥淖蠛⒆釉L問,如果 不是結點t就輸出。同樣,對爺爺左孩子的左孩子的右孩子、右 孩子的右孩子一直訪問下去,直到無右孩子為止。如果爺爺還有 其他孩子,那么就對爺爺?shù)淖蠛⒆拥挠液⒆?、爺爺?shù)淖蠛⒆拥挠?孩子的右孩子-即對爺爺?shù)钠渌⒆幼鱿嗤?/p>
36、處理。/*查找一個成員的堂兄弟*/void Consin( TriTree *t)int flag=O;TriTree *ch=t;TriTree *temp;if(t->parent&&t->parent->parent)/* 當前結點的雙親及其雙親 都存在*/t=t->parent->parent->lchild;/*當前結點等于其祖先的第 一個孩子*/while(t)/*存在則繼續(xù)查找*/if (strcmp(t->data,ch->parent->data)!=O)* 不是同一結 點*/if(t->lchild
37、)/*當前結點存在左孩子*/temp=t->lchild;while(temp)/* 遍歷當前結點左孩子的右子樹*/if (strcmp(temp->data,ch->data)!=O)if(!flag)/* 第一次輸入時先輸出下句*/printf("%s的所有堂兄弟有: ",ch->data);printf( "%s ",temp->data)/* 訪問當前成員*/flag=1;遍歷右孩子*/temp=temp->rchild;/*繼續(xù)t=t->rchild;/*繼續(xù)遍歷右孩子*/prin tf("n
38、");if(!flag)/*標志沒有輸出結點*/printf("%s 無堂兄弟! n",ch->data);267查找一個成員的所有孩子一個成員的所有孩子包括左孩子和左孩子的右孩子、左孩子 的右孩子的右孩子-直到右孩子為空為止?;舅枷耄菏紫扰袛嘟Y點t是否有左孩子,如果沒有,輸出 沒有孩子;如果有左孩子,輸出左孩子的信息,然后判斷左孩子 的右孩子是否為空,若不為空(存在右孩子),輸出左孩子的右 孩子的信息,接著循環(huán)判斷結點是否有右孩子,有就輸出,直到 右孩子為空。/*查找一個成員的所有孩子*/void Children(TriTree *t)/* 遍歷左孩子
39、 */if(t->lchild)/*當前結點存在左孩子*/printf("%s 的所有孩子有:",t->data);t=t->lchild;/*遍歷當前成員左孩子的右子樹*/while(t)/* 不空 */printf("%s ",t->data);/* 訪問當前成員 */t=t->rchild;prin tf("n");elseprintf("%s 無孩子! n",t->data);/*中序遍歷一棵樹*/void In Order(TriTree *t)if(t)/*二叉樹存在
40、*/InOrder(t->lchild);/* 中序遍歷左子樹 */printf("%s ",t->data);/* 訪問成員 */InOrder(t->rchild);/* 中序遍歷右子樹 */268查找一個成員的子孫后代一個成員的子孫后代就是其左子樹上的所有結點,所以對 其左子樹進行中序遍歷即可。/*查找一個成員的子孫后代*/void Descendants(T訂ree *t)/* 遍歷左孩子 */if(t->lchild)/*當前結點存在左孩子*/printf("%s的所有子孫后代有:",t->data);InOrde
41、r(t->lchild); /*中序遍歷當前結點的左右子樹*/ prin tf("n");elseprintf("%s 無后代! n",t->data);2.7各軟件之間的調用方式該軟件各個模塊的調用主要是通過聲明函數(shù),和定義函數(shù)再通過主函數(shù)調用實現(xiàn)的 主函數(shù):/*主控函數(shù)*/ int main (i nt argc,char* argv)DataType strMAXNUM= "0",i nput40; int i,j,flag,start=0,pos,tag1,tag2;T訂ree *temp,*tree=NULL;w
42、hile(1)prin tf( "t歡迎使用家族關系查詢系統(tǒng)!n");prin tf( "t請輸入與之匹配的函數(shù)和參數(shù),如 pare nt(C)n");prin tf("t 1.新建一個家庭關系: 參數(shù)為字符串n");prin tf("t 2.打開一個家庭關系: 參數(shù)為字符串n");prin tf("t 3.添加新成員的信息: 無參數(shù)n");prin tf( "t 4.查找一個成員的祖先: 參數(shù)為字符串n");prin tf( "t 5.查找一個成員的祖先路徑: A
43、ncesstorPath(name)參數(shù)為字符串 n");prin tf("t 6.確定一個成員是第幾代: 參數(shù)為字符串n");prin tf( "t 7.查找一個成員的雙親:參數(shù)為字符串n");prin tf( "t 8.查找一個成員的兄弟:參數(shù)為字符串n");prin tf( "t 9.查找一個成員的堂兄弟: 參數(shù)為字符串n");prin tf("t10.查找一個成員的孩子:參數(shù)為字符串n");prin tf( "t11.查找一個成員的子孫后代: 參數(shù)為字符串n"
44、;);prin tf("t12.退出系統(tǒng):Create(famil yn ame)Ope n( famil yn ame)Appe nd()An cesstor( name)Gen erati on(n ame)Pare nt(n ame)Brothers( name)Consin(n ame)Childre n(n ame)Desce ndan ts( name)Exit()無參數(shù)n?");gets(i nput);/* in put數(shù)組存放輸入的函數(shù)和參數(shù)*/j=0,tag1=0,tag2=0;for(i=0;i<strle n(i nput);i+) /* 循環(huán)
45、 in put 數(shù)組 */if (i nputi= '(')pos=i; tag1=1;if(i nputi+1= ')') tag2=1;if (tag1=1 &&tag2!=1)參數(shù)*/*左括號之前為函數(shù)名*/* pos標記左括號位置*/*標記是否匹配到左括號*/*若下一個字符不為右括號*/*標記為*/*左括號和右括號之前為strj=tolower(inputi+1); /* 將參數(shù)存放到 str數(shù)組 */j+;/*并轉化為小寫字母*/inputi=tolower(inputi);/* 將函數(shù)名轉化為小寫字母*/if(!tag1) /*若沒匹
46、配到左括號,說明只有函數(shù)無參數(shù) */pos=i; /*標記為數(shù)組末尾*/inputpos= '0'/*將標記位置為字符串結束*/ strj= '0'if (strcmp(input,"create0')=0)/* 函數(shù)名匹配 */ flag=1;/* 用 flag 標記 */else if (strcmp(input,"open0")=0)flag=2;else if (strcmp(input,"append0")=0) flag=3;elseif(strcmp(i nput,"a ncess
47、tor0")=0) flag=4;elseif(strcmp(i nput,"a ncesstorpath0')=0) flag=5;else if (strcmp(input,"parent0")=0)flag=6;elseif(strcmp(i nput,"ge neratio n0")=0)flag=7;elseif(strcmp(i nput,"brothers0")=0)flag=8;elseif(strcmp(i nput,"co nsi n0")=0)flag=9;else
48、if(strcmp(i nput,"childre n0" )=0)flag=10;elseif(strcmp(i nput,"desce ndan ts0"=0)flag=11;else if (strcmp(input,"exit0" )=0)flag=12;else/*無匹配則重新輸入*/printf("無匹配的函數(shù),請重新輸入!n");con ti nue;if (!(flag=1|flag=2|flag=12)&&start=0) /*如果第一次輸入函數(shù)不是建立、打開或退出,則重 新輸入*
49、/prin tf("請先建立或打開一個家族關系!n");con ti nue;start=1;/*標記不是第一次輸入input */if(flag>=4&&flag<=11) /*函數(shù)需要字符串型參數(shù)name */ temp=Search(tree,str)*若存在則返回結點*/ if(!temp)/*若不存在則返回*/printf("該成員不存在!n");con ti nue;switch(flag)/*根據flag標記調用函數(shù)*/casel:tree=Create(str);break;case2:tree=Ope n(
50、str); break;case3:Appe nd(tree); break;case4:An cesstor(tree); break;case5:An cesstorPath(temp); break;case6:Pare nt(temp); break;case7:Gen erati on (temp); break;case8:Brothers(temp,str); break;case9:Consin (temp); break;case10:Childre n(temp); break;case11:Desce ndan ts(temp); break;case12:exit(OK);return 0;3調試結果調試運行后,顯示主界面-t-Lr.f.t.fl潔.i.sJ_-iJ4 5 6789 0 12徑: :代 :路代:弟:后 先先幾親弟凡子孫 系心雙兄堂孩子 關關倩的的m疋的的的的的 蚤杏域成廉威應慮應, AT.tATtTtTAT.t 一一新一一一 一一一 一一系parent (C)Create<fanilynane> Open(fd
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合股開餐廳合同范本
- 衛(wèi)生清潔合同范本
- 勞務派遣合同范本2003
- 個人供貨客戶合同范本
- 合股認購合同范本
- 合伙協(xié)議書范本合同范本
- 叉車工聘用合同范本
- 員工合同范例送水
- 傳單兼職人員合同范本
- 劇組財務合同范本
- 入托入學兒童預防接種證查驗接種證工作課件
- 《犀牛軟件基礎教程》課件
- 【村級財務管理問題探究國內外探究綜述3300字】
- 智慧城市新篇章2024年智慧城市發(fā)展機遇展望
- 工程分包商履約情況與進度關聯(lián)分析
- 培訓業(yè)務的競爭對手分析與對策
- 供應商QSA-QPA評鑒表
- 安全生產個臺賬內容
- 建設工程項目-月度安全檢查表
- 硬件設計的模塊化
- 貴州教育大講堂《科技教育之美“中國天眼”的前世今生》觀后感11篇
評論
0/150
提交評論