zoukankan      html  css  js  c++  java
  • 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("删除成功!
    ");
    		printf("你删除的元素是:%d
    ",val);
    	}
    	else
    	{
    		printf("删除失败!
    ");//删除失败的条件是delete_arr()中第二个参数的范围,必须在0到数组最大长度
    	}
    	show_arr(&arr);
    	inversion_arr(&arr);
    	printf("倒置之后的数组内容是:
    ");
    	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("追加成功
    ");
    	}
    	else
    	{
    		printf("追加失败
    ");
    	}
    */
    //	printf("%d
    ",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("动态内存分配失败!
    ");
    		exit(-1);//终止整个程序
    	}
    	else
    	{
    		printf("动态内存分配成功!
    ");
    		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("数组为空!
    ");
    	}
    	else
    	{
    		for(int i=0;i<pArr->cnt;i++)//for的作用是把数组中的所以数都输出
    			printf("%d ",pArr->pBase[i]);//%d后面有空格,在输出上好区分数字
    		printf("
    ");
    	}
    }
    //追加函数*****************************************************************************************************************************************************************************************
    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;
    			}
    		}
    	}
    }
    //**************************************************************************************************************************************************************************************************
    

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

  • 相关阅读:
    json转为url参数
    cocos creator 03 构建项目出错的问题 无法找到NDK
    《架构之美》阅读笔记四
    《架构之美》阅读笔记三
    《架构之美》阅读笔记二
    《架构之美》阅读笔记一
    软件需求开发最佳实践— —阅读笔记三
    软件需求开发最佳实践——阅读笔记二
    软件需求开发最佳实践——阅读笔记一
    软件需求与分析课堂讨论一
  • 原文地址:https://www.cnblogs.com/bigfire/p/10932948.html
Copyright © 2011-2022 走看看