#include<iostream>
using namespace std;
#define MaxSize 10
typedef int ElemType;
typedef struct {
ElemType* elem;
int length;
}SqList;
//初始化
bool initList(SqList &L) {
L.elem = new int[MaxSize];
if (!L.elem) return false;
L.length = 0;
return true;
}
//输入数据
void Input(SqList& L,int n) {
if (n > MaxSize) {
cout << "太多了,放不下" << endl;
return;
}
cout << "请输入数据:";
for (int i = 0; i < n; i++){
cin >> L.elem[i];
}
L.length = n;
}
//输出
void Show(SqList L) {
for (int i = 0; i < L.length; i++)
cout << L.elem[i] << " ";
}
//取出位置的元素
int getElem(SqList L,int i){
if (i > L.length || i <= 0) {
cout << "没有哦";
return -1; }
return L.elem[i - 1];
}
//表长
int getLength(SqList L) {
return L.length;
}
//插入
bool insertList(SqList& L, int i,ElemType e) {
if (L.length >= MaxSize) {
cout << "空间满了,放不下"<<endl;
return false;
}
if (i <= 0 || i >L.length+1) {
cout << "插入的位置不对";
return false;
}
for (int j = L.length - 1; j > i-2; j--)
L.elem[j + 1] = L.elem[j];
L.elem[i - 1] = e;
L.length++;
return true;
}
//删除
bool ListDelete(SqList& L, int i, ElemType& e) {
//删除顺序表的第 i 个元素,用e返回被删元素的值
if (i<1 || i>L.length) return false; //i非法
//ElemType* p = L.elem + i - 1;//令指针p指向ai,p=L.elem+i-1;
//e = *p;
//for (p++; p <= L.elem + L.length - 1; p++)
// *(p - 1) = *p; //ai+1…an左移一位
//L.length--; //表的长度减1
//return true;
e = L.elem[i - 1];
for (int j = i; j < L.length; j++)
L.elem[j - 1] = L.elem[j];
L.length--;
return true;
} //ListDelete
//判空
bool EmptyList(SqList L) {
if (L.length == 0) return true;
return false;
}
//合并
void MergeList(SqList La, SqList Lb, SqList& Lc) {
//将有序线性表La和Lb归并成有序线性表Lc
int i, j; i = j = 1; int k = 0; initList(Lc); //初始化
int ai,bj;
int La_len = getLength(La); int Lb_len = getLength(Lb);//求表长
while (i <= La_len && j <= Lb_len) { //La和Lb均非空
ai=getElem(La, i); bj=getElem(Lb, j );//读ai和bj
if (ai <= bj) { insertList(Lc, ++k, ai); i++; }
else { insertList(Lc, ++k, bj); j++; }
}
while (i <= La_len) { //La中剩余元素一一插入Lc
ai=getElem(La, i++); insertList(Lc, ++k, ai);
}
while (j <= Lb_len) { //Lb中剩余元素一一插入Lc
bj=getElem(Lb, j++); insertList(Lc, ++k, bj);
}
}// MergeList
//查找元素
int LocateElem(SqList& L, ElemType e) {
//ElemType* p = L.elem; int i = 1;
//while (i <= L.length && *p++ != e) i++;
//return i <= L.length ? i : 0;
for (int i = 0; i < L.length; i++)
if (L.elem[i] == e) return i;
return -1;
}
//销毁线性表:
void DestroyList(SqList& L) {
//释放顺序表L所占的空间
delete[] L.elem;
L.length = 0;
}
//逆置顺序表
void Invert(ElemType* E,int s, int t) {
//将数组E自下标s至下标t之间的元素逆置
int temp;
while (s < t) {
temp = E[s];
E[s]=E[t];
E[t] = temp;
s++; t--;
}
}
void InvertSqList(SqList& L) {
//将顺序表L中的所有元素逆置
Invert(L.elem, 0, L.length - 1);
}
//交换
void Exchange(SqList L, int m) {
//将顺序表L中前m个元素与后L,length-m个元素互换位置
Invert(L.elem, 0, m - 1);
Invert(L.elem, m, L.length - 1);
Invert(L.elem, 0, L.length - 1);
}
//提纯
void purge(SqList& A, SqList& B) {
//已知A为空顺序表,B可能为非纯顺序表
//将顺序表B中所有不同值的元素插入A(纯表)中,然后销毁B
A.elem[0] = B.elem[0]; A.length = 1;
for (int i = 1; i < B.length; i++) {
ElemType e = B.elem[i]; int j = 0;
while (j < A.length && e != A.elem[j]) j++;
if (j == A.length) A.elem[A.length++] = e;
}//for
delete[]B.elem; B.length = 0;
}
int main() {
SqList L; SqList La, Lb, Lc; SqList A;
int data;
do {
cout << endl;
cout << "\t 1 顺序表的初始化" << endl;
cout << "\t 2 顺序表的输入" << endl;
cout << "\t 3 顺序表的位置查找" << endl;
cout << "\t 4 顺序表的显示" << endl;
cout << "\t 5 顺序表的插入" << endl;
cout << "\t 6 顺序表删除某个元素" << endl;
cout << "\t 7 两个有序表的合并" << endl;
cout << "\t 8 顺序表的按位置删除" << endl;
cout << "\t 9 顺序表的逆置" << endl;
cout << "\t 10 顺序表的前m个元素与后n个元素互换" << endl;
cout << "\t 11 将顺序表B中所有不同值的元素插入A(纯表)中,然后销毁B" << endl;
cout << "\t 0 退出操作" << endl;
cin >> data;
if (data == 1)
{
initList(L);
//cout << L.elem << endl;
}
else if (data == 2)
Input(L, 5);
else if (data == 3)
cout << "第3个位置的元素为:" << getElem(L, 3) << endl;
else if (data == 4)
{
cout << "表中的元素为:";
Show(L);
}
else if (data == 5)
insertList(L,3,9);
else if (data == 7) {
initList(La);
initList(Lb);
initList(Lc);
cout << "请输入由4个数字构成的有序数列:";
Input(La,4);
cout << "请输入由4个数字构成的有序数列:";
Input(Lb,5);
MergeList(La, Lb, Lc);
Show(Lc);
}
else if (data == 8) {
ElemType e;
ListDelete(L, 2, e);
cout << "删除的元素是" << e;
}
else if (data == 9) {
InvertSqList(L);
Show(L);
}
else if (data == 10) {
Exchange(L, 2);
}
else if (data == 11) {
initList(A);
purge(A, L);
cout << "A:"; Show(A);
cout << "L:"; Show(L);
}
} while (data != 0);
}