【报告】数据结构读书报告.docx

精品word学习资料可编辑 名师归纳总结——欢迎下载 一,需求分析 1,问题描述 : 设有 n 个人围坐在一个圆桌四周 , 现从第 s 个人开头报数 , 数到第 m得人出列 , 然后从出列得下一个人重新开头报数 , 数到第 m得人又出列 , ? , 如此反复直到全部得人全部出列为止; 二,程序分析 2,1 储备结构 储备结构 : 循环链表 1 1 2 3 ? n first 2,2 关键算法分析 【设计思想】 第一 ,设计实现约瑟夫环问题得储备结构;由于约瑟夫环本身具有循环性质 ,考虑采纳循环链表 ,为了统一对表中任意节点得操作 ,循环链表不带头结点;循环链表得结点定义为如 下结构类型 : struct Node { int number; Node *next; }; 其次,建立一个不带头结点得循环链表并由头指针 first 指示;最终,设计约瑟夫环问题得算法; 【伪代码】 1,工作指针 first,r,s,p,q 初始化2,输入人数 (n)与报数 (m) 3,循环 n 次,用尾插法创建链表 Node *q; for(int i=1;i=n;i++) { Node *p; 精品word学习资料可编辑 名师归纳总结——欢迎下载 p=new Node; pnumber=i; pnext=NULL; if(i==1) L=q=p; else { qnext=p; q=qnext; } } qnext=L; if(L.=NULL){return(L);} 4,输入报数得起始人号数 k; 5,Node *q = new Node;计数器初始化 i=1; 6,循环 n 次删除结点并报出位置 (其中第一个人后移 k 个) 当 in 时 移动指针 m2 次 p=pnext; 删除 p 结点得后一结点 q q=pnext; pnext=qnext; *L = pnext; 报出位置后 Delete q; 计数器 i++; 【复杂度】 精品word学习资料可编辑 名师归纳总结——欢迎下载 for(int i=1;i=n;i++) { Node *p; p=new Node; pnumber=i; pnext=NULL; if(i==1) L=q=p; else { qnext=p; q=qnext; } 时间复杂度 :O(n) if(i==1) i+=LengthList(*L); Node *p; p=*L; int j=0; while(ji2) {p=pnext;j++;} q = pnext; pnext=pnextnext; *L = pnext; return(q); 时间复杂度 :O(n2) 算法得空间复杂度 :O(n2) 精品word学习资料可编辑 名师归纳总结——欢迎下载 三,具体设计 #includeiostream using namespace std; struct Node//循环节点得定义 { int number;//编号Node *next; }; Node *CreateList(Node *L,int n,int m); //建立约瑟夫环函数 void Joseph(Node *L,int n,int m); //输出每次出列号数函数 Node *DeleteList(Node **L,int i,Node *q); //查找每次出列人得号数int LengthList(Node *L); //运算环上全部人数函数void main//主函数 { Node *L; L=NULL; //初始化尾指针 int n, m; cout请输入人数 N:; 精品word学习资料可编辑 名师归纳总结——欢迎下载 cinn;//环得长度 if(n1){cout 请输入正整数 .;}// 人数反常处理 else { cout请输入所报数 M:; cinm; if(m1){cout 请输入正整数 .;}// 号数反常处理 else { L=CreateList(L,n,m);// 重新给尾指针赋值Joseph(L,n,m); } } system(pause); } Node *CreateList(Node *L,int n,int m)// 建立一个约瑟夫环 (尾插法) { Node *q; for(int i=1;i=n;i++) { Node *p; p=new Node; pnumber=i; pnext=NULL; 精品word学习资料可编辑 名师归纳总结——欢迎下载 if(i==1) L=q=p;// 工作指针得初始化 else { qnext=p; q=qnext; } } qnext=L; if(L.=NULL){return(L);}// 返回尾指针 else cout尾指针反常 .endl;// 尾指针反

文档评论(0)

1亿VIP精品文档

相关文档