由於儲存單元是一維的結構,而陣列是個多維的結構,則用一組連續的儲存單元存放資料元素就有次序約定的問題了。
假設現在有乙個三維陣列a[5][6][7],現在初始化其資料結構時,不難聯想到,首先要說明存放的資料型別(也可以是陣列元素的基址,但元素的型別是一定要說明的),其次,就是陣列的維數,還有就是每一維的大小。現在繼續考慮,假設現在這個陣列已經被我們定義成了這個結構,當我們想要取出元素a[3][2][1],由於儲存單元是連續的順序儲存結構,必須要算出其相對於a[0][0][0]的位址,不難算出其結果:a[3][2][1]=3*(6*7)+2*7+2(其各維的索引下標都是從0開始的)。我們可以總結對任意的n維陣列,設每一維的大小為bi,其元素的儲存位置如下:
locate(j1,j2,....,jn)=locate(0,0,....,0)+[(j1*bn*bn-1*....*b2)+(j2*bn*bn-1*....*b3)+....+(jn-1*bn)+(jn)]
於是為了對陣列元素定位的方便,在其資料結構中新增一項陣列映像函式,其實質就是計算每乙個單獨維其向下所含有的元素的個數(bn*bn-1*...*bi+1 :如本例中的a,其映像函式的值分別為7*6和7)。
綜上其結構如下:
typedef struct array;va_list 是在c語言中解決變參問題的一組巨集,所在標頭檔案:#include ,用於獲取不確定個數的引數
用法(1)首先在函式裡定義一具va_list型的變數,這個變數是指向引數的指標;
(2)然後用va_start巨集初始化剛定義的va_list變數;
(3)然後用va_arg返回可變的引數,va_arg的第二個引數是你要返回的引數的型別(如果函式有多個可變引數的,依次呼叫va_arg獲取各個引數);
(4)最後用va_end巨集結束可變引數的獲取。
巨集:va_start巨集:
#define va_start(ap,v) ( ap = (va_list)&v + _intsizeof(v) )
va_arg巨集:獲取可變引數的當前引數,返回指定型別並將指標指向下一引數(t引數描述了當前引數的型別):
#define va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )
va_end巨集:清空va_list可變引數列表:
#define va_end(ap) ( ap = (va_list)0 )
測試如下:
#include#includevoid vltest(int i, float k, ...) //...代表可變引數結果如圖:void main()
由上分析可以開始陣列初始化工作了
//陣列的初始化陣列的初始化完成之後,其他的工作就很簡單了。int init_array(array &a,int dim,...)
陣列的賦值與取值案例如下:
#include#include#include//標準標頭檔案,提供巨集va_start、va_arg和va_end,用於儲存變長的參數列截圖如下:#define elemtype int
#define max_array_dim 8 //定義陣列的最大維數為8
typedef struct array;
//陣列的初始化
int init_array(array &a,int dim,...)
int locate(array a,va_list ap,int *off)
return 1;
}int assign_value(array &a,elemtype e,...)
int get_value(array a,elemtype *e,...)
void main()
資料結構 棧 陣列的實現
首先是定義棧的基本結構,因為用陣列實現 private string stack private int top 0 然後是構造方法 stackofstrings int capacity 然後是push,注意,top永遠指向的是壓入元素的後一位。public void push string st...
資料結構 佇列 陣列的實現
首先定義佇列的基本結構,佇列和棧不同之處在於佇列需要兩個指標,乙個指向頭,乙個指向尾 string queue int front 0 int rear 0 構造方法 public queueofstrings int capacity 進佇列public void enqueue string s...
資料結構 棧的陣列實現
棧是一種先入後出的資料結構,在計算機表示式求值時是一種常用的資料結構。具體提出 在解決需要判斷將來問題才來作出判斷時,常需要將當前的資料儲存,而棧就是一種這樣的資料結構,需要儲存當前資料時,先壓入堆疊,使用時再彈出。堆疊也可以認為是具有一定約束的線性表,其插入與刪除都作用在同乙個位置 棧頂 一 對於...