java中的ArrayList 的C语言实现版本,高中写的代码,到现在都很让我骄傲呢。

论代码注释的重要性,

有时可能有些代码自己真的以后都用不上了,但是当有一天你回头看到之前写的代码也是一种让人回忆的东西

下面时2015年时写的一段C语言代码。其实有时候学会一些算法真的不在于用什么语言。我学C语言如的门,

感觉学java时就很顺畅。虽然C语言但是注释很清晰。哈哈

#include<stdio.h> //标准输入输出函数
#include<malloc.h>//包含了malloc函数
#include<stdlib.h>//包含了exit函数
/*	
	2015年10月3日20:54:39
	连续数组储存问题,为学链表做铺垫,2019_5_22当时写的不太对,其实此程序已经算是一个半成品的链表了。
	函数意思以确定,但本程序内含有大量算法,以后可以自己琢磨下,
*/
//定义的了一个数据类型,而不是变量,该数据类型的名字叫做struct Arr
//该数据类型含有三个成员,分别是:pBase,len,cnt
struct Arr
{
	int * pBase;//存储的是数组第一个元素地址
	int len;	//数组所能容纳的最大元素的个数
	int cnt;	//当前数组有效元素的个数
};
void init_arr(struct Arr * pArr,int length);    //定义初始化函数,动态分配空间,并赋值;pArr是用来储存数组的第一位地址的参数,lenth是用来让用户输入数组的长度的
bool append_arr(struct Arr * pArr,int val);		//定义追加函数,就是在最末尾加上一个元素
bool insert_arr(struct Arr *,int pos,int val);	//定义插入函数,pos的值从1开始,
bool delete_arr(struct Arr *,int pos,int *pval);//定义删除函数,删除某个特定的元素
bool is_empt(struct Arr *pArr);					//定义是否为空函数,判断数组是否为空的函数
bool is_full(struct Arr *pArr);					//定义是否存满函数,判断数组是否存满的函数
void sort_arr(struct Arr *pArr);				//定义倒置函数,把所以的元素倒置排序
void show_arr(struct Arr *pArr);                //定义输出函数,内部还是用printf()函数
int get();										//有空字节实现
void inversion_arr(struct Arr *pArr);			//定义排序函数
												//后续待添加  数组自动扩容,可以根据is_full来判断是否需要扩容
//主函数*****************************************************************************************************************************************************************************************
int main(void)
{
	struct Arr arr;//定义一个变量
	int val;

	init_arr(&arr,6);//需要传参    
	show_arr(&arr);  //这时的数组还为空,先测试下看看
	append_arr(&arr,1);
	append_arr(&arr,10);
	append_arr(&arr,-3);
	append_arr(&arr,6);
	append_arr(&arr,88);
	append_arr(&arr,11);
	if( delete_arr(&arr,-1,&val))
	{
		printf("删除成功!\n");
		printf("你删除的元素是:%d\n",val);
	}
	else
	{
		printf("删除失败!\n");//删除失败的条件是delete_arr()中第二个参数的范围,必须在0到数组最大长度
	}
	show_arr(&arr);
	inversion_arr(&arr);
	printf("倒置之后的数组内容是:\n");
	show_arr(&arr);
	sort_arr(&arr);
	show_arr(&arr);
/*
	append_arr(&arr,2);
	append_arr(&arr,3);
	append_arr(&arr,4);
	append_arr(&arr,5);
	append_arr(&arr,7);
	insert_arr(&arr,1,99);
	
	show_arr(&arr);
	append_arr(&arr,6);	
	show_arr(&arr);

//本人感觉此函数过分调用函数,画蛇添足了,不太好,完全可以用一次函数完成
//其中还调用了两次函数,第一次把两个参数发送到bool append_arr()函数,
//&arr是这个函数的首地址,即让append_arr()函数中的pArr指针指向arr这个函数
//又调用函数is_full()函数判断数组是否已经存满,	满返回真,不满返回假,根据真假,
//if真则满返回append_arr()函数假,假则不满把8添加到尾部并返回真
//最后还要用if判断append_arr()函数真假,却只做提示成功或者失败,

	if(append_arr(&arr,8)) 
	{
		printf("追加成功\n");
	}
	else
	{
		printf("追加失败\n");
	}
*/
//	printf("%d\n",arr.len);
//	free(pArr->pBase);
	return 0;
}
//初始化函数**************************************************************************************************************************************************************************************
void init_arr(struct Arr * pArr,int length)
{
	pArr->pBase = (int *)malloc(sizeof(int)*length);//lenth是用户输入的数组长度,sizeof(int)的长度*lenth是数组总长度,
	//malloc()函数来动态分配这个数组的空间,(前边int*),把所分配的数组的首地址存在pArr->pBase中,即用pArr->pBase来存储分配的数组的首地址
	if(NULL == pArr->pBase)
	{
		printf("动态内存分配失败!\n");
		exit(-1);//终止整个程序
	}
	else
	{
		printf("动态内存分配成功!\n");
		pArr->len = length;
		pArr->cnt = 0;
	}
	free(pArr->pBase);
	//(*pArr).len = 99
	return;
}
//判断数组空函数**********************************************************************************************************************************************************************************
bool is_empty(struct Arr *pArr)//判断数组是否为空,如果空了就是真,不空就是假
{
	if(0 == pArr->cnt)
		return true;
	else
		return false;
}
//判断数组满函数**********************************************************************************************************************************************************************************
bool is_full(struct Arr *pArr)//判断数组是否已经存满,如果满了就是真,不满就是假
{
	if(pArr->cnt == pArr->len)
		return true;
	else
		return false;
}
//输出函数*****************************************************************************************************************************************************************************************
void show_arr(struct Arr *pArr)
{
	if(is_empty(pArr))//如果数组为空,就提示,不为空,就用for把所以的值输出
	{
		printf("数组为空!\n");
	}
	else
	{
		for(int i=0;i<pArr->cnt;i++)//for的作用是把数组中的所以数都输出
			printf("%d ",pArr->pBase[i]);//%d后面有空格,在输出上好区分数字
		printf("\n");
	}
}
//追加函数*****************************************************************************************************************************************************************************************
bool append_arr(struct Arr * pArr,int val)
{
	//满是返回false
	if( is_full(pArr) )
		return false;
	else
	//不满是追加,追加后返回真
	pArr->pBase[pArr->cnt] = val;
	pArr->cnt++;
	return true;
}
//插入函数*****************************************************************************************************************************************************************************************
bool insert_arr(struct Arr *pArr,int pos,int val)
//假设pos是3,val是88,则在第3为前插入88,但后面的数就要往后移动
{
	int i;

	if(is_full(pArr))
		return false;

	if(pos<1 || pos>pArr->cnt+1)//
		return false;

	for(i=pArr->cnt-1;i>=pos-1;--i)
	{
		pArr->pBase[i+1] = pArr->pBase[i];
	}
	pArr->pBase[pos-1] = val;
	(pArr->cnt)++;
	return true;
}
//删除函数*****************************************************************************************************************************************************************************************
bool delete_arr(struct Arr *pArr,int pos,int *pVal)
{
	int i;
	if(is_empty(pArr))
		return false;
	if(pos<1 || pos>pArr->cnt)
		return false;

	*pVal = pArr->pBase[pos-1];
	for(i=pos;i<pArr->cnt;++i)
	{
		pArr->pBase[i-1] = pArr->pBase[i];
	}
	pArr->cnt--;
	return true;
}
//排序函数******************************************************************************************************************************************************************************************
void inversion_arr(struct Arr *pArr)
{
	int i=0,j=pArr->cnt-1;
	int t;

	while(i<j)
	{
		t = pArr->pBase[i];
		pArr->pBase[i] = pArr->pBase[j];
		pArr->pBase[j] = t;
		++i;
		--j;
	}
	return;
}
//倒置函数******************************************************************************************************************************************************************************************
void sort_arr(struct Arr *pArr)
{
	int i,j,t;

	for(i = 0;i<pArr->cnt;++i)
	{
		for(j=i+1;j<pArr->cnt;++j)
		{
			if(pArr->pBase[i]>pArr->pBase[j])
			{
				t = pArr->pBase[i];
				pArr->pBase[i] = pArr->pBase[j];
				pArr->pBase[j] = t;
			}
		}
	}
}
//**************************************************************************************************************************************************************************************************

  这个代码里面已经涉及了一些排序啊,倒序之类的,。

猜你喜欢

转载自www.cnblogs.com/bigfire/p/10932948.html