2025年3月13日 星期四 甲辰(龙)年 月十二 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

C语言从有序顺序表中删除其值在给定值s与t之间的所有元素

时间:01-03来源:作者:点击数:135

这里涉及到数据结构中顺序表的实现、删除、插入、查找等知识,请查看:数据结构 -> 线性表

问题描述:

问题1):从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,如果s或t 不合理或者顺序表为空则显示出错信息并退出运行。

问题2):从顺序表中删除其值在给定值s与t之间(包含s和t,要求s<t)的所有元素,如果 s或t不合理或者顺序表为空则显示出错信息并退出运行。

问题解答:

注意,因为是有序表,所以删除的元素必然是相连的整体。

问题1):

算法思想:先寻找值大于等于s的第一个元素(第一个删除的元素),然后寻找值>t 的第一个元素(最后一个删除的元素的下一个元素),要将这段元素删除,则只需直接将后面的元素前移即可。

  • bool Del_s_t2(sqList &L, ElemType s, ElemType t){
  • //删除有序顺序表L中值在给定值s与t之间的所有元素
  • int i,j;
  • if(s>=t) || L.length==0)
  • return false;
  • for (i=0; i<L.length && L.data[i] <s; i++) ; //寻找值>=s 的第一个元素
  • if(i>=L.length)
  • return false; //所有元素值均小于s,则返回
  • for(j=i; j<L.length && L.data[j] <=t; j++) ; //寻找值>t 的第一个元素
  • for(;j<L.length;i++, j++)
  • L.data[i]=L.data[j]; //前移,填补被删元素位置
  • L.length=i;
  • return true;
  • }

问题2):

算法思想:从前向后扫描顺序表L,用k记录下元素值在s到t之间元素的个数(初始时k=0)。对于当前扫描的元素,若其值不在s到t之间,则前移k个位置;否则,删除该元素,并执行k++。由于这样每个不在s到t之间的元素仅移动一次,所以算法效率高。

本题代码如下:

  • bool Del_s_t (sqList &Lf ElemType s, ElemType t) {
  • //删除顺序表L中值在给定值s与t之间(要求s<t)的所有元素
  • int i,k=0;
  • if (L.length==0 || s>=t)
  • return false; //线性表为空或s、t不合法,返回
  • for(i=0;i<L.length;i++){
  • if (L.data[i] >= s && L.data[i] <= t)
  • k++;
  • else
  • L.data [i-k] = L.data[i]; //当前元素前移 k 个置
  • } //for
  • L.length-=k; // 长度减小
  • return true;
  • }

注意:本题也可以从后向前扫描顺序表,每遇到一个值在S到t之间的元素,则删除该元素,其后的所有元素全部前移。但移动次数远大于前者,效率不够高。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门