- 1、本文档共27页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构第二章 线性表part9
* 2-2 已知一个顺序表中的元素按元素值非递减有序排列,编写一个函数删除表中多余的值相同的元素。 算法思想: 由于顺序表中的元素按元素值非递减有序排列,值相同的元素必为相邻的元素。 因此,依次比较相邻两个元素,若值相等,则删除其中一个,否则继续向后查找。 实现本题功能的函数如下: void del (SqList A, int n) // 表长为n { int i=0, j; while (in-2) if (A[i]!=A[i+1]) i++ ; // 元素值不相等,继续向下找 else { for (j=(i+2);j=n;j++) A[j-1]=A[j]; // 删除第i+1个元素 n--; // 表长减1 } } 2-3 已知一个顺序表A中有n个元素,且任何元素均不为0,将A拆成两个线性表B和C,使A中大于0 的元素存放在B中,小于0的元素存放在C中。 算法思想: 依次遍厉A的元素,判断当前的元素值,大于0 者赋给B(假设有p个元素),小于0 者赋给C(假设有q个元素)。 实现本题功能的函数如下: void ret (SqList A, int n, SqList B, int p, SqList C, int q) { int i; p=0;q=0; for (i=0;i=n-1;i++) { if (A[i]0 { p++; B[p]=A[i]; } if (A[i]0) { q++; C[q]=A[i]; } } } 2-4 已知在一维数组A[1,m+n]中依次存放着两个顺序表 ( a1,a2,…,am) 和 (b1,b2,…,bn),编写一个函数将两个线性表的位置互换,即把(b1,b2,…,bn)放到(a1,a2,…,am)的前面。 算法思想: 由于顺序表的插入与删除操作需要移动大量的元素,所用时间多,这里采用先将: A: ( a1,a2,…,am,b1,b2,…,bn) 的所有元素逆置,即使之变为: A:(bn,…, b2 , b1 ,am, …, a2, a1) 然后将(bn,…, b2 , b1 )逆置为(b1,b2,…,bn),将(am, …, a2, a1)逆置为( a1,a2,…,am ),便得到最终结果: A: (b1,b2,…,bn, a1,a2,…,am ) 先编写一个逆置的函数如下,其功能是逆置A中的A[l]到A[h]部分。 逆置的函数如下: void invert (SqList A, int l, int h) { int i,x; for (i=l;i=(l+h)/2;i++) { x=A[i];A[i]=A[l+h-i];A[l+h-i]=x; } //将A[i]与A[l+h-i]元素互换 } 实现本题功能的函数如下: void exchang (SqList A, int m, int n) { invert(A, 0, m+n-1); invert(A,0,n-1); invert(A,n,m+n-1); } 2-5 编写一个函数用不多于3n/2的平均比较次数,在一个顺序表中找出最大和最小值的元素。 算法思想: 如果在查找出最大和最小值的元素时各扫描一遍所有元素,则至少要比较2n次,为此,使用一躺扫描找出最大和最小值的元素。 实现本题功能的函数如下: void maxmin (SqList A, int n) { int max,min,i; max=A[0];min=A[0]; for (i=1;i=n-1;i++)
文档评论(0)