码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构入门——动态数组

时间:2015-08-05 13:04:19      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:数据结构   编程   入门   动态数组   arraylist   

    数组的一大缺点就是长度定义后不能再改变,此程序实现了动态数组,类似于Java中的ArrayList的结构,有增、删、排序、遍历、扩容追加等功能。


动态数组的实现:

/*
	2013年2月16日19:18:35
	此程序将数组中的元素进行追加、删除、排序、遍历输出等操作。
	与java中的各方法相同,从而更加深入理解java中的方法。
*/

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

struct Arr
{
	int * pBase;
	int len;
	int cnt;
	//int increment; //自动增长因子,便于快速增加数组长度,提高效率。
};

//函数声明
void init_arr(struct Arr *); //创造并初始化一个动态数组
bool is_empty(struct Arr *); //判断数组是否为空
bool is_full(struct Arr *); //判断数组是否为满
bool changelen_arr(struct Arr *); //改变数组长度
bool append_arr(struct Arr *); //追加数组元素
bool insert_arr(struct Arr *); //插入数组元素
bool delete_arr(struct Arr *); //删除数组元素
int get(struct Arr *); //获取数组元素
void sort_arr(struct Arr *); //排序
void show_arr(struct Arr *); //遍历输出
void inversion_arr(struct Arr *); //倒置
int find_val_arr(struct Arr *); //寻找含有此数值的元素
bool delete_all_arr(struct Arr *); //删除含有此数值的所有元素

int main(void)
{
	struct Arr arr;	

	init_arr(&arr);
	show_arr(&arr);
	changelen_arr(&arr);
	append_arr(&arr);
	insert_arr(&arr);
	delete_arr(&arr);
	show_arr(&arr);
	inversion_arr(&arr);
	show_arr(&arr);
	sort_arr(&arr);
	printf("排序后的结果为:\n");
	show_arr(&arr);
	show_arr(&arr);

	return 0;
}

void init_arr(struct Arr * pArr)
{
	int i;
	int length;
	
	pArr->pBase = (int *)malloc(sizeof(int));
	if (NULL == pArr->pBase)
	{
		printf("内存分配失败!\n");
		exit(-1);
	}

	printf("请输入您需要的节点长度:");
	scanf("%d", &length);

	pArr->pBase = (int *)malloc(sizeof(int)*length);
	pArr->len = length;
	pArr->cnt = 0;

	for (i=0; i<length; ++i)
	{
		printf("请输入第%d个数据:", i+1);
		scanf("%d", &pArr->pBase[i]);
		(pArr->cnt)++;
	}

	return;
}

bool is_empty(struct Arr * pArr)
{
	if (pArr->cnt == 0)
	{
		printf("数组为空!\n");
		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)
{
	int i;

	if( is_empty(pArr) )
	{
		printf("数组为空!\n");
		return;
	}

	printf("\n数组中的数据为:\n");

	for (i=0; i<pArr->cnt; ++i)
	{
		printf("%d  ", pArr->pBase[i]);
	}
	printf("\n");

	return;
}

bool changelen_arr(struct Arr * pArr)
{
	int len;

	printf("请输入修改后的长度:len = ");
	scanf("%d", &len);

	realloc(pArr->pBase, sizeof(int)*len);
	pArr->len = len;

	if (NULL == pArr->pBase)
	{
		printf("内存重新分配失败!\n");
		return false;
	}
	else
		return true;
}

bool append_arr(struct Arr * pArr)
{
	int val;
	if ( is_full(pArr) )
	{
		printf("数组已满!\n");
		return false;
	}
	else
	{
		printf("请输入需要追加的数据:val = ");
		scanf("%d", &val);
		pArr->pBase[pArr->cnt] = val;
		(pArr->cnt)++;
		return true;
	}
}

bool insert_arr(struct Arr * pArr)
{
	int i, t;
	int pos, val;
	
	if ( is_full(pArr) )
	{
		printf("数组已满,无法插入!\n");
		return false;
	}

input:
	printf("请输入需要插入的位置:pos = ");
	scanf("%d", &pos);
	printf("请输入需要插入的数据:val = ");
	scanf("%d", &val);

	if (pos < 1 || pos > pArr->cnt+1)
	{
		printf("输入插入位置有误!\n");
		goto input;
	}

	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 i;
	int val;
	if ( is_empty(pArr) )
	{
		printf("数组为空,无法删除!");
		return false;
	}

	printf("请输入您需要删除的元素位置:");
	scanf("%d", &pos);

	val = pArr->pBase[pos-1];

	for (i=pos; i<pArr->cnt-1; ++i)  //插入和删除元素都需要循环进行位移,效率很低。
	{
		pArr->pBase[i-1] = pArr->pBase[i];
	}
	printf("删除成功,您删除的元素是:%d", val);
	return true;
}

int get(struct Arr * pArr)
{
	int pos;

	printf("请输入您需要获取的元素位置:");
	scanf("%d", &pos);

	printf("元素数据为:%d\n", pArr->pBase[pos-1]);
	return pArr->pBase[pos-1];
}

//冒泡排序法
void sort_arr(struct Arr * pArr)
{
	int i, j, t;

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

	return;
}

void inversion_arr(struct Arr * pArr)
{
	int i, j, t;

	i = 0;
	j = pArr->cnt;

	while (i < j)
	{
		pArr->pBase[i] = pArr->pBase[j];
		++i;
		--j;
	}

	return;
}

int find_val_arr(struct Arr * pArr)
{
	int i;
	int val;
	int count = 0;

	printf("请输入需要查找的元素数值:val = ");
	scanf("%d", &val);

	for (i=0; i<pArr->cnt; ++i)
	{
		if (val == pArr->pBase[i])
		{
			printf("元素的下标为:%d", i);
			count++;
		}
	}

	printf("含有此元素数值的个数为:%d", count);

	return count;
}

bool delete_all_arr(struct Arr * pArr)
{
	int i, j;
	int val;
	int count = 0;
	
	if ( is_empty(pArr) )
	{
		printf("数组为空,无法删除!");
		return false;
	}

	printf("请输入需要删除的元素数值:val = ");
	scanf("%d", &val);

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

			printf("删除成功!");
			count++;
			(pArr->cnt)--;
		}
	}

	printf("删除元素的总个数为:%d", count);

	return true;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构入门——动态数组

标签:数据结构   编程   入门   动态数组   arraylist   

原文地址:http://blog.csdn.net/lfhappypain/article/details/47293191

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!