#include
#include
#include
typedef struct Array
{
int len; //记录数组的长度
int num; //记录数组使用的个数
int *head; //保存数组的首地址
}A;
/*******************************************************************************
* 函数名 : init_array()
* 函数功能 : 初始化数组,给数组申请一定长度的地址空间,同时给数组使用大小的个数为0
* 输入 : 结构体的地址,设置数组的长度
* 输出 : 返回0
*******************************************************************************/
int init_array(A *arr,int len)
{
arr->head=(int *)malloc(sizeof(int)*len);
//动态申请内存程序。申请了一个int型的地址(int*) 返回的是申请内存的首地址
if(NULL==arr){
printf("Dynamic storage fail to distribute!");
exit(-1); //exit(0)表示程序正常退出;除了0之外,其他参数均代表程序异常退出
}
//如果内存没有申请成功 程序异常退出
arr->len=len;
arr->num=0;
return 0;
}
/*******************************************************************************
* 函数名 : isFull()
* 函数功能 : 判断是否还有空位置
* 输入 : 结构体的地址
* 输出 : 返回1 or 0
*******************************************************************************/
int isFull(A *arr){
if(arr->num>=arr->len){ //比较数组使用个数与数组的长度
return 1;
}else{
return 0;
}
}
/*******************************************************************************
* 函数名 : isEmpty()
* 函数功能 : 判断是否为空数组
* 输入 : 结构体的地址
* 输出 : 返回1 or 0
*******************************************************************************/
int isEmpty(A *arr){
if(arr->num==0){ //判断数组的使用个数是否为0
return 1;
}
return 0;
}
/*******************************************************************************
* 函数名 : append()
* 函数功能 : 为数组顺序依次赋值
* 输入 : 结构体的地址
* 输出 : 返回1、0
*******************************************************************************/
int append(A *arr,int val){
if(isFull(arr)){ //先判断数组是否有空位置
return 0;
}else{
arr->head[arr->num]=val; //往数组的第num个地址的位置传入value @@@
(arr->num)++; //同时将数组使用的个数加1
}
return 1;
}
/*******************************************************************************
* 函数名 : insert()
* 函数功能 : 在指定位置插入值
* 输入 : 结构体地址,数组第几个位置(下标位置),需要插入的值
* 输出 : 返回1
*******************************************************************************/
int insert(A *arr,int index,int val)
{
if(isFull(arr)) //判断是否有位置
{
return 0;
}
if(index<0&&index>arr->len-1)
//判断插入的位置是否正确 (逻辑与)插入的位置是否大于数组的总长度-1
{
return 0;
}
int temp =arr->len;
//先定义一个变量保存没有改变前的数组长度
while(temp>index)
//原来数组的长度要大于插入的位置
{
arr->head[temp]=arr->head[temp-1];
//给数据的前一位赋值数据后一位的 循环数据后移一位 直到插入的位置为空
--temp; //原来数组的长度减1
}
arr->head[index]=val; //插入要插入的值
arr->num++; //添加使用的次数
return 1;
}
/*******************************************************************************
* 函数名 : show_array()
* 函数功能 : 显示打印遍历数组
* 输入 :结构体的地址
* 输出 :
*******************************************************************************/
void show_array(A *arr)
{
int i;
for(i=0;inum;i++) //for循环遍历数组
{
printf("%d",arr->head[i]);
}
printf("\n");
}
/*******************************************************************************
* 函数名 : remove_array()
* 函数功能 : 删除数组里面指定位置的元素
* 输入 :结构体的地址 ,删除的指定位置
* 输出 : 返回1,0
*******************************************************************************/
int remove_array(A *arr,int index){
if(arr->num<=0){
//判断数组里的个数是否为0
return 0;
}
if(index<0&&index>arr->num-1){
//判断删除的位置是否正确 (逻辑与)删除的位置是否大于数组的总长度-1
return 0;
}
int temp=index;
//先定义一个变量保存要删除位置的下标
while(tempnum-1){
//判断删除的位置下标是否大于数组最后一个的下标
arr->head[temp]=arr->head[temp+1];
// 循环将后面的值往前移一位 直到循环结束
temp++;
}
--arr->num; //将数组的使用个数减 1
return 1;
}
/*******************************************************************************
* 函数名 : inverse()
* 函数功能 : 数组反转
* 输入 :结构体的地址
* 输出 : 返回1,0
*******************************************************************************/
int inverse(A *arr){
if(arr->num<=0){ //判断数组内个数是否大于1
return 0;
}
int temp=0;
int temp2=arr->num; // 定义一个变量temp2保存数组使用的个数
while(temp!=temp2){ //判断 temp 和 temp2 是否不相等
int x=arr->head[temp]; //定义一个中间变量保存数组的第一个值
arr->head[temp]=arr->head[temp2-1]; //将最后一个数组的值赋给第一个
arr->head[temp2-1]=x; //通过中间变量将数组中的第一个值赋给最后一个
temp++; //依次将第二个和倒数第二个下标 规律++
temp2--;
}
return 1;
}
/*******************************************************************************
* 函数名 :replace()
* 函数功能 : 替换数组的元素
* 输入 :结构体的地址,数组第几个位置,需要插入的值
* 输出 : 返回1,0
*******************************************************************************/
int replace(A * arr,int index,int val){
if(arr->len<=0 || index<0 ||index >arr->num-1){
//逻辑或 数组长度小于等于0 或 替换位置小于0 或 替换位置超出数组的长度
return 0;
}
arr->head[index]=val;
return 1;
}
int main (void)
{
A a1;
int x,y,z,l;
printf("创建数组长度\n");
printf("输入数组的长度:\n");
scanf("%d",&x);
init_array(&a1,x);
while(1)
{
printf("******************目前数组的状况如下*********************\n");
printf("********数组共有%d个存储空间,当前已经使用%d空间********\n",a1.len,a1.num);
printf("********************************************************\n");
printf("******************选择你需要的 *** 作*********************\n");
printf(" 1.数组的正常赋值 \n");
printf(" 2.按位置插入赋值 \n");
printf(" 3.按位置删除 \n");
printf(" 4.更换元素的值 \n");
printf(" 5.把数组元素倒转 \n");
printf(" 6.判断数组是否为空 \n");
printf(" 7.判断数组是否还有存储空间 \n");
printf(" 8.退出程序 \n");
printf("---------------------------------------------------------\n");
printf(" 输入你的选择: \n");
scanf("%d",&y);
switch(y)
{
case 1:
printf("输入需要添加的值:");
scanf("%d",&z);
append(&a1,z);
show_array(&a1);
break;
case 2:
printf("输入需要插入的位置0-%d:",a1.len-1);
scanf("%d",&z);
printf("输入需要添加的值%d:");
scanf("%d",&l);
insert(&a1,z,l);
show_array(&a1);
break;
case 3:
printf("输入需要删除的位置0-%d:",a1.len-1);
scanf("%d",&z);
remove_array(&a1,z);
show_array(&a1);
break;
case 4:
printf("输入需要更换的位置0-%d:",a1.len-1);
scanf("%d",&z);
printf("输入需要更换的值:");
scanf("%d",&l);
replace(&a1,z,l);
show_array(&a1);
break;
case 5:
printf("反转数组结果");
inverse(&a1);
show_array(&a1);
break;
case 6:
printf("判断数组是否为空数组");
printf("1代表是空数组;0代表不是空数组:%d\n",isEmpty(&a1));
break;
case 7:
printf("判断数组是否有存储位置");
printf("1代表有存储位置;0代表没有存储位置:%d\n",isFull(&a1));
break;
case 8:
goto tiaochu;
}
}
tiaochu:
printf("程序结束");
}
后续会继续修改完善……
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)