c語言數組實現ArrayList部分函數

#include<stdio.h>
#include<malloc.h>		//包含malloc函數
#include<stdlib.h>		//包含exit函數


/*定義一個數據類型,該數據類型的名字叫做struct Array,該數據類型含有三個成員,分別是 pBase , len , cnt*/
struct Array {
	/*ArrayList實現的組成元素*/
	int* pBase;			//存儲數組第一個元素的地址
	int len;			//數組所能容納的最大的元素個數
	int cnt;			//當前數組的有效元素個數
	//int increment;	//增長因子
	/*
	增長因子存在的優缺點:
	優點:當數組儲存滿了之後,如果每增加一個元素就向操作系統申請一次的話,這樣很影響效率。
		  增長因子的作用就是在數組滿了之後,以一定的數值對內存進行擴充,減少了向操作系統進行申請的次數。
	缺點:額外消耗內存,可能申請之後部分內存沒用到。
	*/
};
/*ArrayList方法的實現*/
void init_Array(struct Array* parray , int length);		//初始化
bool append_Array(struct Array* parray , int var);		//追加元素,將var追加到數組裏面
bool insert_Array(struct Array* parray, int pos , int var);		//插入元素,pos的值從1開始
bool delete_Array(struct Array* parray, int pos, int* pvar);		//刪除元素,獲取並刪除第pos個元素
int get();				//獲取某個元素的地址
bool isEmpty(struct Array parray);			//判斷是否爲空
bool isFull(struct Array* parray);			//判斷是否滿
void sort_Array(struct Array * parray);		//排序
void show_Array(struct Array * parray);		//輸出
void inversion_Array(struct Array *parray);	//倒置

int main() {
	int var;
	struct Array array;	//定義變量,分配內存

	init_Array(&array , 6);		//分配內存之後,初始化變量,清楚地址中的垃圾值,指向有效數組
	append_Array(&array, 1);
	append_Array(&array, 2);
	append_Array(&array, 3);
	append_Array(&array, 4);
	show_Array(&array);
	inversion_Array(&array);
	show_Array(&array);
	if (delete_Array(&array,1, &var)) {
		printf("刪除成功,你刪除的元素是 %d\n", var);
	}
	else {
		printf("刪除失敗!\n");
	}
	/*append_Array(&array, 1);
	append_Array(&array, 2);
	append_Array(&array, 3);
	append_Array(&array, 4);
	append_Array(&array, 5);
	insert_Array(&array,7, 99);
	
	append_Array(&array, 6);
	//數據存滿,追加失敗
	append_Array(&array, 7);
	if (append_Array(&array, 7)) {
		printf("追加成功\n" );
	}
	else {
		printf("追加失敗!\n");
	}*/
	show_Array(&array);

	return 0;
}



void init_Array(struct Array* parray , int length) {
	//main函數調用此函數時,(&array)將array的首地址賦給(變量類型的struct Array*)parray,
	//此時*parray等價於array,可通過調用函數初始化修改array變量的值

	//(*parray).pBase
	parray->pBase = (int *)malloc(sizeof(int) * length);		//相當於指針變量parray指向結構體中的pBase成員
	if (parray->pBase == NULL) {
		printf("動態內存分配失敗!\n");
		exit(-1);		//終止整個程序,包含於頭文件stdlib.h
	}
	else {
		parray->len = length;
		parray->cnt = 0;
	}
	return;
}


bool isEmpty(struct Array* parray) {
	if (parray->cnt == 0)
		return true;
	else
		return false;
}


bool isFull(struct Array* parray) {
	if (parray->cnt == parray->len)
		return true;
	else
		return false;
}


void show_Array(struct Array * parray) {
	/*
	if(數組爲空)
		提示用戶數組爲空
	else
		對數組進行遍歷操作
	*/
	if (isEmpty(parray)) {	//parray本身就是一個struct Array*類型的變量,本身就是一個array的地址
		printf("數組爲空。\n");
	}
	else {
		for (int i = 0; i < parray->cnt; i++) {
			printf("%d\t", parray->pBase[i]);
		}
		printf("\n");
	}
}


bool append_Array(struct Array* parray , int var) {
	if (isFull(parray)) {
		return false;
	}
	else {
		//追加元素
		parray->pBase[parray->cnt] = var;
		(parray->cnt)++;
		return true;
	}

}


bool insert_Array(struct Array* parray, int pos, int var) {
	int i;
	if (isFull(parray)) {
		return false;
	}
	if (pos < 1 || pos > parray->cnt+1) {
		return false;
	}
	for (i = parray->cnt - 1; i < pos - 1; i ++ ) {
		parray->pBase[i + 1] = parray->pBase[i];	//將下標pos-1之後的全部元素往後移動,從末尾開始移動,防止覆蓋
	}
	parray->pBase[pos - 1] = var;					//移動完成之後,pos減一的位置空出,將數據存入
	(parray->cnt)++;
}


bool delete_Array(struct Array* parray, int pos, int* pvar){

	int i;

	if (isEmpty(parray)) {
		return false;
	}
	if (pos < 1 || pos > parray->cnt) {
		return false;
	}
	//先獲取要刪除的數據
	*pvar = parray->pBase[pos - 1];		//*pval 等價於main函數中的var
	for (i = pos  ; i < parray->cnt; i++) {
		parray->pBase[i - 1] = parray->pBase[i];	//將數據前移,往前覆蓋
	}
	(parray->cnt) --;
	return true;
}

void inversion_Array(struct Array *parray) {
	int i = 0;
	int j = parray->cnt - 1;
	int t;
	while (i < j) {
		t = parray->pBase[i];
		parray->pBase[i] = parray->pBase[j];
		parray->pBase[j] = t;
		i++;
		j--;
	}
	return;
}

void sort_Array(struct Array * parray) {

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章