数据结构第一次实验.docVIP

  • 36
  • 0
  • 约2.89千字
  • 约 5页
  • 2016-11-26 发布于重庆
  • 举报
数据结构第一次实验

数据结构实验报告 实验一 线性表实验 班级:__计12-1_ 姓名:依力夏提江·艾买尔_ 学号:_12101020129 实验目的: 熟悉线性表的基本运算在顺序存储结构和链式存储结构上的实现,其中重点掌握线性表的链式表示时各种操作的实现。 问题描述: 约瑟夫(Joseph)问题的一种描述是:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码〈正整数〉,一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 需求分析:(包括对问题的理解,解决问题的策略、方法描述) 1.用循环链表实现。 2.单个开辟节点,节点里用data记录密码,用n记录序号。 3.从第一个节点开始输入密码和节点,然后连在一起。 4.最后一个节点的next域指向头第一个节点,形成循环链表。 5.开始报数以后,从第一个节点开始找,找到第m人,这里用L-n,输出起序号,把L-data赋给m。(L=L-next来指向往下找操作) 6.报完数出列以后,把下一个节点的所有信息,赋给当前报数人信息所在的节点上。 7.释放下一个节点当前节点就成了下一个节点。同时人数减一。 系统设计:(包括数据结构定义、抽象出基本操作描述、主程序模块处理过程描述) /*定义线性节点,用data记录密码,用n记录序号*/ typedef struct LNode{ int data; int n; struct LNode *next; }LNode, *LinkList; /*创建链表*/ LinkList CreateList_L(LinkList L,int n) /*删除链表,实现每个人报完数出列后,把接个人密码所在的节点从循环链表中删除*/ void DeleteList_L(LinkList L,int n,int m) /*函数主体*/ int main() { int n,m;//n是人数,m是第一报数上限,也是下一次密码赋值的量 LinkList L=NULL;//L指向链表 scanf(%d%d,m,n); L=CreateList_L(L,n); DeleteList_L(L,n,m); return 0; } 函数主题,简介易懂! 调试分析:(包括调试过程中对原设计的修改,以及遇到的问题和解决的方法) 因当前报数人,出列是用其L-n(序号),然后这节点数据就不要了,可是想删除这个节点不好办了,因为想删除此节点,要把该节点前一个节点的next域指向该节点的下一个节点,可因为不是双线链表,所以寻找前一个节点就难办了。 我想到办法把下一个节点替代当前节点,然后再删除下一个节点,这样问题就解决了。 如下: m=L-data;//把这次报数出列人的密码,赋给m,用到下次循环找到下一个出列的人 q=L-next; //用q来记录,该删除的节点,注意:此处删除不是出列人原有数据所在的节点而是它的下一个节点 *L=*(L-next);//把L指针及指向的节点下一个next域的全部信息付给L节点,把原先所有信息覆盖掉 free(q);//释放节点q n--;//人数减一 测试结果:(输入的测试数据及运行结果、正确性、在线测试情况) 输出正确,完美运行。 基本操作的实现:(对各基本操作实现的描述) 整体过程: #includestdio.h #includestdlib.h //#includeiostream /*定义线性节点,用data记录密码,用n记录序号*/ typedef struct LNode{ int data; int n; struct LNode *next; }LNode, *LinkList; /*创建链表*/ LinkList CreateList_L(LinkList L,int n) { int i=0; LinkList p=NULL,head=NULL;//定义两个指针,指向空节点 head=(LinkList)malloc(sizeof(LNode));//给空节点分配存储空间 scanf(%d,head-data);//输入第一个人的密码 head-n=1;//记录第一个人的序号为1 L=head;//L指向第一个节点 for(i=2;i=n;i++)//循环实现,从第二个人到最后一个人的,密码输入与,序号记录 { p=(LinkList)malloc(sizeof(LNode));//开

文档评论(0)

1亿VIP精品文档

相关文档