问题描述:从有序顺序表中删除值在给定值 s 和 t (s<t)之间的所有元素,如果 s 或 t 不合理或顺序表为空,则显示出错信息并退出程序。
思路分析:可以使用k记录需要保存的元素个数,但是这题有一个特点是线性表是有序表,所以删除的元素必定是相连的整体。
算法设计思想:先寻找值大于等于 s 的第一个元素(第一个要删除的元素),然后寻找值大于 t 的第一个元素(要删除元素的下一个元素),将这段元素删除,后面的元素前移。
代码及结果:
因为大于 t 的第一个元素最终要挪到大于等于 s 的第一个元素的位置,所以直接使用两个变量记录,一个记录大于等于 s 的第一个元素的位置,另一个记录大于 t 的第一个元素的位置,并且两个元素的类型都是局部函数中的最大域变量。
#include<stdio.h> #include "线性表的顺序表示和实现.cpp" bool Del_s_t(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) //所有值均小于s return false; 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; } int main(){ //Test SqList L; //定义一个顺序表 int e; bool flag = InitList_Sq(L); if(flag) printf("构造空的顺序表成功!\n"); else printf("构造顺序表失败!\n"); printf("依次输入要往线性表中输入的元素:"); int i = 0; while(scanf("%d",&e)!=EOF){ ListInsert_Sq(L,++i,e); } printf("顺序表中现有的数据为:"); PrintList(L); flag = Del_s_t(L,4,8); if(!flag) printf("数据不合理或顺序表为空,请检查后重试!\n"); else{ printf("删除4-8之间的元素之后顺序表元素为:"); PrintList(L); printf("当前线性表的长度为:%d\n",L.length); } return 0; }