数据结构之连续存储——实现与数组有关的操作

  • 自定义一组函数,实现和数组相同的操作,包括初始化、添加、删除、插入、查找、冒泡排序等
/************************************************************
* 功能:自定义一组函数,实现和数组相同的操作,包括初始化、添加、删除、插入、查找、排序等
* 作者:khq
* 时间:2020.4.11
*************************************************************/
#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);  

//在位置pos处插入数组元素e
bool insert_arr(struct Arr *array,int pos,int e); 

//将位置pos上的元素删除,并将值通过e返回 
bool delete_arr(struct Arr *array,int pos,int *pVal);  

//在位置pos处用元素e替换该处元素,返回被替换的元素,由pVal接收
bool replace_arr(struct Arr *array,int pos,int e,int *pVal);  

//获取数组中位置pos处的某个元素
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");
	}
	//append_arr(&arr,7);
	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);  //为整型数组动态分配内存空间,并返回首地址给pArr
	 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;  //有效元素个数加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;
}

//在位置pos处插入数组元素e,考虑在首尾插入元素的可能
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;
	 }		 
}

//将位置pos上的元素删除,并将值通过e返回 
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;
	}		
}

//在位置pos处用元素e替换该处元素,返回被替换的元素,由pVal接收
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;
	}
}

//获取数组中位置pos处的某个元素
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; 
	}
}

  • 体会:编写删除操作时,需要传入一个整型变量的地址,我之前,定义一个指针,然后传入,运行成功了,但结果出不来,卡了几个小时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值