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; } }