题解
- 题中说i和j的值合法不代表loc的值合法
- 这题在Unique这里遇到了点问题,这里Unique中是通过调用Delete函数来删除重复节点,而Delete只是通过将元素移到最后并且len–来删,这就会导致Unique一直循环。
题目
问题 A: 线性表操作(list)
时间限制: 1 Sec 内存限制: 128 MB
提交: 163 解决: 42
[提交][状态][讨论版]
题目描述
线性表最基本、最简单、也是最常用的一种数据结构。一个线性表是n个具有相同特性的数据元素的有限序列。用list容器存储m个线性表(m<10),并实现线性表的以下操作。
insert i loc e:在第i个表的第loc位置插入元素e。表位置从1开始,有效插入位置1 ~ 表长+1。
delete i loc : 删除第i表的第loc个元素。
merge i j:使用sort方法对第i,j个表升序排序,再使用merge方法将第j个表合并到第i个表。
unique i : 对第i个表降序排序,使用unique方法删除重复元素。
display i: 输出第i个表元素个数及各元素。
所有操作的表序号i,j输入均合法。位置lco, 元素e均为整数,注意判断插入和删除的位置loc。
输入
第一行:表个数m(>0)
第二行到第m+1行,每行一个表的数据,格式为:数据个数n, 后跟n个整数。
第m+2行:操作次数t,后跟t行,每行一个操作,见题目描述。
输出
对t个操作,分别输出一行,输出操作后的表。具体输出格式见样例。
样例输入
3
10 43 54 23 12 76 -4 53 50 34 10
3 3 243 12
6 3 12 32 42 53 50
7
insert 1 1 15
delete 2 3
merge 2 3
unique 2
display 3
delete 1 1
insert 1 12 200
样例输出
11 15 43 54 23 12 76 -4 53 50 34 10
2 3 243
8 3 3 12 32 42 50 53 243
7 243 53 50 42 32 12 3
0
10 43 54 23 12 76 -4 53 50 34 10
10 43 54 23 12 76 -4 53 50 34 10
代码块
#include <iostream>
using namespace std;
class SqList
{
private:
int n;
int *num;
int **list;
void InBubbleSort(int i);
void DeBubbleSort(int i);
public:
SqList();
~SqList();
void Insert(int i, int loc, int e);
void Delete(int i, int loc);
void Merge(int i, int j);
void Unique(int i);
void Display(int i);
};
SqList::SqList()
{
cin>>n;
num = new int[n];
list = new int*[n];
for(int i=0; i<n; i++)
{
cin>>num[i];
list[i] = new int[1000];
for(int j=0; j<num[i]; j++)
cin>>list[i][j];
}
}
SqList::~SqList()
{
delete []num;
for(int i=0; i<n; i++)
delete []list[i];
delete []list;
}
void SqList::Insert(int i, int loc, int e)
{
if(loc>0 && loc<=num[i-1]+1)
{
int k;
for(k=num[i-1]-1; k>=loc-1; k--)
list[i-1][k+1] = list[i-1][k];
list[i-1][loc-1] = e;
num[i-1]++;
}
}
void SqList::Delete(int i, int loc)
{
if(loc>0 && loc<=num[i-1])
{
list[i-1][loc-1] = 9999998;
for(int k=loc-1; k<num[i-1]-1; k++)
{
int temp = list[i-1][k];
list[i-1][k] = list[i-1][k+1];
list[i-1][k+1] = temp;
}
num[i-1]--;
}
}
void SqList::InBubbleSort(int i)
{
for(int k=0; k<num[i-1]-1; k++)
for(int j=0; j<num[i-1]-k-1; j++)
{
if(list[i-1][j]>list[i-1][j+1])
{
int temp = list[i-1][j];
list[i-1][j] = list[i-1][j+1];
list[i-1][j+1] = temp;
}
}
}
void SqList::DeBubbleSort(int i)
{
for(int k=0; k<num[i-1]-1; k++)
for(int j=0; j<num[i-1]-k-1; j++)
{
if(list[i-1][j]<list[i-1][j+1])
{
int temp = list[i-1][j];
list[i-1][j] = list[i-1][j+1];
list[i-1][j+1] = temp;
}
}
}
void SqList::Merge(int i, int j)
{
int k, w;
InBubbleSort(i);
InBubbleSort(j);
for(k=0; k<num[j-1]; k++)
{
for(w=0; w<num[i-1]; w++)
{
if(list[i-1][w]>list[j-1][k])
break;
}
Insert(i, w+1, list[j-1][k]);
}
num[j-1] = 0;
Display(i);
}
void SqList::Unique(int i)
{
DeBubbleSort(i);
for(int j=0; j<num[i-1]-1; j++)
{
while(list[i-1][j]==list[i-1][j+1])
Delete(i, j+2);
}
Display(i);
}
void SqList::Display(int i)
{
if(num[i-1]==0)
cout<<'0'<<endl;
else
{
cout<<num[i-1]<<' ';
for(int j=0; j<num[i-1]; j++)
{
if(j!=num[i-1]-1)
cout<<list[i-1][j]<<' ';
else
cout<<list[i-1][j]<<endl;
}
}
}
int main(void)
{
SqList myList;
int n;
cin>>n;
for(int k=0; k<n; k++)
{
int i, j, loc, e;
string s;
cin>>s;
if(s=="insert")
{
cin>>i>>loc>>e;
myList.Insert(i, loc, e);
myList.Display(i);
}
else if(s=="delete")
{
cin>>i>>loc;
myList.Delete(i, loc);
myList.Display(i);
}
else if(s=="merge")
{
cin>>i>>j;
myList.Merge(i, j);
}
else if(s=="unique")
{
cin>>i;
myList.Unique(i);
}
else if(s=="display")
{
cin>>i;
myList.Display(i);
}
}
}