#include<stdio.h>
#include<stdlib.h>
//定义了一个数据类型叫struct Arr 该数据类型包含 3个成员
struct Arr{ //12个字节
int *pBase;//存储数组第一个元素的地址
int len;//数组所能容纳的最大元素个数
int cnt;//当前数组有效元素的个数
};
//不用指针 用值得话 导致方法里存在局部变量 不能使主方法的改变 只能传地址
void Init_arr(struct Arr *p,int length){ //传参 哪个变量 长度
p->pBase=(int *)malloc(sizeof(int)*length);//4*6=24个字节 表示p指向pBase这个成员变量(分配内存) 第一块第一个字节地址赋给pBase
if(NULL==p->pBase){ //地址满了就会把NULL赋给pBase
printf("动态内存分配失败");
exit(-1); //终止程序
}
else{
p->len=length; //赋值长度
p->cnt=0; //还未赋值
}
return ;
}
bool is_empty(struct Arr *p){ //判断是否为空
if(0==p->cnt){ //有效个数为空
printf("有效个数为空!");
return true;
}
else
return false;
}
void show_arr(struct Arr *p){ //输出内容
if(is_empty(p)){ //p已经存放arr的地址 //调用是否为空 为true执行下一条语句
printf("数组为空!\n");
}
else{
for(int i=0;i<p->cnt;i++)
printf("%d\t",p->pBase[i]);
printf("\n");
}
}
bool is_full(struct Arr *p){ //判断是否满
if(p->cnt==p->len){
printf("已满!");
return true;
}
else
return false;
}
bool append_arr(struct Arr *p,int x){ //添加数值
//判断是否满
if(is_full(p))
return false;
//不满时加值
p->pBase[p->cnt]=x; //p->pBase[0]=1;cnt=1
(p->cnt)++; //p->pBase[1]=2;cnt=2
return true; //p->pBase[2]=3;cnt=3 //cnt为元素个数
//p->pBase[p->cnt]=x; cnt的值为新放元素下标
} //(p->cnt)++; 元素个数加一
bool insert_arr(struct Arr *p,int pos,int x){ //在位置pos前面插入(pos从1开始) 插入元素x 后面的元素后移
int i;
if(is_full(p))
return false;
if(pos<1||pos>p->cnt+1){
printf("插入位置不合法!");
return false;
}
for(i=p->cnt-1;i>=pos-1;i--){
p->pBase[i+1]=p->pBase[i]; //后移
}
p->pBase[pos-1]=x;
p->cnt++;
return true;
}
int main(){
int n,pos,x,L,t;
struct Arr arr; //struct Arr 相当于数据类型 只定义了 是垃圾数字 需要初始化
printf("输入数组长度:");
scanf("%d",&L);
Init_arr(&arr,L); //初始化 传地址 &arr=strcut Arr *p
printf("你要输入几个值:");
scanf("%d",&t);
printf("请输入:");
for(int i=0;i<t;i++){
scanf("%d",&n);
append_arr(&arr,n);
}
printf("输出结果为:");
show_arr(&arr);
printf("请输入在什么位置:");
scanf("%d",&pos);
printf("插入:");
scanf("%d",&x);
insert_arr(&arr,pos,x);
printf("插入后结果:");
show_arr(&arr);
}
![]()