- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                
                       《数据结构与算法》实验报告 
专业                    班级                     姓名                    学号 
实验项目 
实验一     二叉树的应用 
实验目的 
1、进一步掌握指针变量的含义及应用。 
2 、掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。 
3 、掌握用指针类型描述、访问和处理二叉树的运算。 
实验内容 
题目  1: 编写一个程序,采用一棵二叉树表示一个家谱关系。要求程序具有如下功能: 
 (1)用括号表示法输出家谱二叉树, 
 (2 )查找某人的所有儿子, 
 (3 )查找某人的所有祖先。 
算法设计分析 
 (一)数据结构的定义 
为了能够用二叉树表示配偶、子女、兄弟三种关系,特采用以下存储关系,则能在二叉树上 
实现家谱的各项运算。 
               父 
         妻 
                子 1 
       子妻  1 
                        子 2 
                孙 1 
                     子妻  2 
                              孙 2 
二叉树型存储结构定义为: 
typedef  struct SNODE 
{char name[MAX];      //人名 
 struct SNODE *left;  // 指向配偶结点 
 struct SNODE *right; // 指向兄弟或子女结点 
}FNODE; 
 (二)总体设计 
实验由主函数、家谱建立函数、家谱输出函数、儿子查找函数、祖先查找函数、结点定位函 
数、选择界面函数七个函数共同组成。其功能描述如下: 
 (1)主函数:统筹调用各个函数以实现相应功能 
      void main() 
 (2 )家谱建立函数:与用户交互建立家族成员对应关系 
      void InitialFamily(FNODE *head) // 家谱建立函数 
 (3 )家谱输出函数:用括号表示法输出家谱 
      输出形式为:父和母(子             1 和子妻    1  (孙1),子 2 和子妻  2      (孙2 )) 
      void PrintFamily(FNODE *head)  //家谱输出函数 
                                           2 
 (4 )儿子查找函数:在家谱中查找到某人所有的子女并输出,同时也能辨别出其是否为家 
族成员与是否有子女 
      void  FindSon(FNODE *b,char p[]) // 儿子查找函数 
 (5 )祖先查找函数:在家谱中查找到某人所有的祖先并输出,同时也能辨别出其是否为家 
族中成员。 
      int FindAncestor(FNODE *head,char son[ ]) // 祖先查找函数 
 (6 )结点定位函数:在家谱中找到用户输入人名所对应的结点。 
      FNODE *findnode(FNODE *b,char p[]) // 结点定位函数 
 (7 )选择界面函数:为便于编写程序,将用户选择部分独立为此函数。 
      void PRINT(int n) 
 (三)各函数的详细设计: 
void InitialFamily(FNODE *head) // 家谱建立函数 
  1:首先建立当前人的信息,将其左右结点置为空, 
  2 :然后让用户确定其是否有配偶,如果没有配偶,则当前程序结束, 
  3 :如果有则建立其配偶信息,并将配偶结点赋给当前人的左结点; 
  4 :再让用户确定其是否有子女,如果有则递归调用家谱建立函数建立子女结点,并将其 
  赋给配偶结点的下一个右结点。 
  5 :如无,则程序结束 
void PrintFamily(FNODE *head)   // 家谱输出函数 
  1:首先判断当前结点是否为空,如果为空则结束程序; 
  2 :如果不为空,则输出当前结点信息, 
  3 :然后判断其左结点(配偶结点)是否为空,如不为空则输出“和配偶信息。 
  4 :再判断配偶结点的右结点是否为空,如不为空则递归调用输出其子女信息,最后输出 
   “)”; 
  5 :当配偶结点为空时,则判断其右结点(兄弟结点)是否为空 
  6 :如果不为空,则输出“,             ”,并递归调用输出兄弟信息 
  7 程序结束 
FNODE *findnode(FNODE *b,
                
原创力文档
                        

文档评论(0)