1.5.从顺序表中删除其值在给定值s与t之间,(包含s和t,要求s<t)的所有元素,如果s或t不合理或者顺序表为空则显示出错信息并退出运行
//从前向后扫描顺序表L,用k记下个数,若值不在s到k之间,前移k个位置,否则执行k++
bool del_s_t(SqList &L, ElemType s, ElemType t) {
int i, k = 0;
if (i > L.length || s >= t) return false;
for (i = 0;i < L.length;i++) {
if (L.data[i] >= s && L.data[i] <= t) //若元素值在s和t之间,记下k的个数
k++;
else
L.data[i - k] == L.data[i]; //否则前移,填补空缺位置
}
L.length -= k;
return true;
}
1.6.从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同
//为有序顺序表,所以重复的数字必在相邻位置上
bool Delete_Same(SqList &L) {
if (L.length == 0)
return false;
int i, j; //i存储第一个不相同的元素,j为工作指针
for (i = 0, j = 1;j < L.length;j++) //查找下一个与上个元素不相同的元素
if (L.data[i] != L.data[j]) //找到后,则将元素前移
L.data[++i] = L.data[j];
L.length = i + 1;
return true;
}
1.7.将两个有序顺序表合并成一个新的有序顺序表,并由函数返回结果顺序表
//按顺序不断取下顺序表表头较小的结点存入新的顺序表中,那个表还有剩余,将剩下的部分加入到新表后面
bool Merge(SqList A, SqList B, SqList &C) {
if (A.length + B.length > MaxSize) return false; //大于顺序表的最大长度
int i = 0, j = 0, k = 0;
while (i < A.length&&j < B.length) { //循环,两者比较,小的存入结果表
if (A.data[i] <= B.data[j])
C.data[k++] = A.data[i++];
else
C.data[k++] = B.data[j++];
}
while (i < A.length) //剩一个没有比较完的顺序表
C.data[k++] = A.data[i++];
while (j < B.length)
C.data[k++] = B.data[j++];
C.length = k + 1;
return true;
}
1.8.已知在一维数组A[m + n]中依次有两个线性表(a1, a2, a3, ..., am),(b1, b2, b3, ..., bn),编写一个函数,将两个顺序表的位置互换,即将(b1, b2, b3, ..., bn)放到(a1, a2, a3, ..., am)的前面
//思路:先将数组整体原地置换,即m与n置换,在对m和n进行内部置换
typedef int DataType;
void Reverse(DataType A[], int left, int right, int arraySize) {
//将(left, left+1, left+2,...right-2, right-1, right)逆转为(right, right-1, right-2,...left+2, left+1, left)
if (left >= right || right >= arraySize)
return;
int mid = (left + right) / 2;
for (int i = 0; i <= mid - left; i++) {
DataType temp = A[left + i];
A[left + i] = A[right - i];
A[right - i] = temp;
}
}
void Exchange(DataType A[], int m, int n, int arraySize) {
Reverse(A, 0, m + n - 1, arraySize); //换为(bn, bn-1, ..., b2, b1, am, am-1, ..., a2, a2)
Reverse(A, 0, n - 1, arraySize); //换为(b1, b2, ..., bn-1, bn, am, am-1, ..., a2, a2)
Reverse(A, n, m + n - 1, arraySize); //换为(b1, b2, ..., bn-1, bn, a1, a2, ..., am-1, am)
}
1.9线性表(a1, a2..an)递增有序请在最少时间在表中查找数值为x的元素,若找到,将其与后继元素交换,若找不到将其插入表中并使表中元素有序
//折半查找
void SearchExchangeInsert(ElemType A[], ElemType x) {
int n;
int low = 0, high = n - 1, mid;
while (low < high) {
mid = (low + high) / 2; //找中间位置
if (A[mid] == x) break; //找到x,退出循环
else if (A[mid] < x) low = mid + 1; //到mid的右半部分查找
else high = mid - 1; //到mid的左半部分查找
}
if (A[mid] == x && mid != n - 1) { //若最后一个元素与x相等,则不存在后继元素
ElemType t = A[mid];
A[mid] = A[mid + 1];
A[mid + 1] = t;
}
if (low > high) { //查找失败,插入元素x
int i;
for (i = n - 1;i > high;i--) A[i + 1] = A[i];
A[i + 1] = x;
}
}