- 自定义一组函数,实现和数组相同的操作,包括初始化、添加、删除、插入、查找、冒泡排序等
#include<stdio.h>
#include<malloc.h>
struct Arr
{
int *pArr;
int len;
int cnt;
};
void init_arr(struct Arr *array,int cnt);
bool append_arr(struct Arr *array,int e);
bool insert_arr(struct Arr *array,int pos,int e);
bool delete_arr(struct Arr *array,int pos,int *pVal);
bool replace_arr(struct Arr *array,int pos,int e,int *pVal);
int get(struct Arr *array,int pos);
bool is_empty(struct Arr *array);
bool is_full(struct Arr *array);
void sort_arr(struct Arr *array);
void show_arr(struct Arr *array);
void inversion_arr(struct Arr *array);
int main(void)
{
struct Arr arr;
int val;
init_arr(&arr,6);
append_arr(&arr,3);
append_arr(&arr,28);
append_arr(&arr,15);
append_arr(&arr,-7);
append_arr(&arr,9);
insert_arr(&arr,1,36);
printf("显示数组元素:\n");
show_arr(&arr);
printf("准备替换数组元素......\n");
replace_arr(&arr,2,8,&val);
show_arr(&arr);
printf("被替换的元素:%d \n",val);
printf("准备删除数组元素......\n");
if(delete_arr(&arr,1,&val)){
printf("删除成功!\n");
printf("被删除的元素:%d \n",val);
}
else{
printf("删除失败!\n");
}
printf("剩余的数组元素......\n");
show_arr(&arr);
int pos = 3;
printf("获取第%d个位置上的数组元素值......\n",pos);
printf("%d \n",get(&arr,pos));
printf("排序前......\n");
show_arr(&arr);
sort_arr(&arr);
printf("排序后......\n");
show_arr(&arr);
printf("将元素逆序排列......\n");
inversion_arr(&arr);
show_arr(&arr);
return 0;
}
void init_arr(struct Arr *array,int length){
array->pArr =(int *)malloc(sizeof(int)*length);
array->len = length;
array->cnt = 0;
}
bool is_full(struct Arr *array){
if(array->cnt==array->len)
return true;
else
return false;
}
bool append_arr(struct Arr *array,int e){
if(is_full(array)){
printf("已超过数组长度,追加失败!\n");
return false;
}
else{
array->pArr[array->cnt] = e;
array->cnt = array->cnt +1;
return true;
}
}
void show_arr(struct Arr *array){
int i;
for(i=0;i<array->cnt;i++){
printf("%d ",array->pArr[i]);
}
printf("\n");
}
bool is_empty(struct Arr *array){
if(array->cnt==0)
return true;
else
return false;
}
bool insert_arr(struct Arr *array,int pos,int e){
if(pos<1||pos>array->cnt+1)
return false;
else if(pos==array->cnt+1){
append_arr(array,e);
}
else{
for(int i=array->cnt-1;i>=pos-1;i--){
array->pArr[i+1] = array->pArr[i];
}
array->pArr[pos-1] = e;
array->cnt = array->cnt+1;
return true;
}
}
bool delete_arr(struct Arr *array,int pos,int *pVal){
if(is_empty(array)){
printf("数组为空,删除失败!");
return false;
}
if(pos<1||pos>array->cnt)
return false;
else if(pos==array->cnt){
*pVal = array->pArr[pos-1];
array->cnt = array->cnt-1;
return true;
}
else{
*pVal = array->pArr[pos-1];
for(int i=pos;i<array->cnt;i++){
array->pArr[i-1] = array->pArr[i];
}
array->cnt = array->cnt-1;
return true;
}
}
bool replace_arr(struct Arr *array,int pos,int e,int *pVal){
if(pos<1||pos>array->cnt)
return false;
else{
*pVal = array->pArr[pos-1];
array->pArr[pos-1] = e;
return true;
}
}
int get(struct Arr *array,int pos){
if(pos<1||pos>array->cnt){
printf("数组元素获取失败!\n");
return -1;
}
else{
return array->pArr[pos-1];
}
}
void sort_arr(struct Arr *array){
int i,j ;
for(i=0;i<array->cnt-1;i++){
for(j=i+1;j<array->cnt;j++){
if(array->pArr[i]>array->pArr[j]){
int temp = array->pArr[j];
array->pArr[j] = array->pArr[i];
array->pArr[i] = temp;
}
}
}
}
void inversion_arr(struct Arr *array){
int i,j;
for(i=0,j=array->cnt-1;i<j;i++,j--){
int temp = array->pArr[i];
array->pArr[i] = array->pArr[j];
array->pArr[j] = temp;
}
}
- 体会:编写删除操作时,需要传入一个整型变量的地址,我之前,定义一个指针,然后传入,运行成功了,但结果出不来,卡了几个小时。