bool deletelem(Sqlist& L, int &e) {
if (L.length == 0) {
return false;
}//表空,删除失败
int min = L.data[0];
int pos = 0;
for (int i = 0; i < L.length; i++) {
if (L.data[i] < min) {
min = L.data[i];
pos = i;
}
}//遍历找到最小元素及其下标
e = min;
L.data[pos] = L.data[L.length - 1];
L.length--;//删除最小元素并用末尾元素替补
return true;
}
bool listreverse(Sqlist& L) {
if (L.length == 0) {
return false;
}//表空,置错
int temp;//暂存元素;
for (int i = 0; i < L.length / 2; i++) {
temp = L.data[i];
L.data[i] = L.data[L.length-i-1];
L.data[L.length - i - 1] = temp;
}//将表的元素逆置
return true;
}
bool deleterep(Sqlist& L,int e) {
int i = 0, k = 0;
if (L.length == 0) {
return false;
}//表空,置错
for (int i = 0; i < L.length; i++) {
if (L.data[i] == e) {
k++;
}//k计数器
else {
L.data[i - k] = L.data[i];
}
}//遍历找到需要删除的元素;进行删除
L.length = L.length - k;//改变表长
return true;
}
bool deletespec(Sqlist& L,int s,int t) {
int i = 0;
int p = -1, q =-1;
int k;//记录最小值和最大值下标位置
if (L.length == 0|| s >= t||s>L.data[L.length-1]||t<L.data[0]){
return false;
}//表空或给定区间不满足要求
while (i < L.length) {
if (L.data[i] <=s) {
p++;
}
if (L.data[i] < t) {
q++;
}
i++;//遍历找到需要删除的最小元素的前一位和最大元素的位置
}
k = q - p ;//需要删除的元素个数
for (q+1 ; q < L.length; q++) {
L.data[q+1 - k] = L.data[q+1];
}//将后面元素前移
L.length = L.length - k;//修改数组长度
return true;
}
bool deletespecram(Sqlist& L,int s,int t) {
int k=0;
if (L.length == 0|| s >= t){
return false;
}//表空或给定区间不满足要求
for (int i = 0; i < L.length; i++) {
if (L.data[i] >= s && L.data[i] <= t) {
k++;
}//遍历查询需要删除的元素
else {
L.data[i - k] = L.data[i];
}//将不需要删除的元素前移
}
L.length = L.length - k;//改变数组长度
return true;
}
bool deleterep(Sqlist& L) {
int i = 0, j = 1,k=0;
while(j<L.length){
if (L.data[i] != L.data[j]) {
L.data[i + 1] = L.data[j];
i++;
j++;
}//发现不相等元素,移入前部
else { k++; j++; }//元素相等,指针后移
}
L.length = L.length - k;//改变数组长度
return true;
}
bool listmerger(Sqlist &L1, Sqlist &L2, Sqlist &L3) {
if (L3.length < L1.length + L2.length) {
return false;
}//若合并数组长度不够,置错
int i = 0, j = 0, k = 0;
while (i < L1.length && j < L2.length) {
if (L1.data[i] < L2.data[j]) {
L3.data[k++] = L1.data[i++];
}
else {
L3.data[k++] = L2.data[j++];
}
}//遍历L1,L2,以此将最小元素插入L3
while (i < L1.length) {
L3.data[k++] = L1.data[i++];
}
while (j < L2.length) {
L3.data[k++] = L2.data[j++];
}//若有剩余,全部插入L3
L3.length = k;//改变数组长度
return true;
}
bool listchange(Sqlist L1, Sqlist L2, Sqlist &L3) {
int temp;
for (int i = 0; i < L3.length/2; i++) {
temp = L3.data[i];
L3.data[i] = L3.data[L3.length - i - 1];
L3.data[L3.length - i - 1] = temp;
}//将整个数组逆置
for (int i = 0; i < L2.length/2; i++) {
temp = L3.data[i];
L3.data[i] = L3.data[L2.length - i - 1];
L3.data[L2.length - i - 1] = temp;
}//将L2逆置
for (int i = 0; i < L1.length/2; i++) {
temp = L3.data[i + L2.length ];
L3.data[i + L2.length] = L3.data[L1.length - i - 1+L2.length];
L3.data[L1.length - i - 1 + L2.length] = temp;
}//将L1逆置
return true;
}
int binarysearch(Sqlist L, int e) {
int low = 0, high = L.length - 1, mid = 0;
mid = (low + high) / 2;
while (low <= high) {
while (L.data[mid] > e) {
high = mid - 1;
mid = (low + high) / 2;
}
while (L.data[mid] < e) {
low = mid + 1;
mid = (low + high) / 2;
}
if (L.data[mid] == e) {
return mid;
}
else {
return -1;
}
}
}//二分查找
void listinsert(Sqlist& L, int e) {
int i = 0;
while( i<L.length) {
if (L.data[i] <= e) {
i++;
}
else { break; }
}
for (int j = L.length - 1; j >= i; j--) {
L.data[j + 1] = L.data[j];
}
L.data[i] = e;
L.length++;
}//插入函数
bool findandchange(Sqlist &L,int x) {
int reg,temp;
reg=binarysearch(L,x);
if (reg >= 0&®<L.length-1) {
temp = L.data[reg];
L.data[reg] = L.data[reg + 1];
L.data[reg + 1] = temp;
return true;
}//置换元素
else if(reg>=0&& reg == L.length - 1) {
return false;
}//若查找到的元素在表尾,置错
else {
listinsert(L, x);//查找失败,进行插入操作
}
return true;
}