可變陣列
陣列在程式執行時,陣列的元素個數是無法被改變的,即無法在程式執行的同時也對陣列進行自動擴容,利用c語言的指標以及結構,可以初步實現這種功能
例如下列**
/*
可無限讀入整數,且不斷自行增長的函式
*/#include
#include
//#include
intconst block_size =20;
typedef
struct
array;
//定義一種結構型別(或者說變數型別),名稱為array,在後面可以利用這種型別進行定義結構變數,例如array a,表示定義了乙個變數a,型別為array
array array_create
(int init_size)
//返回乙個array,函式的引數是陣列的大小
/*返回型別是乙個array型別的本身,因為是本地變數,
不能返回函式中定義的指標(指標指向的變數在釋放後,再通過指標來找的時候就找不到了)(但是可以返回函式中定義的變數,因為通俗的說該變數在釋放前,已經被返回並在主函式中儲存了。)
當用陣列來儲存字串的時候,是放在棧中的,當函式執行完畢就釋放了.(所以返回後,這個函式釋放,在main函式中就取不到了)
*/void
array_free
(array *a)
//釋放a中的array
//封裝,保護內部的實現細節
intarray_size
(const array *a)
int*
array_at
(array *a,
int index)
//返回型別是指標,在此函式的內部,會有判斷所寫入的資料是否越界的條件
return
&(a-
>array[index]);
// a->array[index] 得到的是乙個int,不是指標
}void
array_inflate
(array *a,
int more_size)
//上述3行**段可以用 memcpy 函式進行替換
free
(a->array)
; a-
>array = p;
a->size +
= more_size;
//使其長大
}int
array_get
(const array *a,
int index)
void
array_set
(array *a,
int index,
int value)
//get和set兩個函式可以替換下方的*array_at(&a, 0) = 0;
intmain
(int argc,
char
const
*ar**)
array_free
(&a)
;return0;
}
上述方法,需要不斷地申請空間,再釋放空間,但是申請的空間是一片連續的位址,當某一時刻資料量過大,記憶體中即使存在足夠使用的容量,也會無法繼續申請了
總有乙個時刻,會發現,沒有辦法再繼續申請新的記憶體空間了
鍊錶(linked-list)類似的如下,將記憶體中分散的資料連線起來,形成一條鏈式結構,叫做鍊錶
在實際操作中,鍊錶實際用結構來實現
//可後期自行定義node
#endif
建立乙個節點元素並形成鍊錶的程式
#include
#include
#ifndef __node_h
#define __node_h
typedef
struct _node node;
//可後期自行定義node
#endif
intmain()
}else}}
while
( number !=-1
);return0;
}
鍊錶 初識鍊錶
鍊錶 前言 小弟初學資料結構,有錯誤的地方望大家不吝賜教 認識鍊錶 列表相比陣列更具有優勢,鍊錶不同於資料和其他資料結構依靠位置來進行訪問或者其他操作,如陣列是依靠下表來運算元據。而鍊錶是通過關係來尋找或者運算元據。鍊錶的特性 插入 和 刪除 效率高,只需要變更指向的鏈結點即可。但是隨即訪問操作的效...
鍊錶的建立和刪除,初識鍊錶
include include include typedef struct date 申明結構體 date int main void else pe next ps 把新結點連線到鏈尾 第一次不執行,而到第二次pe就是上一次的ps 而pe next讓其指向下一次的ps pe ps 新結點成為了新...
學習筆記 鍊錶 鍊錶入門
重新學習程式語言日記,2011年12月29日 09 17分 定義乙個結構體 struct linkhead,p1,p2 首先定義了乙個結構體,結構體包括指標域,資料域。這個結構體就是你鍊錶裡面的節點。每個節點都包括了資料域,指標域。有了這麼乙個結構體。肯定就需要初始化這個結構體了。寫個函式來初始化鍊...