c语言 数据结构 顺序表

c语言顺序表

运行结果测试

测试结果

 

代码

#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct List{
	DataType *data; //元素 
	int Max_SIZE; //数组的最大容量值 初始化后默认大小为16 
	int lengh; //当前数组的长度 
	const float GROWTH_FACTOR = 0.75; // 增长因子,当数组的长度超过了它的最大容量值,将数组的容量值扩大0.75倍 
	
}Array;

void init_arr(Array *p_array); //初始化数组 
void show_arr(Array *p_array); // 打印数组所有元素 
void expansion_arr(Array *p_array); //扩容数组1.75倍 
void add(Array *p_array, DataType data); //自然添加数组元素 
void add(Array *p_array, int index, DataType data);//在指定数组下标位置添加元素 
bool delete_data(Array *p_array, DataType data);//在数组里删除你想删除的元素(数组下标从小大到的第一个) 
bool delete_index(Array *p_array, int index); // 删除数组里指定下标的元素 
bool set_index(Array *p_array, int index, DataType data);//替换数组指定下标的元素 
bool is_empty(Array *p_array);//判断数组是否为空 
bool is_full(Array *p_array);//判断数组容量是否已满 
DataType get(Array *p_array, int index);// 返回该数组指定的下标的元素 


int main()
{
	Array arr; //定义的一个叫arr的容器(自动扩容数组) 
	init_arr(&arr); //初始化容器 
	printf("把0~19的数添加到容器里\n"); 
	for(int i = 0; i < 20; i++)
	{
		add(&arr,i);
	}
	printf("目前数组长度%d\n",arr.lengh);
//  打印容器所以元素	
	show_arr(&arr); 
	printf("(从第0个开始)在容器的第4个位置添加元素20\n");
	add(&arr,4,20);	
	printf("目前数组长度%d\n",arr.lengh);
//  打印容器所以元素
	show_arr(&arr);
	printf("(从第0个开始)删除容器中的元素4和6\n"); 
	delete_data(&arr,4);
	delete_data(&arr,6);
	printf("目前数组长度%d\n",arr.lengh);
	show_arr(&arr);
	printf("(从第0个开始)删除容器里的第5个元素\n"); 
	delete_index(&arr,5); 
	printf("目前数组长度%d\n",arr.lengh);
	show_arr(&arr);
	printf("(从第0个开始)修改容器第10个位置的元素为99\n");
	set_index(&arr,10,99); 
	printf("目前数组长度%d\n",arr.lengh);
	show_arr(&arr);
	printf("(从第0个开始)3位置的元素为%d",get(&arr,3));
	return 0;	
}
//初始化数组 
void init_arr(Array *p_array)
{
	p_array->Max_SIZE = 16;
	p_array->data = (DataType *)malloc(sizeof(DataType) * p_array->Max_SIZE);
	if(p_array->data == NULL)
	{
		printf("动态分配内存失败\n");
		exit(-1);
	}
	else
	{
		p_array->lengh = 0;
	}
	return;
}
//判断数组是否为空 
bool is_empty(Array *p_array)
{
	if(p_array->lengh == 0)
	{
		return true;
	}
	else
		return false;
}
//判断数组是否已满
bool is_full(Array *p_array)
{
	if(p_array->lengh >= p_array->Max_SIZE)
	{
		return true;
	}
	else
		return false;
}
//显示数组的所有元素 
void show_arr(Array *p_array)
{
	if(is_empty(p_array))
	{
		printf("数组为空\n");
	}
	else
	{
		printf("[");
		for(int i = 0; i < (*p_array).lengh; i++)
		{
			printf("%d, ",p_array->data[i]);
		}
		printf("]\n");
	}
	return;
}
//添加元素 
void add(Array *p_array,DataType data)
{
	if(is_full(p_array))
	{
		expansion_arr(p_array);
	}
	p_array->data[(*p_array).lengh ++] = data;
}
//在指定数组下标位置添加元素 
void add(Array *p_array, int index, DataType data)
{
	if(index < 0 || index > p_array->lengh)
	{
		printf("你添加的数组下标错误\n");
		exit(-1); 
	}
	if(is_full(p_array))
	{
		expansion_arr(p_array);
	}
	for(int i = p_array->lengh; i > index; i--)
	{
		p_array->data[i] = p_array->data[i - 1];
	}
	p_array->data[index] = data;
	p_array->lengh++;
}
//替换数组指定下标的元素
bool set_index(Array *p_array, int index, DataType data)
{
	if(index < 0 || index >= p_array->lengh)
	{
		printf("错误数组下标\n");
		return false;
	}
	p_array->data[index] = data;
	return true;
}
//在数组里删除你想删除的元素(数组下标从小大到的第一个)
bool delete_data(Array *p_array, DataType data)
{
	bool flag = false;
	int index = 0;
	if(is_empty(p_array))
	{
		printf("数组为空\n");
		return flag; 
	}	
	for(int i = 0; i < p_array->lengh; i++)
	{
		if(data == p_array->data[i])
		{
			flag = true;
			index = i;
			break;	
		}
	}
	if(flag)
	{
		for(int i = index; i < p_array->lengh - 1; i++)
		{
			p_array->data[i] = p_array->data[i + 1];
		}
		p_array->lengh --;	
	}
	else
	{
		printf("目标数组没有需要删除的元素\n");
	}
	return flag;
}
// 删除数组里指定下标的元素 
bool delete_index(Array *p_array, int index)
{
	if(index < 0 || index > p_array->lengh - 1)
	{
		printf("你添加的数组下标错误\n");
	 	return false;
	}
//	删除的不是数组最后一个元素 
	if(index != p_array->lengh - 1)
	{
		for(int i = index; i < p_array->lengh - 1; i++)
		{
			p_array->data[i] = p_array->data[i + 1];
		}
		p_array->lengh --;
		return true;
	}
	else //删除数组最后一个元素 
	{
		return true;
	}
}
//扩容数组大小 
void expansion_arr(Array *p_array)
{
	Array p_new_array;
	init_arr(&p_new_array);
	p_array->Max_SIZE = p_array->Max_SIZE + (int)(p_array->Max_SIZE * p_array->GROWTH_FACTOR);
	p_new_array.data = (DataType *)malloc(sizeof(DataType) * p_array->Max_SIZE);
	if(p_new_array.data == NULL)
	{
		printf("扩容数组失败\n");
		exit(-1);
	}
	else
	{
		for(int i = 0; i < p_array->lengh; i++)
		{
			p_new_array.data[i] = p_array->data[i];
		}
		p_array->data = (DataType *)malloc(sizeof(DataType) * p_array->Max_SIZE);
		if(p_array->data == NULL)
		{
			printf("扩容数组失败\n");
			exit(-1);
		}
		for(int i = 0; i < p_array->lengh; i++)
		{
			p_array->data[i] = p_new_array.data[i];
		}
	}
	return;
}
// 返回该数组指定的下标的元素 
DataType get(Array *p_array, int index)
{
	if(index < 0 || index >= p_array->lengh)
	{
		printf("错误数组下标\n");
	}
	return p_array->data[index];
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值