王道数据结构习题代码2.2.3(线性表)

第一题(c语言)

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;


bool  Del_Min(SqList *L,Elemtype *e)
{

    if(L->len==0)return false;

    *e=L->data[0];
    int pos=0;

    for(int i=0; i<L->len; i++)
    {
        if(L->data[i]<*e)
        {
            *e=L->data[i];
            pos=i;

        }
    }

    L->data[pos]=L->data[L->len-1];
    L->len--;

    return true;
}



int main()
{

    SqList L;
    L.len=0;
    for(int i=0; i<=10; i++)
    {
        L.data[i]=i;
        L.len++;
    }
    L.data[5]=-99;//最小元素


    int k;
    Del_Min(&L,&k);
    printf("%d",k);//-99




    return 0;
}

第二题

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;


bool  Reverse(SqList *L)
{

    if(L->len==0)return false;

    Elemtype t;

    for(int i=0;i<L->len/2;i++)
    {
        //交换变量
        t=L->data[i];
        L->data[i]=L->data[L->len-i-1];
        L->data[L->len-i-1]=t;
    }

    return true;
}

int main()
{

    SqList L;
    L.len=0;
    for(int i=0; i<=10; i++)
    {
        L.data[i]=i;
        L.len++;
    }

   Reverse(&L);

    for(int i=0; i<=10; i++)
    {
      printf("%d ",L.data[i]);//10 9 8 7 6 5 4 3 2 1
    }








    return 0;
}

第三题

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;


void del_x_1(SqList *L,Elemtype e)
{

     int k=0;
    //将不等e的元素挑选出来
    for(int i=0;i<L->len;i++)
    {
        if(L->data[i]!=e)
        {
            L->data[k]=L->data[i];
            k++;
        }
    }
    L->len=k;
}


void del_x_2(SqList *L,Elemtype e)
{
    int k=0;
    //移动思维
    for(int i=0;i<L->len;i++)
    {
        if(L->data[i]==e)k++;
        else{
            L->data[i-k]=L->data[i];//向前移动
        }
    }
    L->len-=k;
}
int main()
{

    SqList L;
    L.len=0;
    for(int i=0; i<=10; i++)
    {
        L.data[i]=i;
        L.len++;
    }
    L.data[2]=-99;
    L.data[3]=-99;
    
    //del_x_1(&L,-99);
    del_x_2(&L,-99);

    for(int i=0; i<L.len; i++)
    {
      printf("%d ",L.data[i]);
    }



    return 0;
}

第四题(双指针)

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;

/*顺序表有序*/
bool Del_s_t(SqList *L,int s,int t)
{

    if(L->len==0)return false;

    if(s>=t) return false;

    int i,j;

    //找到大于等于s的第一个值
    for(i=0; i<L->len&&L->data[i]<s; i++);

    if(i>=L->len)return false;
    //找到大于t的第一个值
    for(j=i; j<L->len&&L->data[j]<=t; j++);

    //双指针法(将j后面的元素全部移动到i后面)

    for(; j<L->len; i++,j++)
    {
        L->data[i]=L->data[j];
    }
    L->len=i;

    return true;
}





int main()
{

    SqList L;
    L.len=0;
    for(int i=0; i<10; i++)
    {
        L.data[i]=i+1;
        L.len++;
    }

    Del_s_t_2(&L,2,4);
    for(int i=0; i<L.len; i++)
    {
        printf("%d ",L.data[i]);// 1 5 6 7 8 9
    }




    return 0;
}

第五题

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;

bool Del_s_t1(SqList *L,Elemtype s,Elemtype t)
{

    if(L->len==0||s>=t)return false;

    int k=0;

    for(int i=0; i<L->len; i++)
    {
        if(L->data[i]<s||L->data[i]>t)
        {
            L->data[k]=L->data[i];
            k++;
        }
    }
    L->len=k;
    return true;
}


bool Del_s_t2(SqList *L,Elemtype s,Elemtype t)
{
    if(L->len==0||s>=t)return false;

    int k=0;

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

}





int main()
{

    SqList L;
    L.len=0;

    for(int i=0; i<10; i++) //10 2 3 4 5 2 1 2 1 3
    {
        scanf("%d",&L.data[i]);
        L.len++;
    }

    //Del_s_t1(&L,2,4);
    Del_s_t2(&L,2,4);

    for(int i=0; i<L.len; i++)
    {
        printf("%d ",L.data[i]);
    }




    return 0;
}

第六题

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;

//双指针逐渐像前移动
bool Delete_Same(SqList *L)
{
    if(L->len==0)return false;

    int i,j;
    for(i=0,j=1;j<L->len;j++)
    {
        if(L->data[i]!=L->data[j])
        {
            L->data[++i]=L->data[j];
        }
    }
    L->len=i+1;//下标从0开始所以+1
    return true;
}



int main()
{

    SqList L;
    L.len=0;

    for(int i=0; i<10; i++) //1 2 2 3 3 4 4 5 5 6
    {
        scanf("%d",&L.data[i]);
        L.len++;
    }

    Delete_Same(&L);
    for(int i=0; i<L.len; i++)
    {
        printf("%d ",L.data[i]);
    }




    return 0;
}

第七题(Merge)

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;


bool  Merge(SqList *A,SqList *B,SqList *C)
{
    if(A->len+B->len>maxn)return false; //C的最大长度为100

    int i=0,j=0,k=0;

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



int main()
{

    SqList A,B,C;
    A.len=0,B.len=0,C.len=0;

    for(int i=0; i<10; i++) //1 2 3 4 5 6 7 8 9 10
    {
        scanf("%d",&A.data[i]);
        A.len++;
    }

     for(int i=0; i<10; i++) //1 2 3 4 5 6 7 8 9 10
    {
        scanf("%d",&B.data[i]);
        B.len++;
    }

    Merge(&A,&B,&C);

    for(int i=0; i<C.len; i++)
    {
        printf("%d ",C.data[i]);
    }




    return 0;
}

第八题(数组逆置)

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;

typedef int DataType;

void Reverse(DataType A[],int left,int right,int arraySize)
{
    if(left>=right||right>=arraySize)return false;

    int mid=(left+right)/2;

    for(int i=0; i<=mid-left; i++)
    {
        DataType temp=A[left+i];
        A[left+i]=A[right-i];
        A[right-i]=temp;
    }
}

void  Exchange(DataType A[],int m,int n,int arraySize)
{
    Reverse(A,0,m+n-1,arraySize);//整体逆转
    Reverse(A,0,n-1,arraySize);//an......a1逆转
    Reverse(A,n,m+n-1,arraySize);//bn....b1逆转
}

int main()
{

    int a[maxn];

    for(int i=0; i<20; i++) //  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
    {
        scanf("%d",&a[i]);
    }


    Exchange(a,10,10,20);

    for(int i=0; i<20; i++)
    {
        printf("%d ",a[i]);
    }




    return 0;
}

第九题(二分查找)

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;

typedef int DataType;


void  SearchExchangeInsert(Elemtype A[],Elemtype e,int len)
{
    int l=0,r=len-1,mid;

    while(l<=r)
    {
        mid=(l+r)/2;
        if(A[mid]==e)break;
        else if(A[mid]<e)
        {
            l=mid+1;
        }
        else
        {
            r=mid-1;
        }
    }
    if(A[mid]==e&&mid!=len-1)
    {
        int t=A[mid];
        A[mid]=A[mid+1];
        A[mid+1]=t;
    }

    if(l>r)
    {
        int i;
        for( i=len-1; i>r; i--)
        {
            A[i+1]=A[i];
        }
        A[i+1]=e;
    }

}
int main()
{

    int a[maxn];

    for(int i=0; i<10; i++) //  1 2 3 4 4 6 7 8 9 10
    {
        scanf("%d",&a[i]);
    }

    SearchExchangeInsert(a,5,10);

    for(int i=0; i<11; i++)
    {
        printf("%d ",a[i]);
    }




    return 0;
}

第十题(2010年真题)数组ab转化为数组ba

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;

typedef int DataType;


void Reverse(Elemtype A[],int l,int r)
{
    int mid=(l+r)/2;
    for(int i=0; i<=mid-l; i++)
    {
        Elemtype t=A[l+i];
        A[l+i]=A[r-i];
        A[r-i]=t;
    }
}

void Conserve(Elemtype A[],int p,int n)
{
    Reverse(A,0,n-1);
    Reverse(A,0,n-p-1);
    Reverse(A,n-p,n-1);
}


int main()
{

    int a[maxn];

    for(int i=0; i<10; i++) //  1 2 3 4 5 6 7 8 9 10
    {
        scanf("%d",&a[i]);
    }

    Conserve(a,4,10);

    for(int i=0; i<10; i++)
    {
        printf("%d ",a[i]);
    }




    return 0;
}

第十一题2011年(Merge操作)

第一种时间O(n),空间O(n)

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;

typedef int DataType;


void Merge(Elemtype A[],Elemtype B[],Elemtype C[],int len1,int len2)
{

    int i=0,j=0,k=0;

    while(i<len1&&j<len2)
    {
        if(A[i]<=B[j])
        {
            C[k++]=A[i++];
        }
        else
        {
            C[k++]=B[j++];
        }
    }
    while(i<len1)
    {
        C[k++]=A[i++];
    }

    while(j<len2)
    {
        C[k++]=B[j++];
    }

}

Elemtype  FindMiddle(Elemtype A[],Elemtype B[],int len1,int len2)
{
    Elemtype C[len1+len2];
    Merge(A,B,C,len1,len2);


    return C[(len1+len2)/2-1];
}


int main()
{

    int a[maxn];
    int b[maxn];
    for(int i=0; i<5; i++) //  1 3 5 7 9
    {
        scanf("%d",&a[i]);
    }

     for(int i=0; i<5; i++) //  2 4 6 8 10
    {
        scanf("%d",&b[i]);
    }

   printf("%d",FindMiddle(a,b,5,5));


    return 0;
}

第二种复杂度O(n),空间O(1)

根据归并排序思想,并不需要开数组存放,只需要连个指针相互比较即可!

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;

typedef int DataType;


Elemtype M_Search(Elemtype A[],Elemtype B[],int len1,int len2)
{

    int i=0,j=0,k=1;

    while(i<len1&&j<len2)
    {   //归并排序,哪一个元素小哪一个元素就上去,然后k++
        if(A[i]<=B[j])
        {
          if(k==((len1+len2)/2))return A[i];
          i++;
        }
        else
        {
           if(k==((len1+len2)/2))return B[j];
           j++;
        }
        k++;
    }
}


int main()
{

    int a[maxn];
    int b[maxn];
    for(int i=0; i<5; i++) //  1 3 5 7 9
    {
        scanf("%d",&a[i]);
    }

    for(int i=0; i<5; i++) //  2 4 6 8 10
    {
        scanf("%d",&b[i]);
    }

    printf("%d",M_Search(a,b,5,5));


    return 0;
}

第十二题2013(抵消思想)

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;

typedef int DataType;


Elemtype  Find_MainElem(Elemtype A[],int len)
{
    int count=1, c;
    c=A[0];
    for(int i=1; i<len; i++)
    {
        if(c==A[i])count++;//和主元素相同则++
        else
        {
            if(count>0)count--;//抵消
            else
            {
                count=1;
                c=A[i];//更换新主元素
            }

        }
    }
    count=0;//统计主元素出现次数
    for(int i=0; i<len; i++)
    {
        if(c==A[i])
        {
            count++;
        }
    }
    if(count>len/2)return c;

    return -1;

}


int main()
{

    int a[maxn];
    int b[maxn];
    for(int i=0; i<8; i++) //  0 5 5 3 5 7 5 5  ; 0 5 5 3 5 1 5 7
    {
        scanf("%d",&a[i]);
    }



    printf("%d",Find_MainElem(a,8));


    return 0;
}

第十三题(2018)

最简单的思路就是暴力O(n3)复杂度枚举不同三元组,也可以用散列表O(n)复杂度,空间O(n)

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define maxn 100

typedef int Elemtype;


typedef struct
{
    Elemtype data[maxn];
    int len;
} SqList;

typedef int DataType;


Elemtype  Find_Min(Elemtype A[],int n)
{

    int *vis;
    vis=(int *)malloc(sizeof(int)*n);//分配空间
    
    for(int i=0;i<n;i++)
    {
        vis[i]=0;
    }
    for(int i=0; i<n; i++)
    {
        if(!vis[A[i]]&&A[i]>0)vis[A[i]-1]=1;
    }

    for(int i=0; i<n; i++)
    {
        if(!vis[i])
        {
            return i+1;
        }
    }
    return n+1;
}


int main()
{

    int a[maxn];
    int b[maxn];
    for(int i=0; i<3; i++) //  -5 3 2 3   ; 1 2 3
    {
        scanf("%d",&a[i]);
    }



    printf("%d",Find_Min(a,3));


    return 0;
}

第十四题(2020)

简单分析,距离和S1 S2 S3中最小元素和最大元素的值有关,D=2*(max-min), 由于序列为升序,所以不断向上枚举,将min的值,变大,这样D就越来越小

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define INT_MAX 0x7f7f7f7f

typedef int Elemtype;



int abs_(int a)
{
    if(a<0)return -a;

    return a;
}

bool xls_min(int a,int b,int c) //判断三个数a是否是最小
{
    if(a<=b&&a<=c)return true;
    return false;
}

int findMinnoTrip(int A[],int n,int B[],int m,int C[],int p)
{
    int i=0,j=0,k=0,D_min=INT_MAX,D;

    while(i<n&&j<m&&k<p&&D_min>0)
    {
        D=abs_(A[i]-B[j])+abs_(A[i]-C[k])+abs_(B[j]-C[k]);
        if(D_min>D)D_min=D;

        if(xls_min(A[i],B[j],C[k]))
        {
            i++; //将距离缩短
        }
        else if(xls_min(B[j],A[i],C[k]))
        {
            j++;
        }
        else
        {
            k++;
        }

    }
    return D_min;
}
int main()
{

    int a[10];
    int b[10];
    int c[10];
    for(int i=0; i<3; i++) //  -1 0 9
    {
        scanf("%d",&a[i]);
    }

     for(int i=0; i<4; i++) //  -25 -10 10 11
    {
        scanf("%d",&b[i]);
    }

     for(int i=0; i<5; i++) //  2 9 17 30 41
    {
        scanf("%d",&c[i]);
    }




    printf("%d",findMinnoTrip(a,3,b,4,c,5));


    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值