文章目录
前言
初学数据结构,记录一下这几个最基本的操作。
【id:17】【25分】A. DS顺序表–类实现
题目描述
用C++语言和类实现顺序表
属性包括:数组、实际长度、最大长度(设定为1000)
操作包括:创建、插入、删除、查找
类定义参考
输入
第1行先输入n表示有n个数据,即n是实际长度;接着输入n个数据
第2行输入要插入的位置和新数据
第3行输入要插入的位置和新数据
第4行输入要删除的位置
第5行输入要删除的位置
第6行输入要查找的位置
第7行输入要查找的位置
输出
数据之间用空格隔开
第1行输出创建后的顺序表内容,包括顺序表实际长度和数据
每成功执行一次操作(插入或删除),输出执行后的顺序表内容
每成功执行一次查找,输出查找到的数据
如果执行操作失败(包括插入、删除、查找等失败),输出字符串error,不必输出顺序表内容
输入样例1
6 11 22 33 44 55 66
3 777
1 888
1
9
0
5
输出样例1
6 11 22 33 44 55 66
7 11 22 777 33 44 55 66
8 888 11 22 777 33 44 55 66
7 11 22 777 33 44 55 66
error
error
44
提示
第i个位置是逻辑意义的位置,从1开始,在实际编程用数组,从0开始,对应数组i-1位置
#include<iostream>
using namespace std;
#define ok 0
#define error -1
// 顺序表类定义
class SeqList
{
private:
int *list; // 元素数组
int maxsize; // 顺序表最大长度
int size; // 顺序表实际长度
public:
SeqList(); // 构造函数
~SeqList(); // 析构函数
int list_size()
{
return size;
} // 获取顺序表实际长度
int list_insert(int i, int item)
{
if(i<1 || i>size+1)
{
cout<<"error"<<endl;
return error;
}
for(int j=size;j>i-1;j--)
{
list[j]=list[j-1];
}
list[i-1]=item;
size++;
list_display();
return ok;
} // 插入一个元素,参数是插入的数值和位置
int list_del(int i)
{
if(i<1 || i>size)
{
cout<<"error"<<endl;
return error;
}
for(int j=i-1;j<size;j++)
{
list[j]=list[j+1];
}
size--;
list_display();
return ok;
} // 删除一个元素,参数是删除的位置
int list_get(int i)
{
if(i<1 || i>size)
{
cout<<"error"<<endl;
return error;
}
cout<<list[i-1]<<endl;
return ok;
} // 获取一个元素,参数是获取的位置
void list_display()
{
cout<<size<<" ";
for(int i=0;i<size;i++)
{
cout<<list[i]<<" ";
}
cout<<endl;
} // 输出整个顺序表
void list_initlist()
{
int n;
cin>>n;
if(n>=0 && n<=maxsize)
{
for(int i=0;i<n;i++)
{
cin>>*(list+i);
size++;
}
}
list_display();
} //输入顺序表初始数据
};
SeqList::SeqList()
{
maxsize = 1000;
size = 0;
list = new int[maxsize];
}
SeqList::~SeqList()
{
delete []list;
}
int main()
{
SeqList res;
res.list_initlist();
int it,num;
cin >> it >> num;
res.list_insert(it,num);
cin >> it >> num;
res.list_insert(it,num);
cin >> it;
res.list_del(it);
cin >> it;
res.list_del(it);
cin >> it;
res.list_get(it);
cin >> it;
res.list_get(it);
return 0;
}
【id:18】【25分】B. DS顺序表–连续操作
题目描述
建立顺序表的类,属性包括:数组、实际长度、最大长度(设定为1000)
该类具有以下成员函数:
构造函数:实现顺序表的初始化。
插入多个数据的multiinsert(int i, int n, int item[])函数,实现在第i个位置,连续插入来自数组item的n个数据,即从位置i开始插入多个数据。
删除多个数据的multidel(int i, int n)函数,实现从第i个位置开始,连续删除n个数据,即从位置i开始删除多个数据。
编写main函数测试该顺序表类。
输入
第1行先输入n表示有n个数据,即n是实际长度;接着输入n个数据
第2行先输入i表示插入开始的位置,再输入k表示有k个插入数据,接着输入k个数据
第3行先输入i表示删除开始的位置,再输入k表示要删除k个数据
输出
顺序表内容包括顺序表的实际长度和数据,数据之间用空格隔开
第1行输出创建后的顺序表内容
第2行输出执行连续插入后的顺序表内容
第3行输出执行连续删除后的顺序表内容
输入样例1
6 11 22 33 44 55 66
2 3 99 88 77
4 5
输出样例1
6 11 22 33 44 55 66
9 11 99 88 77 22 33 44 55 66
4 11 99 88 66
#include<iostream>
using namespace std;
class SeqList
{
private:
int* list;
int maxsize;
int size;
public:
SeqList();
~SeqList();
void push_back(int i);
void multiinsert(int i,int n,int item[]);
void multidel(int i, int n);
void display();
};
SeqList::SeqList()
{
maxsize = 1000;
size = 0;
list = new int[maxsize];
}
SeqList::~SeqList()
{
delete[]list;
}
void SeqList::push_back(int i)
{
list[size] = i;
size++;
}
void SeqList::multiinsert(int i, int n, int item[])
{
if (i<0 || i>size+1)
{
cout << "error" << endl;
}
for (int j = size-1; j >= i-1; j--)
{
list[j+n] = list[j];
}
for (int j = i-1, k=0; k < n; j++,k++)
{
list[j] = item[k];
}
size += n;
display();
}
void SeqList::multidel(int i,int n)
{
if (i <= 0 || i > size)
{
cout << "error" << endl;
}
for (int j = i-1; j <= size; j++)
{
list[j] = list[j + n];
}
size -= n;
display();
}
void SeqList::display()
{
cout << size << " ";
for (int i = 0; i < size; i++)
{
cout << list[i] << " ";
}
cout << endl;
}
int main()
{
int n,num;
cin >> n;
SeqList l;
for (int i = 0; i < n; i++)
{
cin >> num;
l.push_back(num);
}
l.display();
int location,k;
cin >> location>>k;
int* p = new int[k];
for (int i = 0; i < k; i++)
{
cin >> p[i];
}
l.multiinsert(location,k,p);
cin >> location >> k;
l.multidel(location, k);
delete[]p;
//system("pause");
return 0;
}
【id:19】【25分】C. DS顺序表–合并操作
题目描述
建立顺序表的类,属性包括:数组、实际长度、最大长度(设定为1000)
已知两个递增序列,把两个序列的数据合并到顺序表中,并使得顺序表的数据递增有序
输入
第1行先输入n表示有n个数据,接着输入n个数据,表示第1个序列,要求数据递增互不等
第2行先输入m表示有m个数据,接着输入m个数据,表示第2个序列,要求数据递增互不等
输出
顺序表内容包括顺序表的实际长度和数据,数据之间用空格隔开
第1行输出创建后的顺序表内容
输入样例1
3 11 33 55
5 22 44 66 88 99
输出样例1
8 11 22 33 44 55 66 88 99
#include<iostream>
using namespace std;
class SeqList
{
private:
int* list;
int maxsize;
int size;
public:
SeqList();
~SeqList();
void push_back(int i);
void display();
void sum(SeqList& a, SeqList& b, SeqList& c);
};
SeqList::SeqList()
{
maxsize = 1000;
size = 0;
list = new int[maxsize];
}
SeqList::~SeqList()
{
delete[]list;
}
void SeqList::push_back(int i)
{
list[size] = i;
size++;
}
void SeqList::sum(SeqList& a, SeqList& b,SeqList& c)
{
int i = 0;
int j = 0;
int k = 0;
while (i < a.size && j < b.size)
{
if (a.list[i] <= b.list[j])
{
c.list[k++] = a.list[i++];
}
else
{
c.list[k++] = b.list[j++];
}
}
while (i < a.size)
{
c.list[k++] = a.list[i++];
}
while (j < b.size)
{
c.list[k++] = b.list[j++];
}
c.size = k;
}
void SeqList::display()
{
cout << size << " ";
for (int i = 0; i < size; i++)
{
cout << list[i] << " ";
}
cout << endl;
}
int main()
{
int l1;
cin >> l1;
int num;
SeqList s1;
for (int i = 0; i < l1; i++)
{
cin >> num;
s1.push_back(num);
}
int l2;
cin >> l2;
SeqList s2;
for (int i = 0; i < l2; i++)
{
cin >> num;
s2.push_back(num);
}
SeqList c;
c.sum(s1, s2,c);
c.display();
system("pause");
return 0;
}
【id:20】【25分】D. DS顺序表之循环移位
题目描述
顺序表的移位是循环移位,例如顺序表:1,2,3,4,5,6。如果左移1位,即原来的头元素移动到末尾,其它元素向左移1位,变成2,3,4,5,6,1。同理,如果右移1位,即原来的尾元素移动到头,其它元素向右移1位,变成6,1,2,3,4,5。以下是移位的多个例子:
原数据:1,2,3,4,5,6
左移3位:4,5,6,1,2,3,与原数据对比
右移4位:3,4,5,6,1,2,与原数据对比
请编写程序实现顺序表的循环移位操作
输入
第1行输入n表示顺序表包含的·n个数据
第2行输入n个数据,数据是小于100的正整数
第3行输入移动方向和移动的位数,左移方向为0,右移方向为1
第4行输入移动方向和移动的位数,左移方向为0,右移方向为1
注意:移动操作是针对上一次移动后的结果进行的
输出
第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开
第二行输出第一次移位操作后,顺序表内的所有数据,数据之间用空格隔开
第三行输出第二次移位操作后,顺序表内的所有数据,数据之间用空格隔开
输入样例1
5
11 22 33 44 55
0 2
1 4
输出样例1
11 22 33 44 55
33 44 55 11 22
44 55 11 22 33
#include<iostream>
using namespace std;
class SeqList
{
private:
int* list;
int maxsize;
int size;
public:
SeqList();
~SeqList();
void push_back(int i);
void display();
void move(int flag, int n);
};
SeqList::SeqList()
{
maxsize = 1000;
size = 0;
list = new int[maxsize];
}
SeqList::~SeqList()
{
delete[]list;
}
void SeqList::push_back(int i)
{
list[size] = i;
size++;
}
void SeqList::display()
{
for (int i = 0; i < size; i++)
{
cout << list[i] << " ";
}
cout << endl;
}
void SeqList::move(int flag, int n)
{
int* temp = new int[size]; //temp相当于一个副本,原数组可以直接进行操作来修改
for (int i = 0; i < size; i++)
{
temp[i] = list[i];
}
if (!flag) //左移
{
for (int i = 0; i < size - n; i++) //到头之前
{
list[i] = temp[i + n];
}
for (int i=size - n; i < size; i++) //循环
{
list[i] = temp[i - (size - n)];
}
display();
}
else //右移
{
for (int i = n; i < size; i++)
{
list[i] = temp[i - n];
}
for (int i = 0; i < n; i++)
{
list[i] = temp[size - n + i];
}
display();
}
delete[]temp;
}
int main()
{
int n,num;
cin >> n;
SeqList s;
for (int i = 0; i < n; i++)
{
cin >> num;
s.push_back(num);
}
s.display();
int flag = 0;
int location = 0;
cin >> flag >> location;
s.move(flag, location);
cin >> flag >> location;
s.move(flag, location);
//system("pause");
return 0;
}
总结
顺序表相关操作不熟练…