王道数据结构顺序表习题代码实现

p19王道数据结构顺序表习题


#include <stdio.h>

int test1(int *a,int len){
	int p = -1;//记录最小元素的位置
	int value = a[0];//记录最小元素的值
	for(int i=1;i<len;i++){
		if(a[i]<value){
			value = a[i]; p = i;
		}
	}
	a[p] = a[len-1]; 
	return value;
	
}

void test2(int *a,int len){
    //元素逆置
    int i=0;int j = len-1;
    while(i<j){
        int t = a[i];
        a[i] = a[j];
        a[j] = t;
        i++;j--;
    }
}

void test3(int *a,int len,int x){
    int j = 0;
    for(int i=0;i<len;i++){
        if(a[i]!=x) a[j++] = a[i];
    }
    printf("%d",j);
    printa(a,j);
}

void test4(int *b,int len,int s,int t){
    if(s>=t||len==0) {printf("出错");return;}
    //找到第一个大于等于s的位置
    int i = 0,j = 0;
    for(;i<len;i++){
        if(b[i]>=s) break; 
    }
    for(;j<len;j++){
        if(b[j]>t) break;
    }
    for(;j<len;j++,i++){
        b[i] = b[j]; 
    }
    len = i;
    printa(b,len);
}
void test5(int *b,int len,int s,int t){
    int j=0;
    for(int i=0;i<len;i++){
        if(!(s<=b[i]&&b[i]<=t)){
            b[j++] = b[i];
        }
    }
    printa(b,j);
}

void test6(int *b,int len){
    int i=0;
    for(int j=1;j<len;j++){
        if(b[j]!=b[i]) b[++i] = b[j];
    }
    printa(b,i);
}

void test7(int *a,int *b,int lena,int lenb){
    //a b必须有序
    int s[lena+lenb-1];
    int i=0,j=0;int p = 0;
    while(i<lena&&j<lenb){
        if(a[i]<=b[j])  s[p++] = a[i++];
        else s[p++] = b[j++];
    
    }
    while(i<lena) s[p++] = a[i++];
    while(j<lenb) s[p++] = b[j++];
    printa(s,p);
}

void test8(int *b,int l,int r){
    //l-r元素逆置换
    int i = l;int j = r;
    while(i<j){
        int t = b[i];
        b[i] = b[j];
        b[j] = t;
        i++;j--;
    }
}
void test9(int * a,int len,int x){
    int l = 0;int r = len-1;
    while(l<r){
        int mid = (l + r) /2;
        if(a[mid]>=x) r = mid;
        else l = mid + 1;
    }
    //找到互换略
}
//2010真题 数组左移 其实是转置操作 用test8 reverse功能的函数实现
void test10(int *a,int len,int p){//p左移个数
    test8(a,0,p-1);
    test8(a,p,len-1);
    test8(a,0,len-1);
    printa(a,len);
}
int main()
{
	int a [] = {1,2,3,4,5,6,10,64};
    int b [] = {1,2,3,4,5,6,10,20,30};
    test10(a,8,3);
}

void printa(int *a,int len){
    printf("\n");
    for(int i=0;i<len;i++){
        printf("%d ",a[i]);
    }
}

未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值