数据结构 北邮 徐雅静 课件.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构 北邮 徐雅静 课件

-*- 习题1 题目 已知数组A[n]中元素为整型,设计算法将其调整为左右两部分,左边所有元素为奇数,右边所有元素为偶数。 3 9 1 7 5 2 6 8 4 i j -*- 基本思想 将左边元素的调整到右边,右边的元素调整到左边,关键在于调整的新位置如何确定。最理想的情况:正好将左边的偶数和右边的奇数交换一下。 3 9 1 7 5 2 6 8 4 i j -*- 如何实现? void Convert (int A[], int n) { int i=0; int j=n-1; while(ij) { while(A[i]%2==0) i++; while(A[j]%2!=0) j--; if (ij) A[i] ?? A[j]; } } 3 4 2 7 5 1 6 8 9 i j -*- 习题2 以单链表为存储结构,写出就地逆置的算法 a1 a2 an ∧ … first an an-1 a1 ∧ … first -*- a1 a2 an ∧ … first a1 a2 an ∧ … first p p ∧ first a1 a2 an ∧ … 思考步骤1: 摘除头结点 -*- q p ∧ first a1 a2 an ∧ … ∧ first a1 a2 an ∧ … p 思考2:按照头插法的原则建立链表 ∧ p first a1 q a2 an ∧ … a3 -*- 逆置算法 template class Node void reverse(Node *first) { Node *p,*q; p = first-next; //保存原链表的元素 first-next=NULL; //用原链表的头结点建立新的结点 while (p!=NULL) { 1 保存原链表的下一个元素 2 当前结点插入新的链表 3 原链表后移 } } ∧ p first a1 q a2 an ∧ … a3 -*- 逆置算法 template class Node void reverse(Node *first) { Node *p,*q; p = first-next; //保存原链表的元素 first-next=NULL; //用原链表的头结点建立新的结点 while (p!=NULL) { q = p-next; //保存原链表的下一个元素 p-next = first-next; //当前结点插入新的链表 first-next = p; p = q; //原链表后移 } } -*- 习题3 题目 设有编号为1、2、3、…、n的n个人围成一个圈,从第一个人开始报数,报到m的人出圈,再从他的下一个人起从新报数,报到m的人出圈,如此下去,直到所有人全部出圈位置。给定任意的n和m,设计算法求n个人出圈的次序。 -*- 约瑟夫问题 逻辑结构 线性表 存储结构 数组 链表 -*- 使用数组实现约瑟夫问题 void Josephus (int a[], int n, int m) { 1 定义需要的变量 2 确定外循环的条件 3 确定内循环的条件 } -*- 使用数组实现约瑟夫问题 void Josephus (int a[], int n, int m) { } 大致的程序结构 int k=0; //记录出局的人数 int i = 1; //记录当前报数的人的编号 while (kn) { k++; } for (int j=0; jm; j++ ) { } -*- void Josephus(int a[], int n, int m) { int k=0; //记录出局的人数 int num=-1; //正在报数的人编号 while (kn) { for (int i=0;im;) { num=(num+1) % n; if (a[num]!=0) i++; } couta[num]endl; a[num]=0

文档评论(0)

yaobanwd + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档