数据结构-连续存储数组:对数组(结构体定义)进行增删改查输出

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

struct Arr
{
	int* pBase;                                              // 存储数组第一个元素的地址
	int len;                                                 // 数组的长度,即数组最大元素的个数
	int cnt;                                                 // 数组有效元素的个数
};

void init_arr(struct Arr * parr, int length);                // 初始化数组,以便为其各元素赋值
bool append_arr(struct Arr * parr, int value);               // 末尾追加元素
bool insert_arr(struct Arr *parr, int pBase_num, int value); // 中间插入元素
bool delete_arr(struct Arr *parr, int value);                // 删除元素
bool get(struct Arr *parr, int i);                           // 获取下标为i的值
bool is_empty(struct Arr * parr);                            // 判断是否为空
bool is_full(struct Arr * parr);                             // 判断是否为满
void sort_arr(struct Arr* parr);                             // 排序
void show_arr(struct Arr * arr);                             // 输出
void inversion_arr(struct Arr *parr);                        // 倒置数组

int main(void)
{
	struct Arr arr;
	init_arr(&arr,10);
	printf("初始化数组后:\n");
	show_arr(&arr);
	append_arr(&arr, 39);
	append_arr(&arr, 2);
	append_arr(&arr, 5);
	append_arr(&arr, 8);
	append_arr(&arr, 39);
	append_arr(&arr, 8);
	printf("追加元素后数组:\n");
	show_arr(&arr);
	insert_arr(&arr, 2, 7);
	printf("在第2个元素插入7后,数组:\n");
	show_arr(&arr);
	delete_arr(&arr, 8);
	printf("删除数组中为8的元素后:\n");
	show_arr(&arr);
	get(&arr, 2);
	inversion_arr(&arr);
	printf("数组倒置:\n");
	show_arr(&arr);
	sort_arr(&arr);
	printf("排序后数组为:");
	show_arr(&arr);
	inversion_arr(&arr);
	printf("排序后数组倒置:\n");
	show_arr(&arr);

	return 0;
}

void init_arr(struct Arr * parr, int length)
{
	parr->pBase = (int*)malloc(sizeof(int) * length);
	if (NULL == parr->pBase)
	{
		printf("内存分配失败");
		exit(1);
	}
	else
	{
		parr->len = length;
		parr->cnt = 0;
	}
	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))
	{
		printf("数组为空\n");
	}
	else
	{
		for (int i = 0; i < parr->cnt; i++)
		{
			printf("%3d", parr->pBase[i]);
		}
		printf("\n");
	}
}

bool append_arr(struct Arr * parr, int value)
{
	if (is_full(parr))
	{
		return false;
	}
		parr->pBase[parr->cnt] = value;
		parr->cnt++;
		return true;
}

bool insert_arr(struct Arr* parr, int pBase_num, int value)
{
	int i;
	if (is_full(parr) || pBase_num > parr->cnt)
		return false;

	parr->cnt++;
	for(i = (parr->cnt) - 1; i >= pBase_num - 1; i--)
	{
		parr->pBase[i+1] = parr->pBase[i];
	}
	parr->pBase[pBase_num - 1] = value;

	return true;
}

bool delete_arr(struct Arr* parr, int value)
{
	int i;

	if (is_empty(parr))
	{
		printf("删除失败!\n");
		return false;
	}
	for (i = 0; i < parr->cnt; i++)
	{
		if (parr->pBase[i] == value)
		{
			for (int j = i; j < parr->cnt; j++)
			{
				parr->pBase[j] = parr->pBase[j + 1];
			}
			parr->cnt--;
		}
	}
	return true;
}

void sort_arr(struct Arr * parr)
{
	int i, j, temp;
	for (i = 0; i < parr->cnt; i++)
	{
		for (j = i+1; j < parr->cnt; j++)
		{
			if (parr->pBase[i] > parr->pBase[j])
			{
				temp = parr->pBase[i];
				parr->pBase[i] = parr->pBase[j];
				parr->pBase[j] = temp;
			}
		}
	}
}

void inversion_arr(struct Arr* parr)
{
	int i, j, temp;
	i = 0;
	j = parr->cnt - 1;
	while (i <= j)
	{
		temp = parr->pBase[i];
		parr->pBase[i] = parr->pBase[j];
		parr->pBase[j] = temp;
		i++;
		j--;
	}
}

bool get(struct Arr* parr, int i)
{
	if (i < 0 || i >= parr->cnt)
	{
		return false;
	}
	else
	{
		printf("下标为%d的值为%d\n", i, parr->pBase[i]);
		return true;
	}
}

输出结果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱建伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值