数据结构实践(C语言版)

1、编一C程序,它能读入两组整数(每组整数都以 -9999为结束标记,个数都不大于1000),并以从小到大的次序输出这两组整数都包含的所有整数(同一个整数不能输出两次)。输入时,两个相邻的整数用空格隔开。

答案:

#include<stdio.h>
void main(){
    void sort(int x[], int n);
    void output(int x[], int y[], int lx, int ly);
    void output_use_pointer(int *x, int *y);
    int a[1000],b[1000],i,len_a,len_b;
    int *p1,*p2;
    p1=a;
    p2=b;
    printf("enter numbers(end with -9999):\n");
    for(i=0;i<1000;i++,p1++){
        scanf("%d",p1);
        if(*p1==-9999){
            len_a = i;
            break;
        }

    }
    len_a = i;
    printf("length of a:%d\n",len_a);
    sort(a, len_a);
    printf("enter other numbers(end with -9999):\n");
    for(i=0;i<1000;i++,p2++){
        scanf("%d",p2);
        if(*p2 ==-9999){
            len_a = i;
            break;
        }
    }
    len_b = i;
    printf("length of b:%d\n",len_b);
    sort(b,len_b);
    //output(a,b,len_a,len_b);
    output_use_pointer(a,b);
}

void sort(int x[], int n){
    int i,j,k,tmp;

    for(i=0;i<n-1;i++){
        k=i;
        for(j=i+1;j<n;j++){
            if(x[k] > x[j]) k=j;
        }
        if(k != i){
            tmp = x[k];
            x[k] = x[i];
            x[i] = tmp;
        }
    }
}

void output(int x[], int y[], int lx, int ly){
    printf("the final array is :\n");
    int z[lx+ly],i=0,j=0,k=0;
    if(x[0]<=y[0]){
        z[0] = x[0];
        i=1;
    }else{
        z[0] = y[0];
        j=1;
    }

    while(i<lx && j<ly){
        if(x[i]<=y[j]){
            if(x[i] != z[k]){
                 k++;
                z[k] = x[i];
            }
            i++;
        }else{
            if(y[j] != z[k]){
                k++;
                z[k] = y[j];
            }
            j++;
        }
    }
    while(i<lx){
        if(x[i] != z[k]){
            k++;
            z[k] = x[i];
        }
        i++;
    }
    while(j<ly){
         if(y[j] != z[k]){
            k++;
            z[k] = y[j];
        }
        j++;
    }

    for(i=0;i<=k;i++){
        printf("%d\t",z[i]);
    }
}

void output_use_pointer(int *x, int *y){
    int *p,*t;
    p = t = x+1000;
    if(*x <= *y){
        *p = *x;
        x++;
    }else{
        *p = *y;
        y++;
    }
    while(*x != -9999 && *y != -9999){
        if(*x<=*y){
            if(*p != *x){
                p++;
                *p = *x;
            }
            x++;
        }else{
            if(*p != *y){
                p++;
                *p = *y;
            }
            y++;
        }
    }
    while(*x != -9999){
        if(*p != *x){
            p++;
            *p = *x;
        }
        x++;
    }
    while(*y != -9999){
        if(*p != *y){
            p++;
            *p = *y;
        }
        y++;
    }
    p++;
    *p = -9999;

    for(p = t; *p != -9999; p++){
        printf("%d\t", *p);
    }
}

大致思路:

1)分别用两个整型数组保存输入的整数

2)对两个数组分别排序(从小到大)。答案中使用了选择排序,也可以使用冒泡、插入等基本排序方法。

3)对两个已经排好序的数组进行归并排序。排序结果放在第三个数组中。(答案中使用了两种方法output 和 output_use_pointer。 output函数使用了数组方式,output_use_pointer使用指针方式。任意一种都可以得到想要的效果。不过在数据量比较大时,使用指针相对会快一些,但是没有数组直观,且容易出错。)

4)输出结果。

转载于:https://my.oschina.net/Sandyguoguo/blog/855418

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值