数据结构代码题--顺序表

约定顺序表结构体:

typedf struct{
    int data[MaxSize];
    int len;
}SqList;

1、顺序表递增有序,插入元素x,仍递增有序

int find(SqList L,int x){
    int i = 0;
    while(L.data[i] != x){
        i++;
    }
    return i;
}

bool Insert(SqList &L,int x){
    int p = find(L,x);
    if(p>=MaxSize||L.len >= MaxSize)//溢出插入失败
        return false;
    for(int j = len; j>=i ; j--){
        L.data[j]=L.data[j-1];
    }
    L.data[p-1] = x;
    L.length +=1;//注意不要遗漏
    return true;
}

2、用顺序表最后一个元素覆盖整个顺序表中最小元素,并返回该最小值

//思路:首先遍历顺序表找出最小元素,记下位置后用最后一个元素替换
int Replace_Min(SqList &L){
    int p = 0;
    int min = L.data[0];
    for(int i=0 ; i<len ;i++){
        if(L.data[i] < min){
            min = L.data[i];
            p = i;}
    }
    L.data[p] = L.data[len-1];
    return min;
}

思考:有多个相同的最小值如何解?

3、将顺序表中的元素逆置

void Reverse(SqList &L){
    int temp = 0;
    for(int i=0, j=len-1; i<j ;i++,j--){
        temp = L.data[i];
        L.data[i] = L.data[j];
        L.data[j] = temp;
    }
}

4、将(a1,a2,a3......am,b1,b2,b3...bn)转换成(b1,b2,b3...bn,a1,a2,a3...am)

//思路:先逆置整个数组,再分别逆置子数组
void Reverse(int A[], int m, int n){
    int temp = 0;
    for(int i=m, j=n-1; i<j ;i++,j--){
        temp = A[i];
        A[i] = A[j];
        A[j] = temp;
    }
}

void Exchange(int A[], int m,int n){
    Reverse(A,0,m+n-1);
    Reverse(A,0,n-1);
    Reverse(A,n,n+m-1);
}

5、删除顺序表中所有值为x的元素

//思路:遍历顺序表,查找值为x的元素,设置变量记录x的个数,以便删除时元素前移相应位数
void Del(SqList &l,int x){
    int k = 0;
    for(int i = 0 ; i<len ; i++){
        if(L.data[i] == x)
            k++;
        else
            L.data[i-k] = L.data[i];
    }
    L.len -=k;
}

6、从顺序表中删除给定值在s到t之间(包含s和t)的所有元素

bool Delpart(SqList &L,int s,int t){
    int k = 0;
    if(s>=t || L.len==0 )
        return false;
    for(int i=0 ;i<L.len ;i++){
        if(L.data[i]>=s && L.data[i]<=t)
            k++;
        else
            L.data[i-K] = L.data[i];  //注意  
    }
    L.len -=k;
    return ture;
}

7、两个递增有序表合并成一个递增有序表

bool Merge(SqList A,SqList B,SqList &C){
    int i=0,j=0,k=0;
    if(C.len >= (B.len + C.len))
        return false;
    while(i<A.len && j<B.len){
        if(A.data[i]<B.data[j])
            C.data[k]=A.data[i];
        else
            C.data[k]=B.data[j];
        i++;j++;k++;
    }
    while(i<A.len){
        C.data[k]=A.data[i];
        i++;k++;
    }
    while(j<B.len){
        C.data[k]=B.data[j];
        j++;k++;
    }
    return true;
}

8、从有序表中删除所有值重复的元素

bool Del(SqList &L){
    int i=0,j=1;
    for(i,j; j<L.len; j++){
        if(L.data[i]!=L.data[j]){
            L.data[++i]=L.data[j]
        }
    }
    L.len = i+1;
    return true;
}

9、求两个递增序列合并后的中位数(长度为L的升序序列S,在第(L/2)个位置的数称为S的中位数,注意:向下取整,也就是说L=5,则第三个是中位数,两个序列的中位数是指两个序列合并后的的中位数。)

int find(SqList A,SqList B){
    int i,j,k;
    i=j=k=0;
    SqList C;
    while(i<A.len && j<B.len){
        if(A.data[i]<B.data[j]){
            C.data[k++] = A.data[i++];
        }
        else
            C.data[k++] = B.data[j++];
    }
    while(i<A.len){
        C.data[k++] = A.data[i++];
    }
    while(j<B.len){
        C.data[k++] = B.data[j++];
    }
    C.len = A.len+B.len;
    return C.data[(C.len-1)/2];
}

10、设计出一个时间上尽可能高效的算法,找出数组中未出现的最小正整数

int Find(intA[], int n){
    int i;
    int *N=new int[n];
    for(int k=0;k<n;++k){
        if(A[i]>0&&A[i]<=n)
            B[A[i]-1]=1;
    }
    for(i=0;i<n;++i){
        if(B[i] == 0)
            break;
    }
    delete[] B;
    return i+1;
}

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值