牛骨文教育服务平台(让学习变的简单)
博文笔记

C实现可变长数组

创建时间:2017-09-12 投稿人: 浏览次数:702
#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;
//}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。