一、什么叫數組
1、數組
元素類型相同,大小相等
// 數組寫法:
int a[10];
int *pArr = (int *)malloc(sizeof(int) * len);
2、確定一個數組,需要幾個參數?
3個:第一個元素的地址;數組的長度;有效元素的個數。
二、用數組實現一個類ArrayList(數組中常用操作的實現)
// Arr.c
#include <stdio.h>
#include <malloc.h> // 包含了malloc函數
#include <stdlib.h> // 包含了exit函數
#include <stdbool.h> // 包含了bool類型
struct Arr
{
int *pBase; // 存儲的是數組第一個元素的地址
int len; // 數組所能容納的最大元素的個數
int cnt; // 當前數組有效元素的個數
// int increment; // 自動增長因子(數組按照這個因子來擴充空間)
// allocate();動態內存的擴充
};
// 定義了一個數據類型,名字叫struct Arr,含有3個成員,分別是pBase、len和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); // 添加。pos的值從1開始
bool delete_arr(struct Arr *pArr, int pos, int *pVal); // 刪除
// 返回刪除成功與失敗;返回刪除的值
int get(); // 獲得某個下標處的值
bool is_empty(struct Arr *pArr);
bool is_full();
void sort_arr(); // 排序
void show_arr(struct Arr *pArr); // 顯示輸出
void inverse_arr(); // 倒置
int main()
{
struct Arr arr; // 定義了一個變量,則分配了內存
// 但因為只定義沒有進行初始化,因此pBase、len、cnt里面都保存的是垃圾數字
// 初始化可以讓變量的成員保存的不再是垃圾數字,而是有意義的值
int val = 0; // 用于接收刪除的值
init_arr(&arr, 6);
show_arr(&arr);
append_arr(&arr, 1);
append_arr(&arr, 2);
append_arr(&arr, 3);
append_arr(&arr, 4);
append_arr(&arr, 5);
// append_arr(&arr, 6);
// append_arr(&arr, 7); // 數組只可以插入6個,因此追加不進去了
show_arr(&arr);
insert_arr(&arr, 1, 99);
show_arr(&arr);
delete_arr(&arr, 1, &val);
return 0;
}
void init_arr(struct Arr *pArr, int length)
{
(*pArr).len = 99;
pArr->pBase = (int *)malloc(sizeof(int) * length); // pArr指針變量指向的結構體變量中的pBase成員
if(NULL == pArr->pBase) // malloc分配不成功時,會把NULL賦給pBase
{
printf("動態分配內存失敗!\n");
exit(-1); // 終止整個程序
}
else
{
pArr->len = length;
pArr->cnt = 0;
}
return;
}
void show_arr(struct Arr *pArr)
{
/* if(數組為空)
提示用戶數組為空
else
顯示數組有效內容 */
if(is_empty(pArr))
{
printf("數組為空!\n");
}
else
{
int i = 0;
for(i = 0; i < pArr->cnt; ++i)
{
printf("%d", pArr->pBase[i]);
}
}
}
bool is_empty(struct Arr *pArr)
{
if(0 == pArr->cnt)
{
return true;
}
else
{
return false;
}
}
bool is_full(struct Arr *pArr)
{
if(pArr->cnt == pArr->len)
return true;
else
return false;
}
bool append_arr(struct Arr *arr, int val)
{
if(is_full(pArr))
return false;
else
{
pArr->pBase[pArr->cnt] = val;
(pArr->cnt)++;
return true;
}
}
bool insert_arr(struct Arr *pArr, int pos, int val)
{
int i = 0;
if(is_full(pArr))
return false;
if(pos <1 || pos > pArr->cnt+1)
return false;
for(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)
{
int i = 0;
if(is_empty(pArr))
return false;
if(pos < 1 || pos>pArr->cnt)
return false;
*pVal = pArr->pBase[pos-1];
for(i = pos; i<pArr->cnt; i++)
{
pArr->pBase[i-1] = pArr->pBase[i];
}
}