王道 数据结构 p17 第3题
对长度为n的顺序表L, 编写一个时间复杂度为0(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素.
#include<iostream>
#define InitSize 100
#define arrLen 7
using namespace std;
typedef struct { //声明一个动态分配内存的顺序表
int *data;
int len,MaxSize;
}SeqList;
void init(SeqList &L){ //初始化顺序表
L.data=new int[InitSize];
L.len=0;
if(L.data!=NULL)
cout<<"success!" <<endl;
else
cout<<"faild"<<endl;
}
void input(SeqList &L){ //给顺序表输入数值
for(int i=0;i<arrLen;i++)
{
cout<<"请输入第"<<i+1<<"个数字:";
cin>>L.data[i];
L.len++;
}
}
void output(SeqList &L) //输出顺序表
{
for(int i=0;i<L.len;i++)
{
cout<<L.data[i]<<" ";
}
cout<<endl;
}
/*此方法时间复杂度不够 ×××
void deleteNum(SeqList &L,int minIndex)
{
for(int j=minIndex;j<L.len;j++)
{
L.data[j]=L.data[j+1];
}
L.len--;
}
void deleteX(SeqList &L,int x)
{
for(int i=0;i<L.len;i++)
{
if(L.data[i]==x)
deleteNum(L,i);
}
}*/
/*
法一:用k统计顺序表中为x的元素
void deleteX(SeqList &L,int x)
{
int k=0;
for(int i=0;i<L.len;i++)
{
if(L.data[i]==x)
k++;
else
L.data[i-k]=L.data[i]; //前移k个元素
}
L.len-=k;
}
*/
//法二:用k统计顺序表中不为x的元素
void deleteX(SeqList &L,int x)
{
int k=0;
for(int i=0;i<L.len;i++)
{
if(L.data[i]!=x)
{
L.data[k]=L.data[i]; //妙妙妙
k++;
}
}
L.len=k;
}
int main(){
SeqList L;
init(L);
input(L);
cout<<endl<<"删除前:" ;
output(L);
int x=0;
cout<<endl<<"请输入要删除的元素:";
cin>>x;
deleteX(L,x);
cout<<endl<<"删除后:" ;
output(L);
return 0;
}