顺序储存-数组

C语言连续储存-数组

这个使用指针和结构体来模拟数组的存储,并实现java中ArrayList的部分功能。

struct Arr{
	int *pBase;		//存储的是数组第一个元素的地址
	int len;		//数组所能容纳的最大元素的个数
	int cnt;		//当前数组有效元素的个数
};

完成10个功能,几乎所有的函数都必须传入结构体类型的指针变量,在后面就不特别说明了。

void init_arr(struct Arr * pArr,int length);		//1.初始化数组
bool append_arr(struct Arr * pArr,int value);	  //2.在数组末尾追加一个元素
bool insert_arr(struct Arr * pArr,int pos, int value);//3.插入一个元素
bool delete_arr(struct Arr * pArr,int pos,int * pVal);//4.删除一个元素
int get(struct Arr * pArr);							//5.获取当前元素
bool is_empty(struct Arr * pArr);					//6.判断数组是否为空
bool is_full(struct Arr * pArr);					//7.判断数组是否满
void sort_arr();									//8.对数组进行排序
void show_arr(struct Arr * pArr);					//9.遍历输出数组
void insersion_arr(struct Arr * pArr);				//10.数组的反转
  1. 初始化数组,需传入参数为结构体中的struct Arr *类型的指针变量、数组的最大存储个数。

    void init_arr(struct Arr * pArr,int length){	// 1
    	pArr->pBase = (int *)malloc(sizeof(int) * length);
    	if(NULL == pArr->pBase){
    		printf("动态内存你分配失败!!");
    		exit(0);	//程序终止,要调用exit(0);函数,需添加头文件:#include<stdlib.h>
    	}else{
    		pArr->len = length;		//数组元素最大个数 
    		pArr->cnt = 0;			//初始化元素个数,一开始是0个
    		printf("数组初始化成功!!\n"); 
    	}
    	return;
    }
    
  2. 在数组末尾追加一个元素,需传入value,表示插入的值。

    bool append_arr(struct Arr * pArr,int value){	// 2
    	if(is_full(pArr)){		//如果数组满了,就不能插入
    		printf("\n数组满了,添加失败");
    		return false;
    	}else{
    		pArr->pBase[pArr->cnt] = value;
    		pArr->cnt++;		//插入一个数后,数组当前有效个数加1
    		printf("\n添加成功   %d",value);
    		return true;
    	}
    }
    
  3. 在特定位置添加一个数,需传入posvalue,分别代表插入的位置和插入的值。pos从1开始,如数组a[6] = {1,2,3,4,5};在pos=2处插入8,即得a[6] = {1,8,2,3,4,5};

    且若是数组满了,则不能插入;若数组只有i(0<i<=cnt)个数时,当传入的pos>i时,则默认在数组当前值后面一位插入值。

    bool insert_arr(struct Arr * pArr,int pos, int value){ // 3
    	if(pos>pArr->cnt+1 || pos<1){
    		printf("\npos 的值不合法");
    		return false;
    	}
    	if(is_full(pArr)){
    		printf("\n数组满了,不能再添加值了");
    		return false;
    	}
    	int i;
    	if(pArr->cnt >= pos){
    		for(i = pArr->cnt-1; i >= pos-1;i--){
    			pArr->pBase[i+1] = pArr->pBase[i];
    		}
    		pArr->pBase[pos-1] = value;
    		printf("\n插入成功   %d",value);
    		pArr->cnt++;
    		return true;
    	}else{
    		pArr->pBase[pArr->cnt] = value;
    		printf("\n插入成功   %d",value);
    		pArr->cnt++;
    		return true;
    	}
    }
    
  4. 删除一个数,需传入pos 和一个int *类型的指针变量(有时需要得到删除的数)。

    bool delete_arr(struct Arr * pArr,int pos,int * pVal){	// 4
    	if(is_empty(pArr)){
    		printf("\n数组为空,无可删除");
    		return false;
    	}
    	if(pos>pArr->cnt || pos<1){
    		printf("\npos 的值不合法");
    		return false;
    	}
    	int i;
    	*pVal = pArr->pBase[pos-1];	//先获取要删除的数
    	for(i = pos;i<=pArr->cnt-1;i++){	
    		pArr->pBase[i-1] = pArr->pBase[i]; 
    	}
    	pArr->cnt--;
    	printf("\n删除成功   %d",*pVal);
    	return true;
    }
    
  5. 得到当前元素

    int get(struct Arr * pArr){						// 5
    	return pArr->pBase[pArr->cnt-1];
    }
    
  6. 判断数组是否为空

    bool is_empty(struct Arr * pArr){				// 6
    	if(pArr->cnt == 0) 
    		return true;
    	else
    		return false;
    }
    
  7. 判断数组是否满

    bool is_full(struct Arr * pArr){				// 7
    	if(pArr->cnt == pArr->len)
    		return true;
    	else
    		return false;
    }
    
  8. 数组的排序,略。

  9. 输出数组。

    void show_arr(struct Arr * pArr){				// 9
    	int i;
    	if(is_empty(pArr)){
    		printf("数组为空!!");
    		return;
    	}else{
    		printf("\n\n数组内容为\n");
    		for(i = 0;i < pArr->cnt;i++){
    			printf("%-6d",pArr->pBase[i]);
    		}
    		printf("\n");
    		return;
    	}
    }
    
  10. 数组的反转。

    void insersion_arr(struct Arr * pArr){			// 10
    	if(is_empty(pArr)){
    		printf("数组为空!!");
    		return;
    	}
    	int t;
    	int i = 0;
    	int j = pArr->cnt-1;
    	while(i<j){
    		t = pArr->pBase[i];
    		pArr->pBase[i] = pArr->pBase[j];
    		pArr->pBase[j] = t;
    		i++;
    		j--;
    	}
    	return;
    }
    

main()函数调用调试以上功能

int main(){
	struct Arr arr;
	int val;
	
	init_arr(&arr,6);		//初始化数组 
	
	append_arr(&arr,1);		//添加三个数 
	append_arr(&arr,2);
	append_arr(&arr,3);		
	
	insert_arr(&arr,1,30);	//在 1 处插入一个数 
	delete_arr(&arr,3,&val);//在 3 处删除一个数 
	
	show_arr(&arr);			//遍历输出数组 
	insersion_arr(&arr);	//反转数组 
	show_arr(&arr);
	
	printf("当前数组的值为  %d",get(&arr));
	
	return 0;
}

源自:郝斌老师数据结构自学视频

注:学习笔记

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值