报告

数据结构实验报告

时间:2024-11-22 14:29:08 报告 我要投稿

数据结构实验报告

  在经济发展迅速的今天,报告的使用成为日常生活的常态,要注意报告在写作时具有一定的格式。那么,报告到底怎么写才合适呢?下面是小编整理的数据结构实验报告,希望能够帮助到大家。

数据结构实验报告

数据结构实验报告1

  一、设计的背景和目的

  随着社会信息化和网络技术的发展,数据结构成为了计算机专业学生必修的课程之一。而数据结构的课程设计是检验学生理解数据结构的重要手段之一。本次实验旨在让学生通过实践,掌握线性表、栈、队列、树等数据结构的基本操作和应用。

  二、设计的内容

  本次实验分为四部分,分别为线性表、栈、队列和树。每个部分分别包括以下内容:

  1. 线性表

  设计一个线性表,支持插入、删除、查找、遍历、求表长度等基本操作,并设计一个简单的应用程序,模拟学生成绩的管理。

  2. 栈

  设计一个栈,支持进栈、出栈、判断栈是否为空、求栈长度等基本操作,并设计一个简单的应用程序,模拟计算器实现加减乘除的运算。

  3. 队列

  设计一个队列,支持进队、出队、判断队列是否为空、求队列长度等基本操作,并设计一个简单的应用程序,实现图的广度优先搜索算法。

  4. 树

  设计一个二叉树,支持插入、删除、查找、遍历等基本操作,并设计一个应用程序,实现哈夫曼编码。

  三、设计的实现

  本次实验采用C语言实现,使用了链表和数组两种数据结构作为存储方式。

  1. 线性表

  线性表的'实现采用链表作为存储结构,由于链表可以动态分配内存,因此可以方便地实现插入和删除操作。学生成绩的管理程序中,可以通过插入、删除、遍历等操作实现对学生成绩的增删查改。

  2. 栈

  栈的实现采用数组作为存储结构,数组大小为100,可以通过定义栈顶指针实现入栈和出栈操作。计算器程序中,通过将中缀表达式转换为后缀表达式,再通过栈的出栈和进栈操作,实现加减乘除的运算。

  3. 队列

  队列的实现采用循环队列作为存储结构,队列大小为100,可以通过定义队头和队尾指针实现出队和入队操作。实现图的广度优先搜索算法中,每次将队头出队,并将与队头相邻的点入队,直到队列为空。

  4. 树

  树的实现采用二叉链表作为存储结构,每个节点的数据结构包括节点值、左右子节点指针和父节点指针。哈夫曼编码程序中,先通过输入一组字符及其出现频率,构建哈夫曼树,再通过遍历哈夫曼树,生成哈夫曼编码。

  四、实验结果

  本次实验的四个部分均已顺利完成,所有程序均已经通过测试。通过实践,学生们对线性表、栈、队列、树等数据结构的基础操作和应用有了更深入的理解和掌握。此举有助于提高学生的程序设计水平和数据结构的应用能力。

数据结构实验报告2

  1 引言

  产品质量监督检验机构(以下简称检验机构)的基本任务是依据技术标准,对产品进行检测,出据科学、公正、准确的检验报告[1]。检验机构的一系列管理措施都是围绕着这一中心而展开的。检验机构在监督检验、委托检验、第三方仲裁检验、流通领域中打击假冒伪劣产品检验等[2]为提高产品质量、保护消费者的合法权益、打击假冒伪劣产品、促进市场有序竞争,为政府部门提供决策依据先进都起到了很大作用。下面就本系统的工作实际粗略地提出关于检验机构如何提高工作效率的一些看法,以供同行交流参考。

  2 提高工作效率的措施

  2.1 标准管理

  标准是检验产品的技术依据。根据GB/T 27025 [3]的要求,检验机构要保证所使用的标准是现行有效的。如果检验依据使用错误,可能会导致检测结果错误,或检验结论判断错误,从而引发检测争议。要做到检测中所使用的标准现行有效就必须充分利用网络,通过标准信息网及时查阅并下载相关标准更新的信息。检测机构应设有专职或兼职标准化工作人员,负责使用标准的检索、更新并建立标准数据库及数据库的日常维护。标准数据库设有如下信息:标准名称、标准编号、日期、实施日期、部门、以及作废、更新、替换信息等内容。检验机构内部建立局域网,实现内部联网,方便各部门人员及时查阅标准信息。为了保证数据库运行准确无误,应设置标准更改权限,规定只有标准化负责人员才有权对标准信息进行写入。其他人员只能查询和读取,不能随意更改。检验机构还应规定出具报告中引用的标准必须从标准数据库中调用。

  2.2 原始记录格式规范化

  检验原始记录是出具检验报告的依据。因此检验机构必须重视原始记录工作,如果将检测报告被看作是检验机构的产品,那么原始记录就相当于检测报告所用的原料或半成品。在实际工作中由于对原始记录工作重视不够,记录中存在不少问题。如原始记录字迹潦草,难以辨认;内容与检验报告不符;未记录引用的检验标准、检验过程中所使用的仪器设备及设备使用的参数条件;检测过程涉及的过程数据、公式等记录不全[4]。为保证检测报告质量,必须重视原始记录,做到原始记录规范、准确和完整,可采取以下措施:将产品标准中所涉及的检测项目按检验方法设立原始记录,原始记录中必须包括GB/T 27025 [3]中规定的关于原始记录要求的全部信息。每项检测记录应包含足够的信息,以便识别不确定度的影响因素,并保证该检测在尽可能接近原条件的情况下能够复现。记录应包括从事各项检测的人员和结果校核人员的标识、检测的方法、计算的公式、检测过程中必要的曲线图均应有详细的记录及使用的重要检测仪器与设备(含名称、型号、精度等级)以利于真实反映检测手段及检测条件使用情况,检测记录是检测结果的`原始凭证。

  2.3 检验过程计算电算化

  对每一类产品所有检验项目在检验过程中涉及到的计算建立Excel数据库,将每一检验项目计算公式中涉及的参数编制计算程序,检验人员只需录入原始数据,即可得出结果,可以避免检验人员用手工或计算器计算的容易出错的问题,还可以提高数据计算的速度,特别是在完成批量大、涉及的计算量较大的监督抽查、工商委托抽样任务时可以发挥较大的优势。

  2.4 检验报告

  检验报告是检验工作全过程形成的结果,是质监、工商、法院等单位执法的重要依据。检验报告初稿由承检负责人编写.其他承拉人校对并签名。要提高出具检验报告的效率和质量,按照相关规定,要求检验报告格式规范;引用的检验依据、判定依据正确;报告检验数据准确,信息完整无误。报告进行初审和复审的二级审批制度。报告正本加盖检验报告专用章和骑缝章,保证质检机构的公正性、科学性和有效性[1]。要提高出具检验报告的效率可采取如下措施: 1、将报告格式分类:由于不同检验类别的样品检验报告所用的报告格式是不同的,故按不同类别设立报告的规范格式:委托送样、监督抽查、许可证发证检验、委托抽样检验等按不同类别建立数据库,根据检验具体要求从中调用;2、按产品分类:在报告格式分类基础上,将不同产品按产品标准建立完整的全项目检验报告格式,将其中的一些内容设为固定参数,如检验项目,对应的技术要求,打报告时只需调用对应的报告格式和对应产品,输入实际检测值,再对检测的项目做适当删改即可,这样可以节省大量的输入、校对及查找技术要求的时间,还减少误操作的出错率。

  2.5 文件管理电子化

  电子文档是相对于传统的纸质文档而言,电子文档具有很多优越性,最突出一点是电子文档的检索更为方便、高效,体现在:1、样品流转,采用电子文档记录样品编号、数量、检测项目、送样单位、接样日期、要求报告日期等信息,如此记录的信息便于查找、检索。2、日常检验报告在编制后需要有报告审核的程序。若采用纸质报告,经领导检查审核后,如发现问题需修改则要重新打印,既浪费又麻烦,若采用电子文档,可以将检验原始记录用扫描仪扫描成电子文档,连同编制好的检验报告,以电子文件的形式通过局域网传递给审核者,审核完毕后传回业务室进行打印装订就可以了。另外,也可以结合本单位的实际情况,运用实验室管理软件系统,将日常检测工作流程如:程序文件、样品流转、标准检索、仪器信息、原始记录(包括仪器分析图谱)数据汇总、检测报告等文件信息输入系统,再经分析整理,最终形成文件。这样既便于日常实验室管理,也使档案管理工作与日常工作形成一个有机的整体[5]。

  总之,要提高产品质量监督检验机构的工作效率,应从检验机构内部多个环节齐抓共管,特别是从标准管理、原始记录格式规范化、检验过程计算电算化、检验报告、业务室管理和文件管理电子化等方面加强管理,努力提高检测水平,保证检测报告质量,维护产品质量检验机构的科学性、准确性和公正性。

数据结构实验报告3

  一、实验目的及要求

  1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。

  本实验训练的要点是“栈”和“队列”的观点;

  二、实验内容

  1) 利用栈,实现数制转换。

  2) 利用栈,实现任一个表达式中的语法检查(选做)。

  3) 编程实现队列在两种存储结构中的'基本操作(队列的初始化、判队列空、入队列、出队列);

  三、实验流程、操作步骤或核心代码、算法片段

  顺序栈:

  Status InitStack(SqStack &S)

  {

  S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));

  if(!S.base)

  return ERROR;

  S.top=S.base;

  S.stacksize=STACK_INIT_SIZE;

  return OK;

  }

  Status DestoryStack(SqStack &S)

  {

  free(S.base);

  return OK;

  }

  Status ClearStack(SqStack &S)

  {

  S.top=S.base;

  return OK;

  }

  Status StackEmpty(SqStack S)

  {

  if(S.base==S.top)

  return OK;

  return ERROR;

  }

  int StackLength(SqStack S)

  {

  return S.top-S.base;

  }

  Status GetTop(SqStack S,ElemType &e)

  {

  if(S.top-S.base>=S.stacksize)

  {

  S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));

  if(!S.base) return ERROR;

  S.top=S.base+S.stacksize;

  S.stacksize+=STACKINCREMENT;

  }

  *S.top++=e;

  return OK;

  }

  Status Push(SqStack &S,ElemType e)

  {

  if(S.top-S.base>=S.stacksize)

  {

  S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));

  if(!S.base)

  return ERROR;

  S.top=S.base+S.stacksize;

  S.stacksize+=STACKINCREMENT;

  }

  *S.top++=e;

  return OK;

  }

  Status Pop(SqStack &S,ElemType &e)

  {

  if(S.top==S.base)

  return ERROR;

  e=*--S.top;

  return OK;

  }

  Status StackTraverse(SqStack S)

  {

  ElemType *p;

  p=(ElemType *)malloc(sizeof(ElemType));

  if(!p) return ERROR;

  p=S.top;

  while(p!=S.base)//S.top上面一个...

  {

  p--;

  printf("%d ",*p);

  }

  return OK;

  }

  Status Compare(SqStack &S)

  {

  int flag,TURE=OK,FALSE=ERROR;

  ElemType e,x;

  InitStack(S);

  flag=OK;

  printf("请输入要进栈或出栈的元素:");

  while((x= getchar)!='#'&&flag)

  {

  switch (x)

  {

  case '(':

  case '[':

  case '{':

  if(Push(S,x)==OK)

  printf("括号匹配成功! ");

  break;

  case ')':

  if(Pop(S,e)==ERROR || e!='(')

  {

  printf("没有满足条件 ");

  flag=FALSE;

  }

  break;

  case ']':

  if ( Pop(S,e)==ERROR || e!='[')

  flag=FALSE;

  break;

  case '}':

  if ( Pop(S,e)==ERROR || e!='{')

  flag=FALSE;

  break;

  }

  }

  if (flag && x=='#' && StackEmpty(S))

  return OK;

  else

  return ERROR;

  }

  链队列:

  Status InitQueue(LinkQueue &Q)

  {

  Q.front =Q.rear=

  (QueuePtr)malloc(sizeof(QNode));

  if (!Q.front) return ERROR;

  Q.front->next = NULL;

  return OK;

  }

  Status DestoryQueue(LinkQueue &Q)

  {

  while(Q.front)

  {

  Q.rear=Q.front->next;

  free(Q.front);

  Q.front=Q.rear;

  }

  return OK;

  }

  Status QueueEmpty(LinkQueue &Q)

  {

  if(Q.front->next==NULL)

  return OK;

  return ERROR;

  }

  Status QueueLength(LinkQueue Q)

  {

  int i=0;

  QueuePtr p,q;

  p=Q.front;

  while(p->next)

  {

  i++;

  p=Q.front;

  q=p->next;

  p=q;

  }

  return i;

  }

  Status GetHead(LinkQueue Q,ElemType &e)

  {

  QueuePtr p;

  p=Q.front->next;

  if(!p)

  return ERROR;

  e=p->data;

  return e;

  }

  Status ClearQueue(LinkQueue &Q)

  {

  QueuePtr p;

  while(Q.front->next )

  {

  p=Q.front->next;

  free(Q.front);

  Q.front=p;

  }

  Q.front->next=NULL;

  Q.rear->next=NULL;

  return OK;

  }

  Status EnQueue(LinkQueue &Q,ElemType e)

  {

  QueuePtr p;

  p=(QueuePtr)malloc(sizeof (QNode));

  if(!p)

  return ERROR;

  p->data=e;

  p->next=NULL;

  Q.rear->next = p;

  Q.rear=p; //p->next 为空

  return OK;

  }

  Status DeQueue(LinkQueue &Q,ElemType &e)

  {

  QueuePtr p;

  if (Q.front == Q.rear)

  return ERROR;

  p = Q.front->next;

  e = p->data;

  Q.front->next = p->next;

  if (Q.rear == p)

  Q.rear = Q.front; //只有一个元素时(不存在指向尾指针)

  free (p);

  return OK;

  }

  Status QueueTraverse(LinkQueue Q)

  {

  QueuePtr p,q;

  if( QueueEmpty(Q)==OK)

  {

  printf("这是一个空队列! ");

  return ERROR;

  }

  p=Q.front->next;

  while(p)

  {

  q=p;

  printf("%d<- ",q->data);

  q=p->next;

  p=q;

  }

  return OK;

  }

  循环队列:

  Status InitQueue(SqQueue &Q)

  {

  Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));

  if(!Q.base)

  exit(OWERFLOW);

  Q.front=Q.rear=0;

  return OK;

  }

  Status EnQueue(SqQueue &Q,QElemType e)

  {

  if((Q.rear+1)%MAXQSIZE==Q.front)

  return ERROR;

  Q.base[Q.rear]=e;

  Q.rear=(Q.rear+1)%MAXQSIZE;

  return OK;

  }

  Status DeQueue(SqQueue &Q,QElemType &e)

  {

  if(Q.front==Q.rear)

  return ERROR;

  e=Q.base[Q.front];

  Q.front=(Q.front+1)%MAXQSIZE;

  return OK;

  }

  int QueueLength(SqQueue Q)

  {

  return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;

  }

  Status DestoryQueue(SqQueue &Q)

  {

  free(Q.base);

  return OK;

  }

  Status QueueEmpty(SqQueue Q) //判空

  {

  if(Q.front ==Q.rear)

  return OK;

  return ERROR;

  }

  Status QueueTraverse(SqQueue Q)

  {

  if(Q.front==Q.rear)

  printf("这是一个空队列!");

  while(Q.front%MAXQSIZE!=Q.rear)

  {

  printf("%d<- ",Q.base[Q.front]);

  Q.front++;

  }

  return OK;

  }

数据结构实验报告4

  蔬菜农残检验是一个复杂的过程,所有检验必须经过抽样、样品登记、样品检验、报告输出、数据汇总几个阶段.首先在样品登记阶段时,检验机构抽样人员必须对进入蔬菜批发市场的蔬菜品种进行抽样,然后立即进行登记,登记内容包括业主的身份及车辆等信息.样品登记后应该进行样品检验,检验数据应输入管理系统中,经校核后作为最终检验结果存档,然后出具检验报告.所有检验数据必须于第二天上报检验机构总部,再由检验机构总部上报市政府备案.因为本部距离农残检验站很远,这段工作通常是第二天由专人开车到农残检验站获取检验记录单再回质检机构总部录入汇总,这种工作方式费时费力,无法满足工作要求,需要设计出即时数据传输功能.另外检验报告出具后需在检验机构总部存档,因此还需设计出检验数据查询功能供管理者和使用者对检验数据进行查询统计.

  一、PRIM的体系结构

  PRIM系统的架构分为数据库部分和客户端部分和数据上传部分,数据库部分采用MSSQL数据库,客户端采用.net技术开发.数据库安装在服务器,客户端装在检验部门、总部管理部门,登记人员、检验人员、管理员和总部管理人员根据各自权限分别可进行登记、检验、检验数据处理、权限设定、各种查询、数据上传等工作.总部可以实现远程监控检验机构的检验行为和及时调用、查询、分析检验结果.通过开放接口,实现总部实验室管理系统和现场实现对接,从而提高检验数据上报时间,简化操作步骤.检验数据保存后,通过PRIM系统提供的接口,使相关工作人员可以调出检验数据进行查询、分析、汇总,提高了数据的使用效率.另外,使用者可以通过查询统计调用需要的数据.

  二、系统模块设计

  3.1基础模块

  基础模块包括数据库设计、人员设置、基本信息设置等部分,数据库部分可以采用ACCESS、SQL等数据库,ACCESS数据库数据处理和统计分析十分方便,利用ACCESS处理十万条级以下记录数据时速度快且操作方便.但是如果处理大的数据(百万条记录以上)以及复杂查询ACCESS有时不稳定易导致系统崩溃,另外,ACEESS数据库适用于单用户还可以,在处理多用户时就显得数据处理能力不够.相比较而言,MSSQL具备相对稳定处理大数据的能力,但是查询设计代码编写复杂,不容易被开发掌握,作为一个重要的检验管理系统,稳定是第一要的,而且每天处理的数据量达到几千条,很快就会超过几十万条记录,所以农残检验管理系统采用SQL数据库是合适的.客户端采用.net作为编程语言.

  3.2报告输出模块

  报告输出的形式有多种,可以采用数据链接的方式实现管理系统与OFFICE文档的输出,这种方法的优点是开发方便,适应性强,缺点是不稳定,有时会出现乱码现象.第二种方法是采用.net语言把报告写在编码里,这种方法比较繁琐,开发周期长,但是功能强大.系统工作稳定,不会出现乱码现象,所以报告输出方面采用.net编程方式进行.

  3.3数据汇总查询

  在进行信息查询和统计时,经常同时牵涉到几个数据表,这就必须考虑数据表之间的数据关联性[1].数据汇总的实现可以通过多个途径实现,首先可以编程实现,即通过ADO.NET实现各种查询统计的功能,在多层次查询时可以采用普通的组合查询方式,也可采用“SHAPE...APPEND”以及“SHAPE...COMPUTE”等高级语句生成关系层次和参数化以及组合层次进行复杂条件的查询.其次,也可采用在数据库实现编写存储过程再调用的查询方式.数据远程传递是一个复杂过程,它涉及到诸多方面的问题,包括远程服务器和本地服务器的硬件对接,数据的实时性、数据传递的'便捷性、数据的大小、及远程查询等诸多软件对接问题,对此,作者专门开发了LDTD(LONGDISTANCETRANSPORTDATA)技术,用于处理远程数据传递问题.远程数据传递应注意的问题是数据传输以4096个字节为一个单位,所以每次数据传递尽量优化在4096个字节以下,这样的传输才能快捷.

  三、应用实例

  是按照鞍山市产品质量监督检验所要求开发的PRIM系统的运行界面.抽样登记人员从登录窗口登录主界面后,输入基本信息后,系统自动生成产品检验编号,然后通过任务界面提交检验申请并发送,这样,检验员接到任务后开始检验并出具检验报告,然后上传检验结果.在所有的检验测试数据都输入到系统数据库进行保存后,检验员还可以查询登记情况和检验结果.管理人员及其他需要用到检验测试数据的人员可以通过查询统计模块进行查询、统计,并可以生成相应的分析图,使得相关部门可以直观地看到农产品农药残留情况.甚至还可以预测一定时期内农产品农药残留的走势,为其做出相应决策提供可靠的依据.没有使用PRIM计算机管理程序之前,检验人员做完实验后用word文档出具一份检验报单告需5min左右时间,200份检验报告需要1000min左右.加上汇总及改错等时间,处理检验的时间需要一个人用大致1040min去完成.而使用PRIM计算机管理系统后,处理一份报告平均只需1min完成,200份检验报告共需200min左右时间,同时出错率低,数据实时上传,无需汇总,合计共省去约940min宝贵时间,处理检验报告工作量是未使用计算机管理程序时工作量的1/5.经使用单位使用,5个人的工作量可以4个人完成,极大地提高了检验工作效率,得到了使用单位的认可.

  四、结束语

数据结构实验报告5

  一、实验目的

  1、掌握数据结构中队列和栈的基本概念、特性及操作。

  2、通过编程实践,加深理解队列和栈的顺序存储和链式存储的实现方法。

  3、锻炼编程能力和算法设计能力,提升解决实际问题的能力。

  二、实验内容

  1、实现顺序栈的基本操作(初始化、判空、入栈、出栈)。

  2、实现链式队列的。基本操作(初始化、判空、入队、出队)。

  三、实验步骤及核心代码

  1、顺序栈的实现

  (1)定义顺序栈的`数据结构

  (2)顺序栈的初始化

  (3)顺序栈的判空操作

  (4)顺序栈的入栈操作

  (5)顺序栈的出栈操作(略)

  2、链式队列的实现

  (1)定义链式队列的数据结构(节点和队列)

  (2)链式队列的初始化(略)

  (3)链式队列的判空操作(略)

  (4)链式队列的入队操作(略)

  (5)链式队列的出队操作(略)

  四、实验结果与分析

  1、顺序栈的实验结果与分析(包括测试数据、执行结果、问题分析等)。

  2、链式队列的实验结果与分析(包括测试数据、执行结果、问题分析等)。

  五、实验总结

  通过本次实验,我深入理解了数据结构中队列和栈的基本概念、特性及操作,并通过编程实践掌握了队列和栈的顺序存储和链式存储的实现方法。在实验过程中,我遇到了一些困难和问题,但通过查阅资料、调试代码和与同学讨论,最终都得到了解决。这次实验不仅锻炼了我的编程能力和算法设计能力,还提升了我解决实际问题的能力。

数据结构实验报告6

  《数据结构与算法》实验报告

  专业 班级 姓名 学号

  实验项目

  实验一 二叉树的应用

  实验目的

  1、进一步掌握指针变量的含义及应用。

  2、掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。

  3、掌握用指针类型描述、访问和处理二叉树的运算。

  实验内容

  题目1:编写一个程序,采用一棵二叉树表示一个家谱关系。要求程序具有如下功能:

  (1)用括号表示法输出家谱二叉树,

  (2)查找某人的所有儿子,

  (3)查找某人的所有祖先。

  算法设计分析

  (一)数据结构的定义

  为了能够用二叉树表示配偶、子女、兄弟三种关系,特采用以下存储关系,则能在二叉树上实现家谱的'各项运算。

  二叉树型存储结构定义为:

  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) //家谱输出函数

  (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,char p[]) //结点定位函数

  1:当前结点是否为空,为空则返回空;

  2:如果和查找信息相同,则返回当前结点;

  3:如不然,则先后递归访问其左结点,再不是则递归访问右结点

  void FindSon(FNODE *b,char p[]) //儿子查找函数

  1:在家谱中定位到要查找的结点,如无则输出“查找不到此人”

  2:判断其配偶结点与子女结点是否为空,为空则输出“无子女”

  3:不为空则输出其配偶结点的所有右结点(子女结点)。

  int FindAncestor(FNODE *head,char son[ ]) //祖先查找函数

  1:先在家谱中定位到要查找的结点,如为空输出“不存在此人”,程序结束

  2:先将父母结点入栈,当栈为空时程序结束,

  3:栈不为空时,判断栈顶元素是否已访问过,

  4:访问过,再判断是否为查找结点,如是则输出栈中保存的其祖先结点,并滤过其兄弟结点不输出;不是查找结点,则退栈一个元素

  5:未访问过,则取当前栈顶元素,置访问标志——1,同时取其右结点

  6:栈不为空或当前所取结点不为空时,转到2;

  实验测试结果及结果分析

  (一)测试结果

  (二)结果分析

  (略)

  实验总结

  (略)

【数据结构实验报告】相关文章:

数据结构实验报告范例08-10

实验报告06-21

测试实验报告07-10

焊接实验报告03-15

示波器实验报告06-24

学生实验报告10-09

大学实验报告11-16

小学实验报告(精选)11-04

最新实验报告10-14