资源描述:
《数据结构大作业--家谱》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、课程设计6家谱基本要求:从文件中读入家庭成员建立家谱,以孩子兄弟表示法存储。基本功能:(1)在家谱中添加新成员,并追加到文件中。(2)输出指定家庭的所有成员。(3)确定指定成员在家族中的辈份(第几代)。(4)输出指定辈的所有成员。文件输入样本:(也可以是英文名字)吴义昌(吴本宜、吴本质、吴本身)吴本宜(吴正民、吴正权)吴正民(吴鲲、吴鹏)吴正权(吴德峰)吴本质(吴正跃)吴正跃(吴德红、吴德龙)吴本身(吴正亮、吴正党)吴正亮(吴昊、吴昱)实验源程序:#include#include#include#include<
2、ctype.h>#defineNAME_length50//名字最大长度#defineLINE_length100//文本行最大长度typedefstructcc{structcc*child,*next;//next指向同辈份的人物charName[];}JPNode;voidclear(charp[],intn)//清空字符数组p{while(n-->0)*p++=' ';}staticJPNode*last=NULL;staticintlast_level=0;voidAddJP(JPNode**head,charconstname[],intlevel){JP
3、Node**s=head,*r=NULL;JPNode*p=(JPNode*)malloc(2*sizeof(void*)+strlen(name)+1);p->child=p->next=NULL;strcpy(p->Name,name);if(*s==NULL){*s=p;last=p;return;}if(level-last_level==1){last->child=p;last=p;last_level=level;return;}if((level==last_level)&&(*s!=NULL)){last->next=p;last=p;last_lev
4、el=level;return;}r=*s;//r指向家谱树last_level=level;while(level-->0)//找到相同的辈分{while(r->next!=NULL)r=r->next;r=r->child;}//以兄弟连接while(r->next!=NULL)r=r->next;r->next=p;last=p;}voidCreatJP(JPNode**head){charname[NAME_length]="",line[LINE_length]="";char*p=NULL;intlevel=0,i=0;//辈分,以制表符个数表示FILE*f
5、p=NULL;fp=fopen("jiapu_data.txt","r");if(fp==NULL){printf("openerror!");exit(1);}while(level=0,i=0,fgets(line,LINE_length,fp)!=NULL){p=line;while(*p++=='t')level++;//计算辈分,计算完后p指向名字开始处while(line[i++]!='');line[i-1]=' ';//读入的换行符用字符串结束标识符替换strcpy(name,p-1);AddJP(head,name,level);clear
6、(name,NAME_length);clear(line,LINE_length);}fclose(fp);}voidDispJP(JPNode*p)//从p指向的结点显示该家族{staticintlevel=0;inti;if(p!=NULL){for(i=0;iName);}elsereturn;level++;DispJP(p->child);level--;DispJP(p->next);}////////////////////////////////////////////
7、////////////////////////////////*在家谱中添加新成员,并追加到文件中*/intEqual(charconst*p,charconstq[])//判断两个字符串是否相等{while(*p++==*q++)if(*p==' '&&*q==' ')return(1);return(0);}JPNode*Find_Name(JPNode*s,char*parent)//定位家谱中的成员。返回其指针(地址){staticJPNode*here=NULL;if(s==NULL)returnhere;if(Equal