题目描述:
从顺序表中,删除其值在s与t之间(包含s和t,要求s<t)的所有元素,如果s或t不合理或者顺序表为空则显示出错信息并推出运行。
分析:
这个题目的解决方法和线性表练习题2的解题思路基本一样,可以解决方法有两个,都很容易理解,并且时间复杂度和空间复杂度都不大。
“线性表练习题2”是要求删除值等于x的元素,而该题目要求的是删除介于s和t之间的元素,所以只是判断条件不同而已,其他的完全一样。
思路一:
从头到尾扫描顺序表,我们用i表示扫描的元素的个数,用k记录满足判断条件的元素的个数;
则对于扫描到的每一个元素data[i],进行判断:
如果data[i]满足判断条件,说明该元素是应该被删除的元素,k的值加1(删除该元素的操作是通过后面的元素向前覆盖的过程完成的),
如果data[i]不满足判断条件,说明该元素不应该被删除,则需要将该元素向前移动k个元素,进而实现覆盖前面的应该被删除的元素。
程序代码:
#include<iostream>
using namespace std;
struct Node
{
int *data;
int length;
};
void Show(Node *L)
{
for(int i=0;i<L->length;i++)
cout<<L->data[i]<<" ";
cout<<endl;
}
void Del_s_t(Node *L,int s,int t)
{
int k = 0;
int i = 0;
while(i<L->length)
{
if(L->data[i]>=s&&L->data[i]<=t)
k++;
else
L->data[i-k] = L->data[i];
i++;
}
L->length -= k;
Show(L);
}
int main()
{
Node nde;
int a[10] = {1,2,5,3,4,5,6,7,8,9};
nde.data = a;
nde.length = 10;
int s,t;
cin>>s>>t;
Del_s_t(&nde,s,t);
return 0;
}
运行结果:
4 7
1 2 3 8 9
程序运行过程分析:
思路二:
从头到尾扫描顺序表,我们用i表示扫描的元素的个数,用k记录满足不符合判断条件的元素的个数;
则对于扫描到的每一个元素data[i],进行判断:
如果data[i]不满足判断条件,说明该元素不应该被删除,则k的值加1,并将i对应的数据赋值给k对应的元素
程序代码:
#include<iostream>
using namespace std;
struct Node
{
int *data;
int length;
};
void Show(Node *L)
{
for(int i=0;i<L->length;i++)
cout<<L->data[i]<<" ";
cout<<endl;
}
void Del_s_t(Node *L,int s,int t)
{
int k = 0;
int i = 0;
while(i<L->length)
{
if(L->data[i]<s||L->data[i]>t)
L->data[k++] = L->data[i];
i++;
}
L->length = k;
Show(L);
}
int main()
{
Node nde;
int a[10] = {1,2,5,3,4,5,6,7,8,9};
nde.data = a;
nde.length = 10;
int s,t;
cin>>s>>t;
Del_s_t(&nde,s,t);
return 0;
}
程序运行结果同思路一。
程序运行过程分析: