C实现数组的基本功能

实现了数组的基本操作:插入,删除,逆序,排序等

不足之处,只能在初始化的时候确定数组的大小,数组满时不能动态扩充容量(以后改进);排序算法可用其它代替冒泡。


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>


//定义数组类型


//定义数据结构体
typedef struct Array
{
int cnt;//当前有效数据个数
    int * pBase;//数组指针,类型为int
int len;//数组长度

}ARR,*PARR;


bool InitArr(PARR pArr,int len);//初始化数组,len<1返回false
bool Append(PARR pArr, int value);//在末尾追加数据
bool Insert(PARR pArr, int pos,int value);//插入数据,元素从第一个开始,插入在指定位置前面
bool Delete(PARR pArr,int pos,int *value=NULL);//删除指定位置元素
void SortArr(PARR pArr);//数组排序,使用冒泡排序
void InverteArr(PARR pArr);//数组逆序
//int GetArrLength(PARR pArr); 数组有效数字长度在结构体中
int FindValuePos(PARR pArr,int Value,bool First=true);//查找指定元素位置,找不到返回-1,
  //First为True返回第一个元素位置,否则返回最后一个元素位置
void ShowArr(PARR pArr);//显示数组
bool IsEmpty(PARR pArr);//判断数组是否空
bool IsFull(PARR pArr);//判读数组是否满
bool ReleaseArr(PARR pArr);//释放数组资源










int main()
{
//定义数组头
ARR  arr;
//初始化
InitArr(&arr,10);
Append(&arr,3);
Append(&arr,4);
Append(&arr,5);
Append(&arr,6);
Append(&arr,22);
Append(&arr,33);
Append(&arr,33);
Insert(&arr,4,9999);


//显示数组
ShowArr(&arr);
InverteArr(&arr);




/* 测试FindValuePos
int i,j;
i=FindValuePos(&arr,33);
j=FindValuePos(&arr,33,false);
printf("%d,%d",i,j);
*/
//显示数组
ShowArr(&arr);
SortArr(&arr);
ShowArr(&arr);



system("pause");
return 0;
}




bool InitArr(PARR pArr,int len)
{
if(len<0)
return false;
pArr->pBase=(int*)malloc(sizeof(int)*len);
//初始化数组
memset(pArr->pBase,0,sizeof(int)*len);
pArr->cnt=0;
pArr->len=len;
return true;
}


//释放资源
bool ReleaseArr(PARR pArr)
{
if(NULL==pArr->pBase)
{
return false;
}
else
{
 free(pArr->pBase);
 pArr->pBase=NULL;
}
}


//判断数组是否空
bool IsEmpty(PARR pArr)
{
return 0==pArr->cnt||NULL==pArr->pBase;
}
//判读数组是否满
bool IsFull(PARR pArr)
{
return pArr->cnt==pArr->len&&NULL!=pArr->pBase;
}


//在末尾追加数据
bool Append(PARR pArr, int value)
{
//数组满,追加元素失败
if(IsFull(pArr))
{
//printf("test\n");
return false;
}

//pArr->pBase[pArr->cnt++]=value;
pArr->pBase[pArr->cnt]=value;
pArr->cnt++;
return true;


}


//显示数组
void  ShowArr(PARR pArr)
{
if(IsEmpty(pArr))
{
printf("数组没有数据");
}
printf("数值内容为:\n");
for(int i=0;i<pArr->cnt;++i)
{
printf("%d ",pArr->pBase[i]);
}
}


//插入数据,元素从第一个开始,插入在指定位置前面
bool Insert(PARR pArr, int pos,int value)
{
//数组满
if(IsFull(pArr))
return false;
//位置不能插入
if(pos<1||pos>pArr->cnt+1)
return false;
for(int i=pArr->cnt;i>=pos;--i)
{
//不是交互而是移动
//int t=pArr->pBase[i];
pArr->pBase[i]=pArr->pBase[i-1];
//pArr->pBase[i+1]=t;
}
pArr->pBase[pos-1]=value;
pArr->cnt++;
return true;
}


//查找指定元素位置,找不到返回-1,
//First为True返回第一个元素位置,否则返回最后一个元素位置
int FindValuePos(PARR pArr,int Value,bool First/*=true*/)
{
if(IsEmpty(pArr))
return false;
int pos=-1;


if(First)
{
for(int i=0;i<pArr->cnt;++i)
if(Value==pArr->pBase[i])
{
pos=i+1;
break;
}
}
else
{
for(int i=pArr->cnt-1;i>=0;--i)
{
if(Value==pArr->pBase[i])
{
pos=i+1;
break;
}


}


}
return pos;


}


//数组逆序
void InverteArr(PARR pArr)
{
if(pArr->cnt<2)
return ;
int mid=pArr->cnt/2;
int last=pArr->cnt-1;
for(int i=0;i<mid;i++)
{
int t=pArr->pBase[i];
pArr->pBase[i]=pArr->pBase[last-i];
pArr->pBase[last-i]=t;
}


}


//数组排序,使用冒泡排序
void SortArr(PARR pArr)
{
if(IsEmpty(pArr))
return ;
for(int i=0;i<pArr->cnt;i++)
{
for(int j=i+1;j<pArr->cnt;j++)
{
if(pArr->pBase[i]>pArr->pBase[j])
{
int t=pArr->pBase[j];
        pArr->pBase[j]=pArr->pBase[i];
        pArr->pBase[i]=t;
}
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值