数据结构--连续内存分配的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34686440/article/details/79983092

数据结构存储:

struct Arr {
	int *pBase;
	int len;
	int cnt;
};

数据结构操作:

void init_arr(struct Arr *pArr, int length);		//首先进行的是初始化数组
int is_empty(struct Arr *pArr);					//判断数组是否为空 return 0 1 
int is_full(struct Arr *pArr);						//判断数据是否满 这样才能插入和删除数据  return 0 1 
int append_arr(struct Arr *pArr, int val);			//在数组中追加数据  return 0 1 
void show_arr(struct Arr *pArr);					//显示数据
int insert_arr(struct Arr *pArr,int pos,int val);	//在指定位置插入数据  pos从1开始  return 0 1 
int delete_arr(struct Arr *pArr, int pos,int* pVal);/*删除pos的数据 并将数据返回到pVal中 return 0 1 这里并不能使用return返回删除的值 如果删除元素为0 会引起误会*/
int get(struct Arr *pArr,int pos,int *pVal);		//获得指定位置的数值
void sort_arr(struct Arr *pArr);					//将数组中的元素按照从小到大的顺序排序
void inverse_arr(struct Arr *pArr);				//数组的反转

具体代码实现:

#include<stdio.h>//标准输入输出函数
#include<stdlib.h>  //使用 的是exit()函数
/*
*  Q:在这里可以挖掘  标准的输入输出函数是怎样实现的??
*/

#include<malloc.h>//系统级别的动态分配函数  

/*
*定义:连续存储 也就是系统分配一块连续的内存空间  习惯上称为数组
*特点: 1.数组元素相同 大小相等
*		2.具有连续的内存空间,且大小固定
*/

/*数据存储方式
*
*连续的内存空间  有一个指针 *pBase
*数组大小固定    有一个数组总大小 len
*				 有效元素的数量 cnt
*/

struct Arr {
	int *pBase;
	int len;
	int cnt;
};

//数据的操作
void init_arr(struct Arr *pArr, int length);		//首先进行的是初始化数组
int is_empty(struct Arr *pArr);					//判断数组是否为空 return 0 1 
int is_full(struct Arr *pArr);						//判断数据是否满 这样才能插入和删除数据  return 0 1 
int append_arr(struct Arr *pArr, int val);			//在数组中追加数据  return 0 1 
void show_arr(struct Arr *pArr);					//显示数据
int insert_arr(struct Arr *pArr,int pos,int val);	//在指定位置插入数据  pos从1开始  return 0 1 
int delete_arr(struct Arr *pArr, int pos,int* pVal);/*删除pos的数据 并将数据返回到pVal中 return 0 1 这里并不能使用return返回删除的值 如果删除元素为0 会引起误会*/
int get(struct Arr *pArr,int pos,int *pVal);		//获得指定位置的数值
void sort_arr(struct Arr *pArr);					//将数组中的元素按照从小到大的顺序排序
void inverse_arr(struct Arr *pArr);				//数组的反转
/*

*/

//主函数
int main() {
	struct Arr arr;
	int val = 0;
	init_arr(&arr, 6);
	append_arr(&arr, 0);
	append_arr(&arr, 1);
	append_arr(&arr, 2);
	append_arr(&arr, 3);
	append_arr(&arr, 4);
	show_arr(&arr);
	insert_arr(&arr, 1, 1);
	show_arr(&arr);
	delete_arr(&arr, 6, &val);
	show_arr(&arr);
	sort_arr(&arr);
	show_arr(&arr);
	inverse_arr(&arr);
	show_arr(&arr);
	return 0;
}

void init_arr(struct Arr *pArr, int length) {
	//初始化数组  分配地址和长度
	pArr->pBase = (int*)malloc(sizeof(int)*length);
	if (NULL == pArr->pBase) {
		exit(-1);
	}
	memset(pArr->pBase, 0, sizeof(int)*length);
	pArr->len = length;
	pArr->cnt = 0;

	return;//****写作习惯
}


int is_empty(struct Arr *pArr) {
	if (0 == pArr->len)
		return 1;
	else
		return 0;
}

int is_full(struct Arr *pArr) {
	if (pArr->cnt == pArr->len) {
		return 1;
	}
	else
	{
		return 0;
	}
}

int append_arr(struct Arr *pArr, int val) {
	if (is_full(pArr)) {
		printf("数组已满!\n");
		return 0;
	}

	pArr->pBase[pArr->cnt] = val;
	pArr->cnt++;
	return 1;
}

void show_arr(struct Arr *pArr) {
	if (is_empty(pArr)) {
		printf("数组为空\n");
		return;
	}
	else {
		for (int i = 0; i < pArr->cnt; i++) {
			printf("%d  ", pArr->pBase[i]);
		}
		printf("\n");
	}
	return 0;
}

int insert_arr(struct Arr *pArr, int pos, int val) {
	if (is_full(pArr)) {
		printf("数组已满!\n无法插入");
		return 0;
	}
	if (pos  < 1 || pos > pArr->len) {
		printf("插入位置不正确!\n");
		return 0;
	}
	for (int i = pArr->cnt-1; i >= pos - 1; i--) {
		pArr->pBase[i + 1] = pArr->pBase[i];
	}
	pArr->pBase[pos - 1] = val;
	pArr->cnt++;
	return 1;
}

int delete_arr(struct Arr *pArr, int pos, int* pVal) {
	if (is_empty(pArr)) {
		printf("数组为空!\n无法删除");
		return 0;
	}
	if (pos  < 1 || pos > pArr->cnt) {
		printf("删除位置不正确!\n");
		return 0;
	}

	*pVal = pArr->pBase[pos - 1];

	if (pos == pArr->len) {
		pArr->pBase[pos - 1] = 0;
	}
	else {

		for (int i = pos - 1; i <= pArr->cnt - 1; i++) {
			pArr->pBase[i] = pArr->pBase[i + 1];
		}
	}
	pArr->cnt--;
	return 1;
}

int get(struct Arr *pArr, int pos, int *pVal) {
	if (is_empty(pArr)) {
		printf("数组为空!\n");
		return 0;
	}
	if (pos  < 1 || pos > pArr->cnt) {
		printf("位置不正确!\n");
		return 0;
	}
	pVal = pArr->pBase[pos - 1];
	return 1;
}

void sort_arr(struct Arr *pArr) {
	int temp;

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

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

猜你喜欢

转载自blog.csdn.net/qq_34686440/article/details/79983092