顺序表练习

题解
  1. 这道顺序表的题在查找操作这里容易踩坑,这里用的是课本上查找单元中的顺序查找的方式,即数组要从下标1开始存数,每次查找将带查找元素放在下标0的位置,比较时从后往前比较,所以如果查找失败比较次数为n+1。
  2. 这里是通过后面元素前移来实现删除表中某个元素,相对来说比之前的冒泡删除要好一点。
题目
问题 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值