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