`
yangzhizhen
  • 浏览: 75302 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

C语言中动态数组操作实践

    博客分类:
  • C
阅读更多

      在C语言中,可以使用malloc函数进行动态数组的创建。所谓的动态数组是指可以由用户动态指定数组的大小,而不必一开始就把数组长度定死。

      由于代码是在VS2010中运行的,刚开始保存源文件的时候,保存的是".c"格式,编译(在VS2010中为生成)时老是出错,提示bool标识符错误。查了好久,终于找到了原因,原来VS2010中不支持C99标准,而bool类型是在C99中才有的,所以编译的时候通不过。这种错误只要将源文件的".c"格式改为".cpp"格式就可以编译通过。

      下面是源代码,里面有详细的注释说明:

#include<stdio.h>
#include<malloc.h>		//包含了malloc函数
#include<stdlib.h>		//包含了exit函数
//定义了一个数据类型,该数据类型的名字为struct Array
struct Array
{
	int * pBase;		//存储的是数组中第一个元素的地址
	int len;			//数组所能容纳的最大元素个数
	int cnt;			//当前数组有效元素的个数
};
//函数声明
void initArr(struct Array * pArr, int length);						//初始化
bool appendElement(struct Array * pArr, int value);					//追加元素
bool insertElement(struct Array * pArr, int position, int value);	//插入元素,position从1开始
bool deleteElement(struct Array * pArr, int position, int * pValue);//删除
int getElement(struct Array * pArr, int position);					//获取相应位置元素,positon从1开始
bool isEmpty(struct Array * pArr);									//是否为空
bool isFull(struct Array * pArr);									//是否已满
void sortArr(struct Array * pArr);									//冒泡排序
void showArr(struct Array * pArr);									//显示内容
void inversionArr(struct Array * pArr);								//倒置

int main(void)
{ 
	//定义一个数组类型的变量
	struct Array arr;
	//删除时,返回删除的元素
	int value;
	//调用初始化数组的函数
	initArr(&arr, 6);
	//调用显示数组元素的函数
	showArr(&arr);
	//调用向数组中添加元素的函数
	appendElement(&arr, 56);
	appendElement(&arr, 100);
	appendElement(&arr, 23);
	appendElement(&arr, 12);
	appendElement(&arr, 72);
	//调用获取指定位置处元素的方法,并输出
	printf("第2个元素的值为:%d\n", getElement(&arr, 2));
	//调用插入元素的函数
	insertElement(&arr, 2, 99);
	//调用删除元素的函数
	if(deleteElement(&arr, 1, &value))
	{
		printf("删除成功\n");
		printf("您删除的元素为: %d\n", value);
	}
	else
		printf("删除失败!\n");
	showArr(&arr);
	//调用倒置数组的函数
	inversionArr(&arr);
	printf("倒置后数组元素为:\n");
	showArr(&arr);
	//调用冒泡排序的函数
	sortArr(&arr);
	printf("排序后的数组元素为:\n");
	showArr(&arr);
	getchar();
	return 0;
}
/*
 *初始化数组的函数
 */
void initArr(struct Array * pArr, int length)
{
	pArr->pBase = (int *)malloc(sizeof(int) * length );
	if(NULL == pArr->pBase)				//如果内存分配失败
	{
		printf("动态内存分配失败!\n");
		exit(-1);						//终止整个程序
	}
	else								//如果内存分配成功,就初始化数组
	{
		pArr->len = length;
		pArr->cnt = 0;
	} 
	return;            
}
/*
 *输出数组中的所有元素的函数
 */
void showArr(struct Array * pArr)
{
	if(isEmpty(pArr))			//如果数组为空
	{				
		printf("数组为空!\n");
	}
	else						//如果数组不为空
	{	int i;			
		for(i=0;i<pArr->cnt;i++) 
			printf("%d ", pArr->pBase[i]);
		printf("\n");
	}
}
/*
 *判断数组是否为空的函数
 */
bool isEmpty(struct Array * pArr)
{
	//判断元素是否为0
	if(0 == pArr->cnt)
		return true;
	else
		return false;
}
/*
 *判断数组是否已满的函数
 */
bool isFull(struct Array * pArr)
{
	if(pArr->cnt == pArr->len)
		return true;
	else
		return false;
}
/*
 *在数组末尾追加元素的函数
 */
bool appendElement(struct Array * pArr, int value)
{
	if(isFull(pArr))			//满时返回false
		return false;
	//不满时追加
	pArr->pBase[pArr->cnt] = value;
	pArr->cnt++;
	return true;
}
/*
 *向数组中插入元素的
 */
bool insertElement(struct Array * pArr, int position, int value)
{
	if(isFull(pArr))
		return false;
	if(position < 1 || position > pArr->cnt+1)
		return false;
	int i;
	for(i=pArr->cnt-1;i>=position-1;i--)
	{
		pArr->pBase[i+1] = pArr->pBase[i];
	}
	//插入值
	pArr->pBase[position-1] = value;
	pArr->cnt++;
	return true;
}
/*
 *删除数组中指定位置处的元素
 */
bool deleteElement(struct Array * pArr, int position, int * pValue)
{
	int i;
	if(isEmpty(pArr))								//数组为空不能删除
		return false;
	if(position < 1 || position > pArr->cnt)		//要删除的元素的位置不合法
		return false;
	//将要删除的元素赋给pValue
	*pValue = pArr->pBase[position-1];
	//删除元素,并将后面的元素往前移
	for(i=position;i<pArr->cnt;i++)
	{
		pArr->pBase[i-1] = pArr->pBase[i];
	}
	pArr->cnt--;
	return true;
}
/*
 *将数组元素倒置的函数
 */
void inversionArr(struct Array * pArr)
{
	int i = 0;
	int 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 sortArr(struct Array * 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;
			}
		}
	}
}
/*
 *获取指定位置元素的函数,positon从1开始
 */
int getElement(struct Array * pArr, int position)
{
	return pArr->pBase[position - 1];
}

 

2
0
分享到:
评论
1 楼 lpsky 2013-05-14  
同志,你这不算动态数组啊,一开始就指定了最大元素的个数了。

相关推荐

    C语言二维数组编程练习

    通过实践,你可以更好地理解和掌握二维数组的存储、遍历以及与函数和指针的交互,这些都是C语言编程中不可或缺的部分。同时,别忘了不断反思和改进你的代码,吸收他人的建议,这是成为一名优秀程序员的关键。

    C语言中的数组运算

    在C语言中,数组是一种非常基础且重要的数据结构,它允许程序员存储一组相同类型的数据。数组运算在C语言编程中占据着核心地位,理解和熟练...在编程实践中,应灵活运用数组,同时注意避免数组越界和内存泄漏等问题。

    C语言循环、数组、函数及指针练习题精选及答案

    - 指针可以用来动态内存分配、数组操作、字符串处理以及函数调用。 - 通过指针,可以实现数据结构如链表、树等,以及高级算法如快速排序、二分查找等。 结合“习题+答案”这个文件,你可以通过练习和解答来巩固...

    C语言数组的数组 排序,删除,查找联合搬

    总结,C语言中的数组操作是程序设计的基础,理解并掌握各种排序、删除和查找算法及其优化方法对于提升代码效率至关重要。联合搬算法提供了一种思路,帮助我们在处理复杂数据操作时提高效率。在实践中,我们需要灵活...

    C语言中数组的运算

    本资料包包含46个C语言源文件,专门探讨数组的运算,特别是各种排序算法的实现,这对于理解和掌握C语言的数组操作至关重要。下面我们将详细讲解数组在C语言中的概念、操作以及常见的数组运算实例。 1. **数组定义与...

    c语言数组参数最大值最小值

    总的来说,C语言数组参数最大值最小值的程序是理解和实践数组操作的一个好例子,它涉及到基本的循环、条件判断以及指针的使用,这些都是C语言编程的基础技能。对于初学者来说,不断编写这样的小程序并分享给他人可以...

    c语言习题 (数组).zip

    学习C语言数组的过程中,可能会遇到的习题类型可能包括但不限于:数组的声明、初始化、元素访问、数组遍历、多维数组操作、数组与指针的交互、数组作为函数参数的使用、动态分配数组等。这些习题可以帮助你熟练掌握...

    大一c语言数组实验心得.docx

    排序算法是数组操作中的一种重要算法,用于将数组元素按照一定的顺序排列。常见的排序算法有冒泡排序、选择排序、插入排序等。排序算法可以使用指针和数组结合来实现,例如使用指针数组来实现冒泡排序。 四、指针和...

    c语言编程题之数组操作分发饼干.zip

    总的来说,通过这个“数组操作分发饼干”的编程题,你可以锻炼到C语言中的数组操作、排序算法、贪心策略以及问题建模等技能。这是一个很好的实践机会,可以帮助你在面对实际编程挑战时更加得心应手。

    C语言教学+数组.pptx

    C语言是一种广泛应用于系统开发、软件工程和嵌入式系统的编程语言,它的基本数据类型包括整型、字符型和浮点型。数组是C语言中非常重要的一...在编程实践中,掌握这些知识点能够帮助开发者更高效地管理和操作大量数据。

    很好很实用的C语言课件 二维数组

    2. 《C程序设计题解与上机指导》(第三版),谭浩强编著,清华大学出版社,提供了大量练习题和上机实践指导,有助于加深对二维数组操作的理解。 3. 《C语言教程》(A Book on C Programming in C Fourth Edition),Al ...

    C语言实验报告 数组.pdf

    【C语言实验报告 数组.pdf】是一份关于C语言中数组操作的实验报告,主要涵盖了三个方面的内容:一维数组的查找最大值和最小值、自定义字符串比较函数以及在字符串中查找特定字符。 1. **一维数组的查找最大值和...

    c语言入门编程之数组操作加一.zip

    在C语言中,数组是一种非常基础且重要的数据结构,它允许我们存储一组...通过实践数组操作,可以更好地掌握指针、内存管理等C语言的核心概念。对于初学者来说,不断练习和应用这些知识,才能真正掌握C语言编程的精髓。

    c语言二维数组初始化.zip

    在解压并学习“c语言二维数组初始化.zip”中的内容时,你可能会遇到如何声明、如何初始化、如何访问和操作二维数组元素以及如何释放动态分配内存的例子。这些基础知识对理解C语言中的数组处理至关重要,特别是对于...

    C语言实例循环嵌套数组指针函数结构体

    在C语言编程中,循环、嵌套、数组、指针、函数和结构体是核心概念,它们构成了C语言的强大功能和灵活性。以下是对这些概念的详细解释和实践应用。 一、循环 C语言中的循环主要有三种类型:for循环、while循环和do-...

    juzhenchengfa.rar.rar_C语言二维数组_QT 矩阵_qt二维数组_二维数组

    本篇将深入探讨如何利用C语言的二维数组在QT环境中实现矩阵的乘法操作,并结合QT的图形用户界面(GUI)进行交互展示。 首先,让我们理解二维数组的概念。二维数组可以视为一个表格,由多个一维数组(行或列)组成,...

    C语言程序设计数组字符串指针PPT学习教案.pptx

    这些操作是C语言程序设计中的基础操作,掌握这些操作对于C语言程序设计非常重要。 在该PPT学习教案中,我们还提供了一些实践题目和例子,旨在帮助学生更好地理解和掌握数组的应用。 该PPT学习教案为C语言程序设计...

    c语言编程题之数组操作1比特与2比特字符.zip

    在解答这个问题时,你需要理解字符编码的基础知识,熟悉C语言数组操作,掌握位运算,并能设计和实现相应的算法。这不仅考验了编程能力,也锻炼了逻辑思维和问题解决技巧。在实践中不断练习,你将更深入地掌握这些...

    C语言的二维数组的指针访问

    二维数组的指针访问在C语言中 一、理解二维数组的指针访问 在C语言中,二维数组的指针访问是学习指针的最大难点。如果真正弄懂了这个问题,就可以说你学会了使用指针。二维数组的指针指向二维数组的存储地址。在...

Global site tag (gtag.js) - Google Analytics