今天帮老师判数据结构作业,有两个顺序表的题目感觉很有意思,同时又感觉这两个题都很像,因此就写成代码试了一下,虽然不难,但是也很有启发。题目要求是删除一个非降序顺序表中所有的重复元素,并且使空间复杂度为O(1).另一个题目是删除顺序表中值的范围在[x,y]之间的所有数,这个顺序表可以是乱序的,但是也要求算法空间复杂度为O(1).代码如下:
/*本文档实现两个基本的操作:去除非降序顺序表中的重复的元素、根据给定的范围删除顺序表中的元素,空间复杂度为O(1)
*/
#include<iostream>
#define arrsize 1000
using namespace std;
struct SqList{
int data[arrsize];
int element;
SqList()
{
element=-1;
}
};
void out(SqList s)
{
for(int i=0;i<=s.element;i++)
{
cout<<s.data[i]<<" ";
}
cout<<endl;
}
void remove(SqList *s) //去除非降序顺序表中的重复元素
{
if(s->element==-1)
return ;
int i=0,j;
for(int j=1;j<=s->element;j++)
{
if(s->data[j]!=s->data[i])
{
i++; s->data[i]=s->data[j];
}
}
s->element=i;
}
void remove_val(SqList *s,int x,int y) // 删除数组中,值的范围在[x,y]中间的数。要求x<=y
{
if(s->element==-1) return ;
int i=-1,j;
for(int j=0;j<=s->element;j++)
{
if(s->data[j]<x || s->data[j]>y)
{
i++;s->data[i]=s->data[j];
}
}
s->element=i;
}
int main(int argc, char const *argv[])
{
SqList s;
int num[10]={3,3,4,5,9,9,9,10,15,15};//定义一个升序数组
for(int i=0;i<10;i++)
{
s.data[i]=num[i]; s.element++; //将num数组的值赋给s
}
out(s);//先输出s,结果为{3,3,4,5,9,9,9,10,15,15}
remove(&s);
out(s);//输出s,结果为{3,4,5,9,10,15}
SqList sq;
int num2[10]={15,13,4,5,9,8,9,10,7,15};//定义一个升序数组
for(int i=0;i<10;i++)
{
sq.data[i]=num2[i]; sq.element++; //将num数组的值赋给s
}
out(sq);
remove_val(&sq,4,9);
out(sq);
return 0;
}
是不是很像。。。