#include<iostream>
using namespace std;
#define Maxsize 100
#define LIST_INCREMENT 100
class sqlist {
public:
int* elem;
int length, listsize;//分别表示总空间大小以及长度
//1,InitList
bool InitList(sqlist& L) {
L.elem = new int[Maxsize];
if (!L.elem)
return 0;
L.length = 0;
L.listsize = Maxsize;
return 1;
}
//2,Destroy
void Destroy(sqlist& L) {
if (L.elem)
delete[] L.elem;
L.length = 0;
L.listsize = 0;
}
//3,ClearList
bool ClearList(sqlist &L)
{ /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
L.length = 0;
return 1;
}
//4,ListEmpty
bool ListEmpty(sqlist L)
{
if (L.length == 0)
{
return 1;
}
else
{
return 0;
}
}
//5,ListLength
int ListLength(sqlist L)
{ /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
return L.length;
}
//6,GetElem
int GetElem(sqlist L, int i, int& e) {
if ((i < 1) || (i > L.length)) {
cout << "i不在合法范围内" << endl;
return 0;
}
return e = *(L.elem + i - 1);
}
//7 LocateElem
int LocateElem(sqlist L, int e, bool(*compare)(int, int)) {
int i = 1;
int* p = L.elem;
while ((i <= L.length) && (!compare(*(p++), e))) {
i++;
}
if (i <= L.length) {
return i;
}
else {
cout << "未找到" << endl;
return 0;
}
}
//8 PriorElem
int PriorElem_Sq(sqlist L, int cur_e, int& pre_e) {
int i = 2;
int* p = L.elem + 1;
while ((i <= L.length) && (*p != cur_e)) {
p++;
i++;
}
if (i <= L.length) {
pre_e = *(--p);
return pre_e;
}
else {
return 0;
}
}
//9 NextElem
int NextElem_Sq(sqlist L, int cur_e,int& next_e) {
int i = 1;
int* p = L.elem;
while ((i < L.length) && (*p != cur_e)) {
p++;
i++;
}
if (i == L.length) {
return 0;
}
else {
next_e = *(++p);
return next_e;
}
}
//10ListInsert_Sq
bool ListInsert_Sq(sqlist& L, int i, int e) {
int* newbase, * q, * p;
if ((i < 1) || (i > (L.length + 1))) {
return 0;
}
if (L.length == L.listsize) {
newbase = (int*)realloc(L.elem, (L.listsize + LIST_INCREMENT) * sizeof(int));
if (!newbase) {
exit(-1);
}
L.elem = newbase;
L.listsize += LIST_INCREMENT;
}
q = L.elem + i - 1;
for (p = (L.elem + L.length - 1); p >= q; p--) {
*(p + 1) = *p;
}
*q = e;
L.length++;
return 1;
}
//11 ListDelete_Sq
bool ListDelete_Sq(sqlist & L, int i, int& e){
int* p, * q;
if ((i < 1) || (i > L.length)) {
return 0;
}
p = L.elem + i - 1;
e = *p;
q = L.elem + L.length - 1;
for (p++; p <= q; p++) {
*(p - 1) = *p;
}
L.length--;
return 1;
}
//12 ListTraverse_Sq
bool ListTraverse_Sq(sqlist L, void (*visit)(int&)) {//引用
int* p = L.elem;
int i;
for (i = 1; i <= L.length; i++) {
visit(*(p++));
}
cout<<endl;
return 1;
}
};
//输出顺序表中的所有数据元素
void visit(int& e) {
cout<< " "<<e;
}
bool compare(int e1, int e2) {
if (e1 == e2) {
return 1;
}
else {
return 0;
}
}
int main() {
//定义顺序表L
sqlist L;
//1 创建一个空的顺序表L
L. InitList(L);
//10 初始化顺序表L
int n = 10;//需要向顺序表L中插入10个数据元素
for (int i = 1; i <= n; i++) {//i表示顺序表L中数据元素的位序
L. ListInsert_Sq(L, i, i);//向顺序表L中插入数据元素
}
//12 输出顺序表L中的所有数据元素
cout<<"顺序表L中的所有数据元素为"<<endl;//依次输出顺序表L中的数据元素
L.ListTraverse_Sq(L, visit);
//4 判断顺序表L是否为空表
cout << "若输出1,则顺序表L为空表;若输出0,则顺序表L不为空表:"<<L.ListEmpty(L)<<endl;
//5 输出顺序表L中的数据元素个数
cout<<"顺序表L中的数据元素个数为:"<<L.ListLength(L)<<endl ;
//6 获取顺序表L中第i个数据元素
int e=0, i = 5;//i表示数据元素的位序
cout << "顺序表L中第i个数据元素为" <<L.GetElem(L, i, e)<< endl;//将第i个数据元素存于e中
//7 输出顺序表L中与指定数据元素满足一定关系的数据元素的位序(此实例中为相等关系)
int e1 = 4;//e1为指定的数据元素
cout << "与"<<e1<<"具有相等关系的数据元素的位序为:" << L.LocateElem(L,e1, compare) << endl;//返回顺序表L中与e具有相等关系的数据元素的位序
//8 输出指定数据元素的前驱
int e2 = 5;//e2为指定的数据元素
int pre_e2 = 0;//pre_e2用于存储e2的前驱
cout << e2<<"的前驱为:" << L.PriorElem_Sq(L, e2, pre_e2)<<endl;//获取e2的前驱并将其存于pre_e2中
//9 输出指定数据元素的后继
int e3 = 4;//e3为指定的数据元素
int next_e3 = 0;//next_e3用于存储e3的后继
cout << e3<<"的后继为:"<< L.NextElem_Sq(L, e3, next_e3)<<endl;//获取e3的后继并将其存于next_e3中
//10 向顺序表中插入指定数据元素
int i1 = 4;//i1为插入位置的位序
int e4 = 25;//e4为要出入的指定数据元素
cout << "插入数据元素前,顺序表L的长度和存储空间大小分别为:" <<endl<< L.length << " "<<L.listsize << endl;
L.ListInsert_Sq(L, i1, e4);//向顺序表L中插入e4
cout<<"插入数据元素后,顺序表L的长度和存储空间大小分别为:"<<endl<< L.length<<" " <<L.listsize << endl;
cout << "插入数据元素后,顺序表L的所有数据元素为:" << endl;
L.ListTraverse_Sq(L, visit);
//11 向顺序表中删除指定数据元素
int i2 = 3;//i2为删除位置的位序
int e5 = 0;//e5用于存储被删除的数据元素
cout << "删除数据元素前,顺序表L的长度和存储空间大小分别为:" << endl<< L.length << " " << L.listsize << endl;
L.ListDelete_Sq(L, i2, e5);//删除顺序表L中位序为i2的数据元素并将其存于e5中
cout << "删除数据元素后,顺序表L的长度和存储空间大小分别为:" << endl<< L.length << " "<< L.listsize << endl;
cout << "删除的数据元素为:" << e5 << endl;
cout<<"删除数据元素后,顺序表L的所有数据元素为:"<<endl;
L.ListTraverse_Sq(L, visit);
//将顺序表重置为空表
cout<<"(顺序表L重置为空表前)若输出1,则顺序表L为空表;若输出0,则顺序表L不为空表:"<< L.ListEmpty(L)<<endl;
L.ClearList(L);//将顺序表L值为空表
cout<<"(顺序表L重置为空表后)若输出1,则顺序表L为空表;若输出0,则顺序表L不为空表:"<< L.ListEmpty(L)<<endl;
//销毁顺序表
cout<<"(销毁顺序表L前)顺序表L的基地址、长度和存储空间大小分别为:" << endl <<L.elem << " " << L.length << " " << L.listsize<<endl;
L.Destroy(L);//销毁顺序表L
cout << "(销毁顺序表L后)顺序表L的基地址、长度和存储空间大小分别为:" << endl << L.elem << " " << L.length <<" " << L.listsize << endl;
return 0;
}
12-18