顺序表

复习顺序表

#pragma warning(disable : 4996)
void test()
{
	int index;
	array* arr1 = arr_init();     //初始化顺序表
	while (1)
	{
		printf("1:创建数据 \n");
		printf("2:插入数据 \n");
		printf("3:删除数据 \n");
		printf("4:清除数据 \n");
		printf("5:退出程序 \n");
		int cmd;
		scanf("%d", &cmd);

		switch (cmd)
		{
		case 1:
			printf("请输入要创建数据的数量:\n");
			scanf("%d", &index);
			printf("输入%d个数据:", index);
			for (int i = 0; i < index; i++)
			{
				int a;
				scanf("%d", &a);
				arr_push(arr1, a);
			}
			break;
		case 2:
			printf("请输入要插入数据的数量:\n");
			scanf("%d", &index);
			printf("输入%d个数据:", index);
			for (int i = 0; i < index; i++)
			{
				int a;
				scanf("%d", &a);
				arr_push(arr1, a);
			}
			break;
		case 3:
			printf("请输入要删除的元素值:\n");
			scanf("%d", &index);
			while (arr_find(arr1, index) >= 0)
			{
				arr_remove(arr1, arr_find(arr1, index));
			}
			break;
		case 4:
			arr_clear(arr1);
			printf("清楚数据成功\n");
			break;
		case 5:
			arr_destroy(arr1);
			exit(0);
			break;
		default:
			printf("输入错误\n");
		}
		printf("当前的数据是:");
		arr_out(arr1);
	}
}

int main()
{
	test();

	return 0;
}

array.cpp:

#define MAX_SIZE 128

#define ERROR(log) printf("\n%s:%s %s %d\n", log, __FILE__, __FUNCTION__, __LINE__)

array* arr_init() {
	array* temp = (array*)malloc(sizeof(array));
	temp->data = (int*)calloc(MAX_SIZE, sizeof(Type));
	if (temp == NULL)
	{
		ERROR("数组初始化失败");
		return NULL;
	}
	temp->capacity = MAX_SIZE;
	temp->length = 0;
	return temp;
}

void arr_destroy(array* arr)
{
	if (arr != NULL)
	{
		if (arr->data != NULL)
		{
			free(arr->data);
		}
		free(arr);
	}
}

void arr_clear(array* arr) {

	for (int i = 0; i < arr->length; i++)
	{
		arr->data[i] = 0;
	}
	arr->length = 0;
}

int arr_empty(array* arr)
{
	if (arr == NULL || arr->length == 0)
	{
		return 1;
	}
	return 0;
}

Type arr_get(array* arr, int i)
{
	if (arr_empty(arr)) return 0;
	if (arr->length <= i || i < 0) return 0;
	return arr->data[i];
}

void arr_push(array* arr, Type elem)
{
	if (arr->length + 1 >= arr->capacity)
	{
		arr->data = (int *)realloc(arr->data, arr->capacity + MAX_SIZE);
	}
	if (arr->length < arr->capacity)
	{
		arr->data[arr->length++] = elem;
	}
}

Type arr_pop(array* arr)
{
	if (arr->length == 0)
	{
		ERROR("数组数据已空");
		return 0;
	}
	Type elem = arr->data[--arr->length];
	return elem;
}

void arr_insert(array* arr, int index, Type elem)
{
	if (arr->length + 1 >= arr->capacity)
	{
		arr->data = (int*)realloc(arr->data, arr->capacity + MAX_SIZE);
	}
	int i = arr->length - 1;
	for (i; i >= index; i--)
	{
		arr->data[i + 1] = arr->data[i];
	}
	arr->data[i+1] = elem;
	arr->length++;
}

Type arr_remove(array* arr, int index) {

	if (arr_empty(arr)) return 0;
	Type elem = arr->data[index];
	for (int i = index; i < arr->length; i++)
	{
		arr->data[i] = arr->data[i + 1];
	}
	arr->length--;
	return elem;

}

void arr_out(array* arr)
{
	for (int i = 0; i < arr->length; i++)
	{
		printf("%d ", arr->data[i]);
	}
	printf("\n");
}

int arr_find(array* arr, Type elem)
{
	if (arr_empty(arr)) return -1;
	for (int i = 0; i < arr->length; i++)
	{
		if (arr->data[i] == elem)
		{
			return i;
		}
	}
	return -1;
}

array.h:

#pragma once
struct Array
{
	int* data;					//存储数组的指针
	int length;					//数组当前的长度
	int capacity;				//数组实际占用长度大小
};
typedef struct Array array;		//让结构体类型不要再加struct
typedef int Type;				//类型的定义  ,给int类型

//头文件只负责声明函数,不负责函数功能实现
#ifdef __cplusplus			 //如果你用了cpp文件实现,就会加上这段语句
extern "C" {				 //在c++编译环境里,按照c语言的方式编译,提高代码编译速度
#endif

//构造一个空的顺序线性表
	array* arr_init();

	//销毁顺序表
	void arr_destroy(array* arr);

	//重置为空表
	void arr_clear(array* arr);

	//判断是否为空表        //c语言在 c99 之前没有bool类型     在 c99 标准引入 
	int arr_empty(array* arr);

	//返回第i个数据元素的值
	Type arr_get(array* arr, int i);

	//从尾部插入数据
	void arr_push(array* arr, Type elem);

	//从尾部删除数据
	Type arr_pop(array* arr);

	//在第i个位置之前插入新的数据元素
	void arr_insert(array* arr, int index, Type elem);

	//删除第i个数据元素, 并将删除的值返回
	Type arr_remove(array* arr, int index);

	//输出顺序表
	void arr_out(array* arr);

	//寻找元素的位置
	int arr_find(array* arr, Type elem);

#ifdef __cplusplus 
}
#endif

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值