题解
- 这道顺序表的题在查找操作这里容易踩坑,这里用的是课本上查找单元中的顺序查找的方式,即数组要从下标1开始存数,每次查找将带查找元素放在下标0的位置,比较时从后往前比较,所以如果查找失败比较次数为n+1。
- 这里是通过后面元素前移来实现删除表中某个元素,相对来说比之前的冒泡删除要好一点。
题目
问题 A: 顺序表练习
时间限制: 1 Sec 内存限制: 128 MB
提交: 822 解决: 158
[提交][状态][讨论版]
题目描述
给出顺序表的初始数据,实现顺序表的定义、创建、插入、删除与查找操作。
输入
测试次数t
每组测试数据格式如下:
第一行: 正整数n,后跟n个整数
第二行: 插入位置 插入元素
第三行: 删除位置
第四行: 删除元素
第五行: 查找元素
输出
对每个顺序表,首先输出建表后的顺序表。
插入、删除操作,操作成功,输出操作后的顺序表。操作不成功,输出ERROR。
查找操作,查找成功,输出:1 元素位置(位置从1开始)比较次数。查找不成功,输出:0 0 比较次数。
样例输入
2
5 10 20 14 25 50
1 13
10
10
23
7 88 99 77 11 22 33 44
7 100
1
80
22
样例输出
5 10 20 14 25 50
6 13 10 20 14 25 50
ERROR
5 13 20 14 25 50
0 0 6
7 88 99 77 11 22 33 44
8 88 99 77 11 22 33 100 44
7 99 77 11 22 33 100 44
ERROR
1 4 4
代码块
#include <iostream>
using namespace std;
class SqList
{
private:
int n;
int *list;
public:
SqList();
~SqList();
void Insert(int loc, int e);
void DeleteLoc(int loc);
void DeleteElem(int e);
void Search(int e);
void Display();
};
SqList::SqList()
{
cin>>n;
list = new int[1000];
for(int i=0; i<n; i++)
cin>>list[i];
Display();
}
SqList::~SqList()
{
delete []list;
}
void SqList::Insert(int loc, int e)
{
if(loc>=1 && loc<=n+1)
{
for(int i=n-1; i>=loc-1; i--)
list[i+1] = list[i];
list[loc-1] = e;
n++;
Display();
}
else
cout<<"ERROR"<<endl;
}
void SqList::DeleteElem(int e)
{
int i;
for(i=0; i<n; i++)
if(list[i]==e)
break;
if(i==n)
cout<<"ERROR"<<endl;
else
{
for(int j=i; j<n-1; j++)
list[j] = list[j+1];
n--;
Display();
}
}
void SqList::DeleteLoc(int loc)
{
if(loc>=1 && loc<=n)
{
for(int i=loc-1; i<n-1; i++)
list[i] = list[i+1];
n--;
Display();
}
else
cout<<"ERROR"<<endl;
}
void SqList::Search(int e)
{
int i;
for(i=n-1; i>=0; i--)
if(list[i]==e)
break;
if(i==-1)
cout<<"0 0 "<<n+1<<endl;
else
cout<<"1 "<<i+1<<' '<<n-i<<endl;
}
void SqList::Display()
{
cout<<n<<' ';
for(int i=0; i<n; i++)
cout<<list[i]<<' ';
cout<<endl;
}
int main(void)
{
int t;
cin>>t;
while(t--)
{
SqList myList;
int loc, e;
cin>>loc>>e;
myList.Insert(loc, e);
cin>>loc;
myList.DeleteLoc(loc);
cin>>e;
myList.DeleteElem(e);
cin>>e;
myList.Search(e);
}
return 0;
}