今天學習了中國大學mooc上翁愷老師《C語言程式設計》的第14課鏈表,在學習鏈表之前,老師講解了普通的可變陣列的實作,
前奏:可變陣列的實作(有缺陷)
首先定義一個結構體,內部存在一個指標和存放大小的變數
typedef struct{ int *array; int size; }Array;
其次明確目標,對陣列所需的操作有:創建 丶清除(釋放記憶體) 丶顯示大小 丶訪問和賦值 丶擴大這幾個功能
函式申明如下:
#define BLOCK 20
Array array_create(int init_size);
void array_free(Array *a);
int array_size(const Array *a);
int *array_at(Array *a,int index);
void array_inflate(Array *a,int more_size);
1.創建
Array array_create(int init_size)
{
Array a;
a.size = init_size;
a.array = (int*)malloc(sizeof(int)*a.size);//開辟一塊新的空間
return a;
}
2.清除
這一部分比較簡單
void array_free(Array *a)
{
free(a->array);
a->array = NULL;
a->size = 0;
}
3.顯示大小
int array_size(const Array *a){
return a->size;
}
4.訪問和賦值
int *array_at(Array *a,int index)
{
if(a->size<=index)
array_inflate(a,(index/BLOCK+1)*BLOCK-a->size);
return &(a->array[index]);
}//回傳指標是為了 能對值加以修改
思考一下,為什么采用回傳指標呢?回傳int不是更香嘛?
事實上,我們不僅要訪問,還要對值進行修改,只有取得變數的地址才能進行操作,
例如:*array_at(&a,1000) = 101;
5.陣列的擴大(核心)
這是區別去其他陣列的地方
事實上malloc申請的記憶體是不可變的,于是我們智能通過申請一塊新的記憶體對原先的進行覆寫,
void array_inflate(Array *a,int more_size)//放大原理,制造一片新的空間
{
int* p = (int*)malloc(sizeof(int)*(more_size+a->size));
int i;
for(i=0;i<a->size;i++)
p[i] = a->array[i];
free(a->array);
a->array = p;
a->size+=more_size;
}
在這里定義了一個BLOCK 恒為20.
學習程序中,發現自己忘記了.和->的區別,多次編譯出錯.經過百度后知道:
結構體用點,結構體指標用箭頭,(*p).member等價于p->member
注意:這樣的可變陣列是有缺陷的:1.當數目較大時,每次開辟記憶體所占空間較大 2.當記憶體有限制時,可能無法申請到記憶體

需要用鏈表,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/22012.html
標籤:java
上一篇:iOS 支付寶SDK跳轉的坑
下一篇:演算法——中國剩余定理
