#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) {
}
c語言數組實現ArrayList部分函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.