数据结构_P11

# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
/*
*	数组:自己做一套数组相关的方法(插入、删除等操作功能)
*	2016年6月7日14:08:06 - 2016年6月7日20:32:52
*/
struct Arr	//定义了一个数据类型,名字叫Arr,该数据类型含有三个成员
{
	int *pBase;		//数组头结点指针
	int len;	//数组长度
	int	cnt;	//数组当前有效个数
};

void init_arr(struct Arr*, int);	//初始化
bool append_arr(struct Arr*, int);	//尾部追加,返回是否成功追加
bool insert_arr(struct Arr*, int pos, int val);	//注:这里定义pos从1开始,插入的值在pos值元素之前
void delete_arr(struct Arr*, int pos);	//删除成功与否要返回,同时把删除的元素输出
int get();		//获取数组中特定下标的值
bool is_empty(struct Arr*);	//判断数组是否为空
bool is_full(struct Arr*);		//判断数组是否为满
void sort_arr(struct Arr*);	//数组排序:这里练习冒泡排序(递增)
void show_arr(struct Arr*);	//输出显示数组
bool inversion_arr(struct Arr*);	//倒置数组

int main(void)
{
	struct Arr arr;		//定义一个数据类型Arr的变量arr,现在已经分配了内存,但是没有初始化,里面是垃圾值,也没有逻辑上的数组
	init_arr(&arr, 6);		//初始化后,arr成员中的pBase将指向一个整型数组头结点,数组生成,当前有效个数应该为零
//	show_arr(&arr);
	
	append_arr(&arr, 3);
	append_arr(&arr, 4);
	append_arr(&arr, 5);
	append_arr(&arr, 6);
//	append_arr(&arr, 6);
//	append_arr(&arr, 5);

	if(append_arr(&arr, 111))  //在用一个函数方法时,这样写更便于看到函数调用的情况
		printf("追加成功!\n");
	else
		printf("追加失败!\n");
	show_arr(&arr);

	if( insert_arr(&arr, 4, 542))
		printf("插入成功!\n");
	else
		printf("插入失败!\n");
	show_arr(&arr);

	delete_arr(&arr, 2);
	show_arr(&arr);

	if( inversion_arr(&arr) )
	{
		printf("倒置成功!\n倒置后的数组为:");
		show_arr(&arr);
	}
	else
		printf("倒置失败!\n");

	sort_arr(&arr);
	printf("排序后的数组为: ");
	show_arr(&arr);

	return 0;
}

void init_arr(struct Arr* pArr, int length)
{
//	pArr->len = 99;  //注意指针是这样访问成员的,不是用'.';前面也没有*
//	(*pArr).len = 100;  //也可以这样
	pArr->pBase = (int*)malloc(sizeof(int) * length);
	if (NULL == pArr->pBase)    //如果内存满了,malloc申请失败,会把NULL赋给pBase
	{
		printf("动态内存分配失败!");
		exit(-1);		//终止整个程序,需要加头文件stdlib.h
	}
	else
	{
		pArr->len = length;
		pArr->cnt = 0;
	}
	return;		//这里的return表示一个函数在这里编写完成,方便别人阅读,不代表其他意义
}

bool is_empty(struct Arr* pArr)
{
	if(pArr->cnt == 0)
		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
	{
		printf("数组长度为: %d, 当前有效个数为: %d\n", pArr->len, pArr->cnt);
		for(int i=0; i<pArr->cnt; i++)
		{
			printf("%d ", pArr->pBase[i]);
		}
		printf("\n");
	}
}

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

bool insert_arr(struct Arr* pArr, int pos, int val)
{
	if(pos<1 || pos>pArr->len || is_full(pArr))
		return false;
	else
	{	
		for(int j=pArr->cnt; j>=pos; j--)
		{
			pArr->pBase[j] = pArr->pBase[j-1];
		}
		pArr->pBase[pos-1] = val;
		pArr->cnt++;
		return true;
	}
}

void delete_arr(struct Arr* pArr, int pos)
{
	if( is_empty(pArr) || pos<1 || pos > pArr->cnt )
		printf("删除失败!\n");
	else
	{
		printf("删除成功!\n");
		printf("删除的数为: %d\n", pArr->pBase[pos-1]);
		for(int y=pos; y<pArr->cnt; y++)
		{
			pArr->pBase[y-1] = pArr->pBase[y];
		}
		pArr->cnt--;
	}
}

bool inversion_arr(struct Arr* pArr)
{
	if( is_empty(pArr) || pArr->cnt<2 )
		return false;
	else
	{
		int p;
		int j = pArr->cnt;
		for(int i=1; i<=(pArr->cnt/2); i++)
		{
			p = pArr->pBase[i-1];
			pArr->pBase[i-1] = pArr->pBase[j-1];
			pArr->pBase[j-1] = p;
			j--;
		}
		return true;
	}
}

void sort_arr(struct Arr* pArr)		//冒泡排序:每次把最小数放到数组最前面
{
	int i;
	int j = pArr->cnt;
	int temp;
	for(i=0; i<j-1; i++)
	{
		for(int p=i+1; p<=j-1; p++)
		{
			if(pArr->pBase[p] < pArr->pBase[i])
			{
				temp = pArr->pBase[i];
				pArr->pBase[i] = pArr->pBase[p];
				pArr->pBase[p] = temp;
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值