江西师范大学考研算法-顺序表考点

顺序表考点

#include <iostream>
#define MaxSize 10

定义结构体

typedef struct SqlList{
    int data[MaxSize];
    int size;
}SqlList,List;

1.输出打印

void printAll(SqlList L){
    for (int i = 0; i < L.size; ++i) {

        printf("%d \t",L.data[i]);
    }
    printf("\n");
}

2.查找值为X的索引位置

int findX(SqlList L,int X){
    int i;
    for (i = 0; i < L.size; ++i) {
        if(X==L.data[i])
        {
            return i;
        }
    }
    return -1;
}

3.给定一个值从小到打的有序顺序表L,插入X仍然有序

/**
 * 在一个有序顺序表中查找X的插入位置
 * @param L
 * @param x
 * @return
 */
int find(SqlList L,int x){
    int i;
    for(i=0;i<L.size;i++){
        if(x==L.data[i]||x<L.data[i])
        {
            return i;
        }
    }
    return i;
}
SqlList insert(SqlList L,int x){
    int j = find(L,x);
    for (int i = L.size; i >=j ; i--) {
        L.data[i+1]=L.data[i];
    }
    L.data[j]=x;
    L.size++;
    return L;
}

3.查找顺序表中值为X的元素个数

int countX(SqlList L,int x){
    int sum=0;
    for (int i = 0; i < L.size; ++i) {
        if(L.data[i]==x)
            sum++;
    }
    return sum;
}

4.设计一个算法把顺序表倒置

SqlList reverse(SqlList L){
    int frist=0;
    int last=L.size-1;
    int temp;
    while (frist<last){
        temp=L.data[frist];
        L.data[frist]=L.data[last];
        L.data[last]=temp;
        frist++;
        last--;
    }
    return L;
}

5.两个顺序表尽可能快的交叉合并

SqlList mergeList(SqlList L1,SqlList L2){
    SqlList L3;
    int i,j,k;
    i=j=k=0;

    while (i<L1.size && j<L2.size){
        if(L1.data[i]<L2.data[j])
            L3.data[k++]=L1.data[i++];
        else
            L3.data[k++]=L2.data[j++];
    }
    while (i<L1.size)
        L3.data[k++]=L1.data[i++];
    while (j<L2.size)
        L3.data[k++]=L2.data[j++];
    L3.size=k;
    return L3;
}

6.将顺序表L1中奇数放L2中,偶数放L3中

void sprit(SqlList L1,SqlList &L2,SqlList &L3){
    int i,j,k;
    i=0,j=0,k=0;
    for (i = 0;  i < L1.size ; i++) {
        if (L1.data[i]%2==0)
            L2.data[j++]=L1.data[i];
        else
            L3.data[k++]=L1.data[i];
    }
    L2.size=j;
    L3.size=k;
}

7.采用二分查找元素key在有序表L中的位置。

int binsearch(SqlList L,int k){
    int low=0,high=L.size-1,mid;
    while (low<=high){
        mid=(low+high)/2;
        if (L.data[mid]==k)
            return mid;
        else if (L.data[mid]<k)
            low=mid+1;
        else if (L.data[mid]>k)
            high=mid-1;
    }
    return -1;
}

8.顺序表中偶元素放前面,奇元素放后面

void partion(SqlList &L){
    int i,j,temp;
    i=0,j=L.size-1,temp=0;
    while(i<j){
        while (i<j && L.data[i] %2 == 0)
            i++;
        while (i<j && L.data[j] %2 == 1)
            j--;
        if (i<j){
            temp=L.data[i];
            L.data[i++]=L.data[j];
            L.data[j--]=temp;
        }
    }
}

9.求顺序表L1和L2的交集放到L3中

void inter(SqlList L1,SqlList L2,SqlList &L3){
    int i,j,k;
    k=0;
    for (i = 0; i < L1.size; i++) {
        j=0;
        while (j<L2.size && L1.data[i]!=L2.data[j])
            j++;
        if (j<L2.size && L1.data[i]==L2.data[j])
            L3.data[k++]=L1.data[i];
    }
    L3.size=k;
}

测试代码

int main() {
    SqlList L={1,2,3,4,5,6};
    SqlList L2={2,4,6,7};
    SqlList L3;
    L.size=6;
    L2.size=4;

/*    //1.打印顺序表
    printAll(L);
    printf("\n");
    //2.插入元素X
    printAll(insert(L,4));
    printf("\n");

    //3.统计表中X的数量
    printf("%d",countX(insert(L,4),4));
    printf("\n");
    //4.逆置顺序表
    printAll(reverse(L));
    printf("\n");*/

    //5.顺序合并两个顺序表
/*    SqlList L1={1,3,};
    SqlList L2={2,4,6,7};
    L1.size=2;
    L2.size=4;
    printAll(mergeList(L1,L2));
    printf("\n");*/

    //6.将顺序表L1中奇数放L2中,偶数放L3中
    /*SqlList L3;
    SqlList L4;
    sprit(L,L3,L4);
    printAll(L3);
    printAll(L4);*/
    //7.采用二分查找元素key在有序表L中的位置。
    printf("%d",binsearch(L,4));
/*    //8.顺序表中偶元素放前面,奇元素放后面
    partion(L);
    printAll(L);*/
    //9.求顺序表L1和L2的交集放到L3中
 /*   inter(L,L2,L3);
    printAll(L3);*/
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值