删除/增加线性数据--数组的某一项,合并数组

1、删除数组的某一项

/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年7月16日
*版本号:v1.0
*
*问题描:删除线性数据--数组的某一项,并使得数组变短
*输入描述:;
*程序输出:
*/
#include<stdio.h>
#define size 10
int deletedata(int a[],int length,int local);
int main()
{
    int n=10;
    int d[size]={0,1,2,3,4,5,6,7,8,9};
    int local,i;
    printf("原数组是:\n");
    for(i=0;i<n;i++)
    {
        printf("%d ",d[i]);
    }
    printf("请输入需要删除的数组中元素的下标:\n");
    scanf("%d",&local);
    n=deletedata(d,n,local);//数组名,原有长度,删除的下标;关键作用:1、改变数组内容结果;2、返回新的数组长度,供输出使用
    for(i=0;i<n;i++)//调用函数后n=9;
    {
        printf("%d ",d[i]);
    }
    return 0;
}

deletedata(int a[],int length,int local)//由于调用了数组名,相当于指针,因此改变了数组在内存中的值
{
    int i=local;
    while(i<length-1)
    {
        a[i]=a[i+1];
        i++;
    }
    length--;
    return length;
}

2、增加数组的某一项

注:增加数组的第一个程序,由于数组容量设置不足,会引起数组元素越界!!!可以参考第二个

/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年7月16日
*版本号:v1.0
*
*问题描:增加线性数据--数组的某一项,并使得数组变长输出
*输入描述:;
*程序输出:
*/
#include<stdio.h>
#define size 10
int insertdata(int a[],int length,int local,int value);
int main()
{
    int n=10;
    int d[size]={0,1,2,3,4,5,6,7,8,9};
    int local,i,value;
    printf("原数组是:\n");
    for(i=0;i<n;i++)
    {
        printf("%d ",d[i]);
    }
    printf("请输入需要插入的数组中元素的下标和数值:\n");
    scanf("%d %d",&local,&value);
    n=insertdata(d,n,local,value);
    for(i=0;i<n;i++)//调用函数后n=11;
    {
        printf("%d ",d[i]);
    }
    return 0;
}

insertdata(int a[],int length,int local,int value)//由于调用了数组名,相当于指针,因此改变了数组在内存中的值
{
    int i=length;//初始的元素已经超出原数组元素范围,原最大a[length-1],现在直接a[length]=a[length-1]
    while(i>local)
    {
        a[i]=a[i-1];
        i--;
    }
    a[i]=value;//在i=local的位置写入value的值!
    length++;
    return length;
}

但是如何避免数组越界呢????

定义一个长度100的数组,但实际只使用一部分!!!

如下程序只更改为了#define N 100

 

/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年7月16日
*版本号:v1.0
*
*问题描:增加线性数据--数组的某一项,并使得数组变长输出
*输入描述:;
*程序输出:
*/
#include<stdio.h>
#define size 100//这个非常关键,长度为100,但具体可以只使用一部分
int insertdata(int a[],int length,int local,int value);
int main()
{
    int n=10;
    int d[size]={0,1,2,3,4,5,6,7,8,9};//长度为100的数组,只使用10个
    int local,i,value;
    printf("原数组是:\n");
    for(i=0;i<n;i++)
    {
        printf("%d ",d[i]);
    }
    printf("请输入需要插入的数组中元素的下标和数值:\n");
    scanf("%d %d",&local,&value);
    n=insertdata(d,n,local,value);
    for(i=0;i<n;i++)//调用函数后n=11;
    {
        printf("%d ",d[i]);
    }
    return 0;
}

insertdata(int a[],int length,int local,int value)//由于调用了数组名,相当于指针,因此改变了数组在内存中的值
{
    int i=length;//初始的元素已经超出原数组元素范围,原最大a[length-1],现在直接a[length]=a[length-1]
    while(i>local)
    {
        a[i]=a[i-1];
        i--;
    }
    a[i]=value;//在i=local的位置写入value的值!
    length++;
    return length;
}

 

3、合并数组

 

/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年7月16日
*版本号:v1.0
*
*问题描:合并两个数组
*输入描述:;
*程序输出:
*/

#include <stdio.h>
int mergeData(int[], int, int[], int, int[]);
#define SIZE 100//
int main()
{
    int n1=10,n2=7,n3=0; //数组中实际有用元素
    int d1[SIZE]= {1,3,9,12,32,41,45,62,75,77};//其余元素为0
    int d2[SIZE]= {2,11,24,56,76,82,94};//其余元素为0
    int d3[SIZE*2];
    int i;
    printf("d1[10]数组是:\n");
    for(i=0;i<10;i++)
    {
        printf("%d ",d1[i]);
    }
    printf("\n");
    printf("d2[7]数组是:\n");
    for(i=0;i<7;i++)
    {
        printf("%d ",d2[i]);
    }
    printf("\n");
    //合并有序数组
    n3=mergeData(d1, n1, d2, n2, d3);
    //输出合并后的结果
    for(i=0; i<n3; ++i)
    {
        printf("%d ", d3[i]);
    }
    printf("%d ", d3[i]);
    printf("\n");
    return 0;
}

int mergeData(int a1[], int l1, int a2[], int l2, int a3[])
{
    int i=0,j=0,k=0;
    while(i<l1 && j<l2)
    {
        if(a1[i]<a2[j])
        {
            a3[k]=a1[i];
            i++;
            k++;
            //a3[k++]=a1[i++];
        }
        else
        {
            a3[k]=a2[j];
            k++;
            j++;
            //a3[k++]=a2[j++];
        }
    }
    while(i<l1)//a1[]数组的长度是L1(不是11),因此在两数列比较后还有剩余的元素时,就赋值给a3[]数组
    {
        a3[k++]=a1[i++];
    }
    while(j<l2)//a2[]数组的长度是L2,同上
    {
        a3[k++]=a2[j++];
    }

    return k;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值