Data structure sequential storage

Use dynamic memory allocation to realize some basic functions such as adding, deleting, modifying, and checking arrays

/*
 *@Author Mr Zhao 
 *@Date: 2021-1
 */ 
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>

//定义了一个名字为struct Arr的数据类型,有三个成员 
struct Arr {
    
    
	int * pBase;	//存储的是数组第一个元素的地址
	int len;	//数组所能容纳的元素个数
	int cnt;	//当前数组有效元素的个数
};

void init_arr(struct Arr * pArr, int length);	//初始化 
bool append_arr(struct Arr * pArr, int val);	//末尾追加
bool insert_arr(struct Arr * pArr, int pos, int val);   //插入元素
bool delete_arr(struct Arr * pArr, int pos, int * pVal);    //删除元素
bool search1_arr(struct Arr * pArr, int val);	//按数查找
bool search2_arr(struct Arr * pArr, int pos);	//按位查找 
bool is_empty(struct Arr * pArr);   //是否为空
bool is_full(struct Arr * pArr);    //是否已满
void sort_arr(struct Arr * pArr);   //冒泡排序
void inversion_arr(struct Arr * pArr);	//倒置
void clear_arr(struct Arr * pArr);  //清空
void show_arr(struct Arr * pArr);   //遍历输出

int main(void) {
    
    
	struct Arr arr;
	//传入地址效率更高,四个字节() 
	int val;
	init_arr(&arr, 6);
	
	append_arr(&arr, 4);
	append_arr(&arr, 5);
	append_arr(&arr, 10);
 	inversion_arr(&arr);
 	sort_arr(&arr);
 	search1_arr(&arr, 10);
	show_arr(&arr);
	search2_arr(&arr, 2);
	clear_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) {
    
    
		printf("动态内存分配失败!\n");
		exit(-1);	//终止整个程序 
	} else {
    
    
		pArr->len = length;	//初始化 
		pArr->cnt = 0;	//初始化 
	//	printf("内存分配成功!\n");
	}
	return;
}
/*检验数组是否为空*/
bool is_empty(struct Arr * pArr) {
    
    
	if(0 == pArr->cnt) {
    
    
		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("%d\t", pArr->pBase[i]);
			printf("\n");
		}
	}
}
/*检验数组空间是否满了*/ 
bool is_full(struct Arr * pArr) {
    
    
	if(pArr->cnt == pArr->len) {
    
    
		return true;
	} else {
    
    
		return false;
	}
}
/*实现追加功能*/ 
bool append_arr(struct Arr * pArr, int val) {
    
    
	//满时返回false 
	if(is_full(pArr)) {
    
    
		return false;
	} 
	// 不满时追加 
	pArr->pBase[pArr->cnt] = val;	//cnt就是新放入元素的下标,每放一个元素cnt++,
	(pArr->cnt)++;							// cnt表当前有效元素个数 
	return true;
}
/*实现插入功能*/ 
bool insert_arr(struct Arr * pArr, int pos, int val) {
    
    
	if(is_full(pArr)) {
    
    
		return false;
	}
	if(pos < 1 || pos > pArr->cnt + 1) {
    
    
		return false;
	}
	//插入数后面所有数后移一位 
	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 true; 
}
/*实现删除数组元素功能*/ 
bool delete_arr(struct Arr * pArr, int pos, int * pVal) {
    
    
	if(is_empty(pArr)) {
    
    
		return false;
	}
	if(pos < 1 || pos > pArr->cnt) {
    
    
		return false;
	}
	*pVal = pArr->pBase[pos - 1];
	for(int i = pos; i < pArr->cnt; i++) {
    
    
		pArr->pBase[i - 1] = pArr->pBase[i];
	}
	pArr->cnt--;
	return true;
}
/*实现数组按数查找功能,此处运用顺序查找法*/ 
bool search1_arr(struct Arr * pArr, int val) {
    
    
	bool isFlag = true;
	for(int i = 0; i < pArr->cnt; i++) {
    
    
		if(val == pArr->pBase[i]) {
    
    
			isFlag = false;
			printf("找到了!%d位于数组第%d位!\n", val, i + 1);
			break;
		}
	}
	if(isFlag) {
    
    
		printf("您要查找的数据不存在!\n"); 
	}
}
/*实现数组按位查找*/
bool search2_arr(struct Arr * pArr, int pos) {
    
    
 int val;
 
 if(pos < 1 || pos > pArr->cnt - 1) {
    
    
 	printf("输入位置错误,程序退出!\n");
 	exit(-1);
 }
 
 val = pArr->pBase[pos - 1];
 printf("查找成功,第%d位的数据是%d。", pos, val);
 return  true;
} 
/*实现数组倒置*/ 
void inversion_arr(struct Arr * pArr) {
    
    
	int i = 0;
	int j = pArr->cnt - 1;
	int t;
	while(i < j) {
    
    
		t = pArr->pBase[i];
		pArr->pBase[i] = pArr->pBase[j];
		pArr->pBase[j] = t;
		i++;
		j--;
	}
}
/*实现数组排序,此处使用冒泡排序法*/ 
void sort_arr(struct Arr * pArr) {
    
    
	int t;
	for(int i = 0; i < pArr->cnt - 1;i++) {
    
    
		for(int j = 0; j < pArr->cnt - i - 1; j++) {
    
    
			if(pArr->pBase[j] > pArr->pBase[j + 1]) {
    
    
				t = pArr->pBase[j];
				pArr->pBase[j] = pArr->pBase[j + 1];
				pArr->pBase[j + 1] = t;
			}	
		}
	}
}

//调用menset函数清空结构体
void clear_arr(struct Arr * pArr) {
    
    

	memset(pArr, 0, sizeof pArr); //调用menset函数清空结构体
	printf("清空成功!\n");

}

Guess you like

Origin blog.csdn.net/qq_53703628/article/details/115371397