持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
1.有序表去重
题目
从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
代码
bool Delet_Same(SqList &L){
if(L.length <= 1){
return false;
}
int pos=0;
for(int i=1; i < L.length; i++){
if(L.data[i] != L.data[pos]){
L.data[++pos] = L.data[i];
}
}
L.length = pos+1;
return true;
}
2.有序表合并
题目
将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
静态分配代码
bool Merge(SqList A, SqList B, SqList &C){
if(A.length + B.length > C.length){
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;
return true;
}
动态分配代码
bool Merge(SqList A, SqList B, SqList &C){
if(A.length + B.length > C.length){
C.data = (ElemType *)malloc(sizeof(ElemType) * (A.length + B.length));
if(!C.data){
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;
return true;
}
3.依次合并
题目
已知在一维数组A[m+n]中依次存放两个线性表(a1, a2,a3,…, am)和(b1, b2, b3,.…, bn)。编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2, b3…, bn)放在(a1, a2,a3,.…,am)的前面。
代码
void Exchange(ElemType A[], int m, int n, int length){
for(int i=0; i < length / 2; i++){
ElemType tmp;
tmp = A[i];
A[i] = A[length-1-i];
A[length-1-i] = tmp;
}
for(int i=0; i < n / 2; i++){
ElemType tmp;
tmp = A[i];
A[i] = A[n-1-i];
A[n-1-i] = tmp;
}
for(int i=0; i < m / 2; i++){
ElemType tmp;
tmp = A[i+n];
A[i+n] = A[m + n-1-i];
A[m + n -1-i] = tmp;
}
}
4.二分查找并应用
题目
线性表(a az, a3,…,a)中的元素递增有序且按顺序存储于计算机内。要求设计一个算法,完成用最少时间在表中查找数值为x的元素,若找到,则将其与后继元素位置相交换,若找不到,则将其插入表中并使表中元素仍递增有序。
代码 第一个while循环是二分查找的过程
void Search_Idx(SqList &L, ElemType x){
int left=0, right=L.length-1, mid;
while(left<=right){
mid = (left + right) / 2;
if(L.data[mid]==x){
break;
}else if(L.data[mid] < x){
left = mid + 1;
}else{
right = mid-1;
}
}
if(L.data[mid]==x && mid < length){
ElemType tmp;
tmp = L.data[mid];
L.data[mid] = L.data[mid+1];
L.data[mid+1] = tmp;
}
if(left > right){
for(int i=L.length-1; i > right; i--){
L.data[i+1] = L.data[i];
}
L.data[right+1] = x;
}
}