c++是面向对象编程,其中c++的类 数据+函数。数据结构的实现与类的面向对象思想具有一致性。
//线性表—顺序表
#include <cstdlib>
#include <iostream>
using namespace std;
const int MAXSIZE = 100;
using ElemType = int;//可以采用自定义类型,重载类的输入、输出、==、>等
//template <class T>可以采用模板的方法
class SqList
{
private:
ElemType* elem;
int length;
public:
//1.初始化
SqList()
{
elem = new ElemType[MAXSIZE];
if (!elem)
{
cout << "初始化错误!" << endl;
exit(0);
}
length = 0;
}
//存在bug,问题在于Display函数的遍历范围为length-1,而初始化时length定为size,使得数组存在空白?
//问题可能出在用变量size构造动态数组?
/*SqList(int size)
{
elem = new ElemType[size];
if (!elem)
{
cout << "初始化错误!" << endl;
exit(0);
}
length = size;
}
*/
~SqList()
{
delete[]elem;
}
//2.取值(按照位置i)
bool GetElem(const int&i, ElemType& e)
{
if (i<1 || i>length)
{
cout << "位置错误!" << endl;
return false;
}
e = elem[i - 1];
return true;
}
//3.查找(按值查找)
int LocateElem(const ElemType &e)
{
int i;
for (i=0;i<=length-1;i++)
{
if (e == elem[i])
{
return i+1;//实际序号i+1
}
}
return false;//查找失败,返回false
}
//4.插入(按照位置i)
bool ListInsert(const int &i, const ElemType &e)
{
if (i<1 || i>length + 1)
{
cout << "位置错误!" << endl;
return false;
}
if (length == MAXSIZE)
{
cout << "当前存储空间已满!" << endl;//可以在大于等于的情况下再次进行动态分配
return false;
}
/*
if (length >= MAXSIZE)
{
elem = (ElemType*)realloc(elem, (length+1)*sizeof(ElemType));
if (!elem)
{
cout << "分配错误!" << endl;
exit(0);
}
}
*/
int j;
for (j = length - 1; j >= i - 1; j--)
{
elem[j+1] = elem[j];//强记忆点
}
elem[i - 1] = e;
++length;
return true;
}
//5.删除(按照位置i)
bool ListDelete(const int &i)
{
if (i<1 || i>length)
{
cout << "位置错误!" << endl;
return false;
}
int j;
for (j = i; j <= length - 1; j++)
{
elem[j-1] = elem[j];
}
--length;
return true;
}
//修改元素
bool AmendElem(const ElemType &oldelem,const ElemType &newelem)
{
int i = LocateElem(oldelem);
if (!i)
{
cout << "旧元素错误" << endl;
return false;
}
elem[i - 1] = newelem;
return true;
}
//展示顺序表
void Display()
{
int i = 0;
for (i = 0; i <= length - 1; i++)
{
cout << elem[i] << '\t';
}
cout << endl;
}
//重载[]运算符
ElemType& operator[](const int &i)
{
if (i<0 || i>length - 1)
{
cout << "位置错误!" << endl;
exit(0);
}
return elem[i];
}
//顺序表长度
int GetLength()
{
return length;
}
};
int main()
{
SqList list;
int i,num;
ElemType e;
cout << "请输入数据个数:" << endl;
cin >> num;
for (i = 1; i <= num; i++)
{
cout << "input" << endl;
cin >> e;
list.ListInsert(i, e);
}
cout << "原顺序表:" << endl;
list.Display();
cout << "再次添加:" << endl;
cout << "请输入再次添加个数:" << endl;
cin >>num;
for (i = 0; i < num; i++)
{
cin >> e;
if (list.ListInsert(list.GetLength() + 1, e))
{
cout << "再次添加成功" << endl;
}
}
/*
添加一次
cout << "再次添加:" << endl;
cin >> e;
if (list.ListInsert(list.GetLength() + 1, e) )
{
cout << "再次添加成功"<<endl;
}
*/
list.Display();
cout << "operator[]" << endl;
cout <<list[3] << endl;
cout << "删除元素" << endl;
cout << "input" << endl;
cin >> i;
if (list.ListDelete(i))
{
cout << "删除元素成功" << endl;
}
list.Display();
cout << "查找元素的位置:" << endl;
cout << "input" << endl;
cin >> e;
if (!list.LocateElem(e))
{
cout<< "查找失败!" <<endl;
}
else
{
cout << "元素位置为:" << list.LocateElem(e) << endl;
}
cout << "修改元素:" << endl;
ElemType olde, newe;
cout << "input old:" << endl;
cin >> olde;
cout << "input new:" << endl;
cin >> newe;
if (list.AmendElem(olde, newe) )
{
cout << "修改成功" << endl;
}
list.Display();
return 0;
}