王道_顺序表课后代码习题总结
顺序表
1.删除
主要在于删除后,后面元素怎样前移。
1.删除一个值
bool ListDelete(SqList &L, ElemType &e){
if(i < 1 || i > L.length)
return false;
e = data[i-1];
for(int j = i; j < L.length; j++)
L.data[j-1] = L.data[j];
L.length--;
return 0;
}
2.删除一定范围的值
模板(通法,不追求完美复杂度):
①设置k值;记录符合要求的值(或者记录不符合要求的值,但通常时间复杂度要高,故不作讨论)
②如果符合要求,k++;
如果不符合要求,前移k值;
int k = 0; //记录要删去值的个数
int i = 0;
while(i < L.length){
if(删除的条件) //确定前移的个数
k++;
else //前移操作
L.data[i-k] = L.data[i];
i++;
}
L.length -= k; //更新顺序表
例题:
1.在一个顺序表中删除值为x的元素,值为x的元素不唯一。
void del(SqList &L, ElemType x){
int k = 0; //记录要删去值的个数
int i = 0;
while(i < L.length){
if(L.data[i] == x) //确定前移的个数
k++;
else //前移操作
L.data[i-k] = L.data[i];
i++;
}
L.length -= k; //更新顺序表
}
2.在一顺序表(有序或无序)中删除所有s到t范围内的值。
void del(SqList &L, ElemType s, ElemType t){
int k = 0; //记录要删去值的个数
int i = 0;
while(i < L.length){
if(L.data[i] >= s && L.data[i] <= t) //确定前移的个数
k++;
else //前移操作
L.data[i-k] = L.data[i];
i++;
}
L.length -= k; //更新顺序表
}
针对有序数组,可利用s到t在同一区间进行操作
int Del(SqList &L, ElemType s, ElemType t){
int i , j;
if(s >= t || L.length == 0)
return false;
for(i = 0; i < L.length && L.data[i] < s; i++);
if(i >= L.length)
return false;
for(j = i; j < L.length && L.data[j] <= t; j++);
for(; j < L.lengthg; i++,j++)
L.data[i] = L.data[j];
L.length = i;
return true;
}
3.对有序顺序表进行去重。
void del(SqList &L, ElemType s, ElemType t){
int k = 0; //记录要删去值的个数
int i = 0;
while(i < L.length){
if(L.data[i] == L.data[i-1]) //确定前移的个数
k++;
else //前移操作
L.data[i-k] = L.data[i];
i++;
}
L.length -= k; //更新顺序表
}
2. 逆置
1.将顺序表逆置
for(int i = 0,j = L.length -1; i < j, i++, j--){
temp = L.data[i];
L.data[i] = L.data[j];
L.data[j] = temp;
}
2.线性表A=B+C,将A=C+B;
①整体逆转;
②B,C两部分分别逆转;
其中逆转函数为1的抽象。
rverse(A,0,m+n-1);
reverse(A,0,n-1);
reverse(A,n,n+m-1);
3.合并
两个有序链表合并新的有序链表
bool Merge(SqList A, SqList B, SqList &C){
if(A.length + B.Length > C.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++] = A.data[j++];
return true;
}

浙公网安备 33010602011771号