美文网首页
2.1顺序表的基本操作和常用算法--C

2.1顺序表的基本操作和常用算法--C

作者: Christopher__ | 来源:发表于2018-07-22 20:13 被阅读0次

    顺序表的定义:

    #define ElemType int
    
    #define MaxSize 100
    typedef struct{
        ElemType data[MaxSize];
        int length;
    }SqList;
    

    初始化表

    void InitList(SqList &L){
        L.length = 0;
    }
    

    插入操作

    // 将元素e插入到顺序表L中第i个位置 
    // L: 顺序表
    // i: 第i个位置,表示位序,从1开始
    // e: 待插入元素 
    bool ListInsert(SqList &L, int i, ElemType e){
        if( i<1 || i>L.length+1 )   // 判断i的范围是否有效
            return false;
        if(L.length >= MaxSize)     // 若存储空间已满则不能插入 
            return false;
        for(int j = L.length; j >= i; j --){    // 将第i个元素及之后的元素后移 
            L.data[j] = L.data[j - 1];
        }
        L.data[i - 1] = e;      // 在位置i处放入e 
        L.length ++;        // 更新表长 
        return true;
    }
    
    image.png

    删除操作

    // 删除顺序表L中第i个位置的元素 
    bool ListDelete(SqList &L, int i, ElemType &e){
        if(i < 1 || i > L.length)   // 判断i的范围是否有效 
            return false;
        e = L.data[i - 1];      // 将被删除的元素赋值给e 
        for(int j = i; j < L.length; j ++)  // 将第i个之后的元素前移 
            L.data[j - 1] = L.data[j];
        L.length --;    // 线性表长度减1 
        return true;
    } 
    

    按值查找

    // 在顺序表L中查找第一个元素值等于e的元素
    // 若查找成功,则返回元素位序,否则返回0 
    int LocateElem(SqList L, ElemType e){
        int i;
        for(i = 0; i < L.length; i ++){
            if(L.data[i] == e)
                return i + 1;
        }
        return 0;
    }
    

    逆置所有元素

    // 扫描顺序表L的前半部分元素
    // 将其与后半部分对应元素进行交换 
    void Reverse(SqList &L){
        for(int i = 0; i < L.length / 2; i ++){
            ElemType temp = L.data[i];
            L.data[i] = L.data[L.length - i - 1];
            L.data[L.length - i - 1] = temp;
        }
    }
    

    逆置给定位置元素

    // form: 开始转换的下标 0<=from
    // to: 结束转换的下标  to<=L.lenth-1
    void Reverse(SqList &L,int from, int to){
        for(int i = 0; i < (to - from + 1) / 2; i ++){
            ElemType temp = L.data[from + i];
            L.data[from + i] = L.data[to - i];
            L.data[to - i] = temp;
        }
    }
    

    子表位置互换问题L:(a1,a2...am,b1,b2...bn) -> L:(b1,b2...bn,a1,a2...am) T(n)=O(n)

    void Converse(SqList &L, int m, int n){
        Reverse(L, 0, m - 1);
        Reverse(L, m, m + n - 1);
        Reverse(L, 0, m + n - 1);
    }
    

    删除值为给定值的元素 T(n)=O(n) S(n)=O(1)

    void Del_x(SqList &L, ElemType x){
        int k = 0;
        for(int i = 0; i < L.length; i ++){
            if(L.data[i] != x){
                L.data[k] = L.data[i];
                k ++;
            }
        }
        L.length = k;
    }
    

    有序去重

    bool Delete_Same(SqList &L){
        if(L.length == 0)
            return false;
        int k = 1;
        for(int i = 1; i < L.length; i ++){
            if(L.data[i] != L.data[k - 1]){
                L.data[k] = L.data[i];
                k ++;
            } 
        }
        L.length = k;
        return true;
    }
    

    有序合并

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

    折半查找

    // 在有序顺序表L中查找x,返回x下标 
    // 若未找到则返回-1 
    int Search(SqList &L, ElemType x){
        int low = 0, high = L.length - 1, mid;
        while(low <= high){
            mid = (low + high) / 2;
            if(L.data[mid] == x)
                return mid;
            else if(L.data[mid] < x)
                low = mid + 1;
            else
                high = mid - 1;
        }
        return -1;
    }
    

    相关文章

      网友评论

          本文标题:2.1顺序表的基本操作和常用算法--C

          本文链接:https://www.haomeiwen.com/subject/tpcnpftx.html