数据结构-第2章(上)-习题程序

 1、编写算法,实现从顺序表中删除具有最小值的元素,并由函数返回被删除元素的值

答案想法: 使用SeqList定义对象L,作为函数的参数输入

利用if判断SeqList类的对象L,的长度Length是否0xxx

接下来求解序列的最小元素,需要先假定一个位置变量pos,用于存储和比较——后面先用for不断的循环L.length的长度,然后在内部利用if比较,若不符合,则介入中间值进行调换的工作

——其中if的比较需要将Object类L,转化为Integer类的数值,然后对于Integer类L的对象listElem的第i(已经调换)个元素((Integer)L.listElem[i]).intValue()

最后再利用delete(i)函数进行元素删除,也可以直接进行for循环,从pos+1开始,利用L.listElem[i-1]=L.listElem[i]的逐个向前推进

初始想法: 遍历找出序列中的最小值(算不上排序算法,排序算法是对于整个序列,而这个只是需要一个数而已,其他的数列为乱序没有关系)

delete(i)删除该元素,i是序号怎么办?

使用indexOf()得出序号,再返回删除?

如果遍历时为Null,一开始不知道n具体是多少,得先测算a=L.length还是L.size来着?

 

 2、已知A,B,C为3个递增且有序的顺序表,实现删除A表中又在B表,又在C表的所有元素

—— 注意是:三个表都有的元素(所以可以任意的有先后的两两比较——利用好这三个表递增的特性

初始想法: 首先SeqList定义A,B,C三个对象 for循环遍历A组的元素,然后放入B,C中均利用查找算法求解(查找算法的使用?——折半查找法,有点递归的思想)

 3、从有序顺序表中删除其值在s和t之间的所有元素 答案思路: 如果s比t大,就退出 如果SeqList L的length小于等于0则退出 先利用两个外层的for循环定位好s和t的边界值:  

for(xx;((Integer)L.listElem[i]).intValue()<s;i++) for(xx;((Integer)L.listElem[j]).intValue()<s;j++)

定位完毕之后,对于该区间内的进行删除,相当于直接将后面的元素覆盖该区段的元素,以j的移动是否超纲作为节点 for(;j<L.curLen;i++,j++)   L.listElem[i]=L/listElem[j];

初始想法: 如果s比t大,就退出 如果SeqList L的length小于等于0则退出 满足正常情况下  SeqList L; L.getData()>s || L.getData()<t;  i=L.getData().indexOf();  delete(i)

 

 4、实现从顺序表中删除所有重复的元素

答案思路:没有必要再重头遍历,直接就此元素开始往后即可,因为重复之后来回都还是得比较的 for xxxx  

for(xx;j<L.curLen;j++) 用equals函数实现判断if(L.listElem[i].equals(L.listElem[j]))

再用前后推移,实现删除L.listElem[k-1]=xxx.[k]

初始想法:两次循环for循环,一次for,一次while也行 isequals()

 5、上面的基础上,该顺序表是有序的,如何进一步充分的利用其有序的条件进行删除重复

首先利用for循环为日后的特殊情况i的判断做好基础for(xx;i<L.curLen;i++)

判断该特定位置i的相邻位置情况

while(xxx[i].equalsxxx[j])其中j=i+1;成功之后让j++

知道找出最终相邻的位置j为止

然后再在其中设置循环用于删除从i-j这几个重复的元素for(k=i+1;j<curLen;k++,j++) L.listElem[k]=L.listElem[j]

初始想法,直接跟后面的1位数比较相同则删除(此处介入循环,可以解决后面多位数重复的情况),如果不同则退出,继续遍历

 

 6、编写算法,实现两个有序顺序表的合并新的有序顺序表

初始想法: 对于SeqList A B 使得序号数为i,j 如果L[i].elenElem>xxx[j]

——先全部后移(内涵for循环)

——然后再j++ 如果L[i]<L[j]——保持原序列不动,i++

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值