数据结构基本知识——顺序表代码训练2

122 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
    }
}