对数组进行操作(数据结构的算法)

对数据结构线性操作的数组进行的一系列的操作。

这个都是对数组进行的一些简单操作。其中算法的实现,排序算法只是实现了一种,也只有升序。只进过了简单测试,没有做专业的测试,是可以实现的。下面是具体代码:

#include <stdio.h>
#include <malloc.h>//添加malloc函数
#include <stdlib.h>//添加exit函数
#include <stdbool.h>//添加bool

typedef struct Arr 
{
	int * pBase;//存储的是数组第一个元素的地址
	int len;	//数组所能容纳的最大元素的个数
	int cnt;	//当前数组有效元素的个数
	int increment;//自动增加因子
}ARR;

void init_arr(ARR * pArr,int length);//数组初始化数组地址和长度
bool append_arr(ARR * pArr,int val);//追加
bool insert_arr(ARR * pArr,int pos,int val);//插入 pos插入的位置
bool delete_arr(ARR * pArr,int pos,int *pval);//删除 pos删除的位置
int get(ARR * pArr,int pos);//获取pos的位置
bool is_empty(ARR * pArr);//判断是否为空
bool is_full(ARR * pArr);//判断是否满了
void sort_arr(ARR * pArr);//数组排序
void show_arr(ARR* pArr);//数组显示
void inversion_arr(ARR * pArr);//倒置

int main()
{
	ARR arr;
	int L = 6;
	int val;
	init_arr(&arr,L);
	show_arr(&arr);
	for(int i = 0; i < 3;++i)
	{
		append_arr(&arr,i);
	}
	show_arr(&arr);
	insert_arr(&arr,1,9);
	insert_arr(&arr,1,8);
	insert_arr(&arr,1,7);
	insert_arr(&arr,1,6);
	show_arr(&arr);
	delete_arr(&arr,1,&val);
	printf("删除的数为:%d\n",val);
	delete_arr(&arr,1,&val);
	printf("删除的数为:%d\n",val);
	show_arr(&arr);
	printf("你获取的数为:%d\n",get(&arr,1));
	inversion_arr(&arr);
	show_arr(&arr);
	printf("排序\n");
	sort_arr(&arr);
	show_arr(&arr);
	return 0;
}
void sort_arr(ARR * pArr)//排序,先实现一个,以后单独讨论
{
	int k = 0;
	for(int i = 0; i < pArr -> cnt;++i)
	{
		for(int j = i + 1;j < pArr -> cnt; ++j)
		{
			if(pArr -> pBase[i] > pArr -> pBase[j])
			{
				k = pArr -> pBase[i];
				pArr -> pBase[i] = pArr -> pBase[j];
				pArr -> pBase[j] = k;
			}
		
		}
	}

}
void inversion_arr(ARR * pArr)//倒置
{
	int i = 0,j = pArr -> cnt -1,k = 0;
	if(is_empty(pArr))
	{
		printf("数组为空\n");
		exit(-1);
	}
	while(i < j)
	{
		k = pArr -> pBase[i];
		pArr -> pBase[i] = pArr -> pBase[j];
		pArr -> pBase[j] = k;
		i++;j--;
	}
}
int get(ARR * pArr,int pos)//获取pos的位置
{
	if(pos < 0 || pos > pArr -> cnt )
	{
		printf("你输入的范围错误!\n");		
	}else
	{
		return (pArr -> pBase[pos]);		
	}
}
bool delete_arr(ARR * pArr,int pos,int *pval)//删除 pos删除的位置
{
	if(is_empty(pArr))
	{
		printf("数组为空,不可以在删除了。\n");
		return false;
	}else if(pos < 0 || pos > pArr -> cnt)
	{
		printf("删除的数据不在范围。\n");
	}else 
	{
		*pval = pArr -> pBase[pos];
		for(int i = pos;i < pArr -> cnt; ++i)
		{
			pArr -> pBase[i] = pArr -> pBase[i + 1];
		}
		(pArr -> cnt)--;
		return true;		
	}
}
bool insert_arr(ARR * pArr,int pos,int val)//插入 pos插入的位置
{
	if(is_full(pArr))
	{
		printf("没有位置可以插入\n");
		return false;
	}else if(pos < 0)
	{
		printf("插入的位置有误\n");
		return false;
	}else
	{
		for(int i = pArr -> cnt;i >= pos;--i)
		{
			pArr -> pBase[i] = pArr -> pBase[i-1]; 
		}
			(pArr -> cnt) ++;				
			pArr -> pBase[pos] = val;
			return true;
	}

}
bool is_full(ARR * pArr)
{
	if(pArr -> cnt == pArr -> len)
	{
		return true;	
	}else
	{
		return false;
	}
}
bool append_arr(ARR * pArr,int val)
{
	if(is_full(pArr))
	{
		printf("数组已满!\n");
		return false;
	}else
	{
		pArr -> pBase[pArr -> cnt] = val;
		(pArr -> cnt) ++;
		return true;
	}
}
void init_arr(ARR* pArr,int length)
{
	if(length < 0)
	{
		printf("输出有误!\n");
		exit(-1);
	}
	else
	{
		pArr -> len = length;
		pArr -> cnt = 0;
		pArr -> pBase = (int *)malloc(sizeof(int)*length);
	}
	return;
}
bool is_empty(ARR * pArr)
{
	if(pArr -> cnt == 0)
	{
		return true;
	}else
	{
		return false;
	}

}
void show_arr(ARR* pArr)
{
	if(is_empty(pArr))
	{
		printf("数组为空\n");
	}
	else
	{
		for(int i = 0;i < pArr -> cnt;++i)
		{
			printf("%d\n",pArr -> pBase[i]);
		}
	}
}

执行结果:

猜你喜欢

转载自blog.csdn.net/m0_38036750/article/details/87967907