C语言数据结构-二-1 顺序表

注意:现在偷的懒以后都要补回来的!

希望大家认真学好数据结构,不希望后悔!

  1. 顺序表基础练习
    【问题描述】
    要求使用插入元素方法建立顺序表,通过查询方法找到输入的元素值,并删除第一个等于输入值的元素,最后输出表中元素。
    【输入形式】
    第一行输入顺序表长度N,
    第二行输入N个元素
    第三行输入待查找删除的元素。
    【输出形式】
    输出删除元素后的顺序表。
    【样例输入1】
    5
    10 12 14 18 12
    12
    【样例输出1】
    10 14 18 12
    【样例输入2】
    3
    10 18 12
    13
    【样例输出2】
    10 18 12
#include 
int main()
{
    int n,m;
    scanf("%d",&n);
    int b[n];
    for(int i=0;i<n;i++){
        scanf("%d",&b[i]);
    }
    scanf("%d",&m);
    int k,flag=0;
    for (int i = 0; i < n; i++){
        if (m==b[i]){
            k=i;
            flag=1;
            break;
        }
    }
    if (flag){
        for (int i = k; i < n; i++){
            b[i]=b[i+1];
        }
        n--;
    }
    for(int i=0;i<n;i++){
        printf("%d ",b[i]);
    }
    return 0;
}
  1. 顺序表实现集合差集
    【问题描述】
    设两个集合A、B用顺序表表示,求A-B。
    【输入形式】
    第一行输入两个整数N、M(大于0小于100),分别表示两个集合的长度;
    第二行输入第一个集合的N个元素;
    第三行输入第二个集合的M个元素;
    【输出形式】
    输出第一个集合和第二个集合的差集。(若差集为空集,则输出*)
    【样例输入1】
    5 4
    4 23 -9 30 6
    23 45 6 2
    【样例输出1】
    4 -9 30
    【样例输入2】
    4 6
    10 20 30 40
    10 20 30 40 50 60
    【样例输出2】
    *
#include 
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    int a[n],b[m];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<m;i++){
        scanf("%d",&b[i]);
    }
    int flag=0,count=1;
    for (int i = 0; i < n; i++){
        int j;
        for(j=0;j<m;j++){
            if (a[i]==b[j]){
                flag++;
                count=0;
                break;
            }
        }
        if(count){
            printf("%d ",a[i]);
        }
        count=1;
    }
    if (flag==n){
        printf("*");
    }
    return 0;
}
  1. 将顺序表非零元素依次移到表的前端
    【问题描述】
    将顺序表中所有非零元素依次移到表的前端。
    【输入形式】
    第一行输入整数N表示表长;
    第二行输入N个整数,可包含零。
    【输出形式】
    输出将非零元素移到前端的表中元素,以空格作为分隔。
    【样例输入】
    6
    2 0 -1 0 5 8
    【样例输出】
    2 -1 5 8 0 0
    【评分标准】
    用一个函数实现该方法。
#include 
int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<n;i++){
        if(a[i]==0){
            for(int j=i;j<n-1;j++){
                a[j]=a[j+1];
            }
            a[n-1]=0;
        }
    }
    for (int i = 0; i < n; i++){
        printf("%d ",a[i]);
    }
    return 0;
}
  1. 递增顺序表插入
    【问题描述】
    设有递增有序顺序表,实现其插入元素后依然有序。
    【输入形式】
    第一行输入一个N(N不大于100);
    第二行输入N个整数(假设输入序列按照递增顺序,以空格分隔);
    第三行输入一个整数M(欲插入数据);
    【输出形式】
    输出插入M后的顺序表。
    【样例输入】
    5
    12 25 35 98 125
    77
    【样例输出】
    12 25 35 77 98 125
    【评分标准】
    功能实现要求写成算法函数形式,并利用顺序表基本操作。
#include
int main(){
    int n,i,k,t;
    scanf("%d",&n);
    int sum[n];
    for(i=0;i<n;i++){
        scanf("%d",&sum[i]);
    }
    scanf("%d",&k);
    if(k<=sum[n-1]){
        for(i=0;i<n;i++){
            if(k<=sum[i]){
                t=i;
                break;
            }
        }
        for(i=n;i>=t;i--){
            sum[i]=sum[i-1];
        }
        n++;
        sum[t]=k;
    }
    else{
        sum[n]=k;
        n++;
    }
    for(i=0;i<n;i++){
        printf("%d ",sum[i]);
    }
}
  1. 约瑟夫环问题(顺序表实现)
    【问题描述】
    约瑟夫环问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀的顺序是:5,4,6,2,3,1。
    【输入形式】
    输入两个正整数N和M,N表示N个人,M表示报数到M;
    【输出形式】
    输出依次出列的序号。以空格作为分隔。
    【样例输入1】
    6 5
    1 2 3 4 5 6
    【样例输出1】
    5 4 6 2 3 1
    【样例输入2】
    3 3
    3 2 1
    【样例输出2】
    1 3 2
#include
int main()
{
    int n,m,r;
    int i,j=0,s=0,l;
    scanf("%d %d",&n,&m);
    int a[n],b[n];
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    a[n]=-1;
    for(i=0;j!=n;i++){
        if(a[i]==-1){
            i=0;
        }
        if(a[i]!=0 && a[i]!=-1){
            s++;
        }
        if(s==m){
            b[j]=a[i];
            a[i]=0;
            j++;
            s=0;
        }
    }
    for(i=0;i<n;i++){
        printf("%d ",b[i]);
    }
    return 0;
}

你可能感兴趣的:(C语言数据结构,经验分享,c语言,数据结构,算法)