C实现可变长数组
#include<stdio.h>
#include<malloc.h>
#include<string.h>
//int ElemType 测试用 全部写完记得修改为void* ElemType
//typedef int ElemType;如要测试去掉此句注释,注释掉下一句
typedef void* ElemType;
//结构体柔性数组
typedef struct _SoftArray{
int len;//定义长度
ElemType array[];//定义数组
}SoftArray;
//创建柔性数组
SoftArray *CreateSoftArray(int size){
SoftArray* sa=NULL;
ElemType data=NULL;
sa=(SoftArray*)malloc(sizeof(SoftArray)+sizeof(int)*size);
if(!sa){
return 0;
}
sa->len=size;
sa->array[0]=NULL;
return sa;
}
//如果数组是用malloc建立的话,重新建立一个,copy所有元素。
//然后把指针指向新数组,原来的数组free掉。
SoftArray *DeleteSoftArray(SoftArray *sa,int index){
//参数为序号与柔性数组地址
int length=sa->len-1;
//创建删除后的数组,长度为原数组长度-1
SoftArray *saDel=CreateSoftArray(length);
//9-11进度至此
int i;
for(i=0;i<length;i++){
if(i<index){
saDel->array[i]=sa->array[i];
}
else{
saDel->array[i]=sa->array[i+1];
}
}
return saDel;
}
//删除整个数组
SoftArray *DeleteAll(SoftArray* sa){
memset(sa,0,sizeof(sa));
return sa;
}
//在数组最后添加子项
SoftArray *AddToLast(SoftArray* sa,ElemType last){
int length=(sa->len)+1;
SoftArray *saAdd=CreateSoftArray(length);
for(int i=0;i<length-1;i++){
saAdd->array[i]=sa->array[i];
}
saAdd->array[length-1]=last;
return saAdd;
}
//获取任意数组项数据
ElemType GetArrayData(SoftArray *sa,int index){
for(int i=0;i<sa->len;i++){
if(i==index){
return (sa->array[i]);
}
}
return NULL;//输入序号不存在
}
//获取数组长度
int GetLength(SoftArray *sa){
return sa->len;
}
//合并两个数组
SoftArray *Merge(SoftArray *a,SoftArray *b){
//在前的组成新数组的前部分,在后的组成后部分
int newLength;
newLength=(a->len)+(b->len);
SoftArray *newArray=CreateSoftArray(newLength);
for(int i=0;i<a->len;i++){
newArray->array[i]=a->array[i];
}
for(int j=0;j<b->len;j++){
newArray->array[j+(a->len)]=b->array[j];
}
return newArray;
}
//如要测试去掉下方所有注释
//int main(){
//
//// typedef int ElemType;
// //测试创建数组
// int length;
// printf(" please input the length:");
// scanf("%d",&length);
// SoftArray *a=CreateSoftArray(length);
//
// for(int i=0;i<length;i++){
// a->array[i]=(i+1);
// }
// for(int j=0;j<length;j++){
// printf("%d ",a->array[j]);
// }
//
// //测试删除任意数组项
// printf(" please input the index to delete:");
// int index;
// scanf("%d",&index);
// a=DeleteSoftArray(a,index);
// for(int j=0;j<a->len;j++){
// printf("%d ",a->array[j]);
// }
// printf(" 删除后数组长度为 %d",a->len);
//
// //测试在数组最后添加子项
// int last;
// printf(" 请输入需要在末尾添加的子项:");
// scanf("%d",&last);
// a=AddToLast(a,last);
// for(int j=0;j<a->len;j++){
// printf("%d ",a->array[j]);
// }
//
// //测试输入序号查询数据
//
// printf(" 请输入所查询的序号:");
// scanf("%d",&index);
// int data1=GetArrayData(a,index);
// printf("数据为%d",data1);
//
// //测试获取数组长度
// printf(" 数组长度为%d",GetLength(a));
//
// //测试合并数组
// printf(" 现在生成一个新数组b,请输入其长度:");
// scanf("%d",&length);
// SoftArray *b=CreateSoftArray(length);
//
// for(int i=0;i<b->len;i++){
// b->array[i]=(i+11);
// }
// for(int j=0;j<b->len;j++){
// printf("%d ",b->array[j]);
// }
//
// printf(" 输出合并后的数组");
// SoftArray *c=Merge(a,b);
// for(int j=0;j<c->len;j++){
// printf("%d ",c->array[j]);
// }
// //测试删除全部数组
// a=DeleteAll(a);
// printf(" 全部删除后a数组长度为 %d",a->len);
//
// return 0;
//}
#include<malloc.h>
#include<string.h>
//int ElemType 测试用 全部写完记得修改为void* ElemType
//typedef int ElemType;如要测试去掉此句注释,注释掉下一句
typedef void* ElemType;
//结构体柔性数组
typedef struct _SoftArray{
int len;//定义长度
ElemType array[];//定义数组
}SoftArray;
//创建柔性数组
SoftArray *CreateSoftArray(int size){
SoftArray* sa=NULL;
ElemType data=NULL;
sa=(SoftArray*)malloc(sizeof(SoftArray)+sizeof(int)*size);
if(!sa){
return 0;
}
sa->len=size;
sa->array[0]=NULL;
return sa;
}
//如果数组是用malloc建立的话,重新建立一个,copy所有元素。
//然后把指针指向新数组,原来的数组free掉。
SoftArray *DeleteSoftArray(SoftArray *sa,int index){
//参数为序号与柔性数组地址
int length=sa->len-1;
//创建删除后的数组,长度为原数组长度-1
SoftArray *saDel=CreateSoftArray(length);
//9-11进度至此
int i;
for(i=0;i<length;i++){
if(i<index){
saDel->array[i]=sa->array[i];
}
else{
saDel->array[i]=sa->array[i+1];
}
}
return saDel;
}
//删除整个数组
SoftArray *DeleteAll(SoftArray* sa){
memset(sa,0,sizeof(sa));
return sa;
}
//在数组最后添加子项
SoftArray *AddToLast(SoftArray* sa,ElemType last){
int length=(sa->len)+1;
SoftArray *saAdd=CreateSoftArray(length);
for(int i=0;i<length-1;i++){
saAdd->array[i]=sa->array[i];
}
saAdd->array[length-1]=last;
return saAdd;
}
//获取任意数组项数据
ElemType GetArrayData(SoftArray *sa,int index){
for(int i=0;i<sa->len;i++){
if(i==index){
return (sa->array[i]);
}
}
return NULL;//输入序号不存在
}
//获取数组长度
int GetLength(SoftArray *sa){
return sa->len;
}
//合并两个数组
SoftArray *Merge(SoftArray *a,SoftArray *b){
//在前的组成新数组的前部分,在后的组成后部分
int newLength;
newLength=(a->len)+(b->len);
SoftArray *newArray=CreateSoftArray(newLength);
for(int i=0;i<a->len;i++){
newArray->array[i]=a->array[i];
}
for(int j=0;j<b->len;j++){
newArray->array[j+(a->len)]=b->array[j];
}
return newArray;
}
//如要测试去掉下方所有注释
//int main(){
//
//// typedef int ElemType;
// //测试创建数组
// int length;
// printf(" please input the length:");
// scanf("%d",&length);
// SoftArray *a=CreateSoftArray(length);
//
// for(int i=0;i<length;i++){
// a->array[i]=(i+1);
// }
// for(int j=0;j<length;j++){
// printf("%d ",a->array[j]);
// }
//
// //测试删除任意数组项
// printf(" please input the index to delete:");
// int index;
// scanf("%d",&index);
// a=DeleteSoftArray(a,index);
// for(int j=0;j<a->len;j++){
// printf("%d ",a->array[j]);
// }
// printf(" 删除后数组长度为 %d",a->len);
//
// //测试在数组最后添加子项
// int last;
// printf(" 请输入需要在末尾添加的子项:");
// scanf("%d",&last);
// a=AddToLast(a,last);
// for(int j=0;j<a->len;j++){
// printf("%d ",a->array[j]);
// }
//
// //测试输入序号查询数据
//
// printf(" 请输入所查询的序号:");
// scanf("%d",&index);
// int data1=GetArrayData(a,index);
// printf("数据为%d",data1);
//
// //测试获取数组长度
// printf(" 数组长度为%d",GetLength(a));
//
// //测试合并数组
// printf(" 现在生成一个新数组b,请输入其长度:");
// scanf("%d",&length);
// SoftArray *b=CreateSoftArray(length);
//
// for(int i=0;i<b->len;i++){
// b->array[i]=(i+11);
// }
// for(int j=0;j<b->len;j++){
// printf("%d ",b->array[j]);
// }
//
// printf(" 输出合并后的数组");
// SoftArray *c=Merge(a,b);
// for(int j=0;j<c->len;j++){
// printf("%d ",c->array[j]);
// }
// //测试删除全部数组
// a=DeleteAll(a);
// printf(" 全部删除后a数组长度为 %d",a->len);
//
// return 0;
//}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 数组元素平移交换
- 下一篇: C语言 可变长度的数组 -2