日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线性结构 -- 连续存储(数组), 1个简单的c语言代码实现.

發(fā)布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性结构 -- 连续存储(数组), 1个简单的c语言代码实现. 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

數(shù)據(jù)結(jié)構(gòu)大體成上可以分成兩種:

1. 線性結(jié)構(gòu).
2. 非線性結(jié)構(gòu)( 樹,圖)

1. 什么是線性結(jié)構(gòu)
?????? 大概上可以這樣定義: 加入所有的節(jié)點(diǎn)可以用一條直線連接起來. 就是線性結(jié)構(gòu)...


2. 線性機(jī)構(gòu)也可以分成兩種:
?????? 1) 連續(xù)存儲 (數(shù)組)
???????????? 也就是指每1個節(jié)點(diǎn)在物理內(nèi)存上是相連的.

?????? 2) 離散存儲(鏈表)
????????????? 節(jié)點(diǎn)在物理內(nèi)存上并不一定相連, 而是利用指針來關(guān)聯(lián).

?????? 這篇文章主要講的第一種.


3. 什么是數(shù)組
????? 數(shù)組就是在內(nèi)存里物理連續(xù)的一段元素的集合
???????? 注意: 數(shù)組里面的元素不一定是數(shù). 可以是任何類型, 但是每個元素的類型和大小必須相等.

???????? 而且這里的數(shù)組并不是指C語言里的數(shù)組類型, 而是數(shù)據(jù)結(jié)構(gòu)的一種.
???????? 通常在c語言會利用結(jié)構(gòu)(struct) 來實現(xiàn)



4. 數(shù)組的一些關(guān)鍵屬性.
???????
其實這些屬性一般都可以在java / .net 等高級語言里的容器里見到.
???????? c語言里常用的有以下幾個
????????? 1. 當(dāng)前數(shù)組的最大元素個數(shù)
????????? 2. 當(dāng)前數(shù)組的元素個數(shù)

????????? 3. 數(shù)組第1個元素的地址
????????? 4. 自動增長因子 5. 這個結(jié)構(gòu)體是否被初始化, 也就是說該結(jié)構(gòu)體里面的指針地址數(shù)組是否被分配內(nèi)存.

?????????? 前面3個都很容易理解. 關(guān)鍵第4個... 其實也不是必要的.
?????????? 我們定義1個動態(tài)的數(shù)組肯定會利用malloc函數(shù)來動態(tài)分配內(nèi)存.

?????????? 假如我們動態(tài)分配了1個長度為10的數(shù)組a[10], 而且10個元素都占用了

??????????? 加入我們又要往里面加1個數(shù)組, 這樣數(shù)組長度不夠, 就用利用realloc函數(shù)動態(tài)擴(kuò)充..
??????????? 而在內(nèi)存里擴(kuò)充1個連續(xù)的空間其實比較耗費(fèi)時間成本(萬一后面連續(xù)的空間被占用, 就要另外找1塊連續(xù)空間.把原空間數(shù)據(jù)拷到新連續(xù)空間)
?????????? 所以要避免增加1個元素就擴(kuò)充1個內(nèi)存, 所以我們一般定義1個自動增長因子. 例如10, 也就是每次擴(kuò)充內(nèi)存時就擴(kuò)充10個元素的長度, 那么下次增加元素就時就不用再執(zhí)行擴(kuò)充動作.

?????????? 這種優(yōu)點(diǎn)就避免大量擴(kuò)充內(nèi)存所占用的時間成本,? 缺點(diǎn)就必須占用一定量的空間成本
???????????? 關(guān)于第5點(diǎn)就十分重要了,? 它用于判斷該結(jié)構(gòu)體是否被初始化, 因為定義1個結(jié)構(gòu)體時, 結(jié)構(gòu)體里面的成員都是垃圾數(shù)據(jù), 如果忘了進(jìn)行初始化而執(zhí)行其他函數(shù)時, 很可能發(fā)生各種后果, 所以定義1個成員專門來判斷是否被初始化. 關(guān)于初始化下面會再詳細(xì)解析一次.


5. 數(shù)組在c語言里的簡單實現(xiàn) (只是int 整形的數(shù)組)
?????????
下面我們會利用c語言來實現(xiàn)1個容器類型, 類似java 或 .net 的arraylist
??????????? 其實很多.net 程序員對arraylist 肯定很熟悉,? 實際上它的底層就是利用線性存儲來實現(xiàn)的.
???????????? 對應(yīng)地. 另1種容器 linkedlist, 就是用鏈表來實現(xiàn)的啊.

??????????? 5.1 定義1個數(shù)組復(fù)合類型
???????? 我們知道要在c語言里定義1個復(fù)合類型是通過結(jié)構(gòu)體實現(xiàn)的.
??????? 代碼如下:
?

arrlist.h

1 struct Arrlist{ 2 int * paddr; 3 int len; 4 int cur_len; 5 int increment; 6 BOOL is_inited; 7 };

?

?

??????
? ? ? ? 見上面的代碼, 頂定義了1個 叫Arrlist的結(jié)構(gòu)類型. 里面5個成員上面都解析過啦.
???????? 注意這段代碼只是定義了1個類型, 并沒初始化1個變量, 系統(tǒng)是不會為這段代碼分配內(nèi)存的.
???????? 而且我們寫這個容器, 肯定是為了給其他人其他文件用的,? 所以要吧結(jié)構(gòu)體定義放在頭文件內(nèi). 別的文件只需要引用這個頭文件引用這個頭文件就可以使用這個頭文件內(nèi)定義的結(jié)構(gòu)體和函數(shù)了.

???????? 當(dāng)然, 我在標(biāo)題講過了, 我要實現(xiàn)的只是1個int類型的數(shù)組, 如果取消這個限制, 在上面加多1個成員, 就用來判斷這個數(shù)組的類型.???? 以后的函數(shù)操作時先檢測一下這個類型, 然后區(qū)分操作.

??????

????????? 5.2 聲明一些數(shù)據(jù)操作函數(shù).
??????????
只有1個結(jié)構(gòu)體遠(yuǎn)遠(yuǎn)不夠, 就如java / .net 中的類 arraylist 那樣, 還需要很多的操作函數(shù),? 例如1個最重要的初始化1個容器, 嗨喲為這個容器添加數(shù)據(jù)/ 刪除數(shù)據(jù)等, 都需要一些函數(shù)來實現(xiàn).

?????????? 在面向?qū)ο笳Z言中, 這些函數(shù)就是這個類的成員了,? 而在c語言中, 我們會在頭文件中聲明這些函數(shù), 注意是聲明. 而不是定義, 函數(shù)定義還是要在同名的c 文件中,? 這樣其他文件引用頭文件就能使用容器及其對應(yīng)的一些函數(shù)了.

??????????? 代碼如下:
arrlist.h 1 #include "bool_me.h" 2 #ifndef __ARRLIST_H_ 3 #define __ARRLIST_H_ 4 5 struct Arrlist{ 6 int * paddr; 7 int len; 8 int cur_len; 9 int increment; 10 BOOL is_inited; 11 }; 12 13 void Arr_init(struct Arrlist * pArr, int length); //inital an arraylist 14 BOOL Arr_add(struct Arrlist * pArr, int val); // add an element to the end of array 15 BOOL Arr_insert(struct Arrlist * pArr, int position, int val); // insert an element to any place 16 BOOL Arr_delete(struct Arrlist * pArr, int index); // delete an element 17 int Arr_get(struct Arrlist * pArr, int index); //get the index of an element by value 18 BOOL Arr_set(struct Arrlist * pArr, int index, int val); //set the value to specified element in the array 19 BOOL Arr_is_empty(struct Arrlist * pArr); 20 BOOL Arr_is_full(struct Arrlist * pArr); 21 void Arr_invert(struct Arrlist * pArr); //invert the array 22 void Arr_sort(struct Arrlist * pArr); 23 void Arr_show(struct Arrlist * pArr); 24 25 #endif

?

???????????? 當(dāng)然這段代碼只是打算實現(xiàn)一些最基本的功能,
???????????? 所以聲明了幾個最基本的函數(shù),? 當(dāng)然上面說過了, 在頭文件內(nèi)只是聲明. 下面就介紹這些函數(shù)如何具體定義了. 還有可見到我使用了BOOL 類型, 其實這只是1個宏, 宏代碼如下, 如果要使用真正的bool類型, 可以引用 stdbool.h文件,? 不過不是所有機(jī)器都有... 我所在公司的服務(wù)器solaris 10就么有, 就只好使用宏了. bool_me.h 1 #ifndef __BOOL_ME_H_ 2 #define __BOOL_ME_H_ 3 4 #ifndef BOOL 5 #define BOOL char 6 #endif 7 8 #ifndef TRUE 9 #define TRUE '1' 10 #endif 11 12 #ifndef FALSE 13 #define FALSE '0' 14 #endif 15 16 #endif

????? 5.3 錯誤處理函數(shù) Arr_error(char * pstr);

????? 雖然只是1個簡單的代碼實現(xiàn), 但我也稍稍寫的完善一點(diǎn):

????? 這個函數(shù)專門用來打印錯誤信息并退出程序的

? arrlist.c?? //注意以下函數(shù)的定義代碼都是寫在.c 文件了.

1 static Arr_error(char * pstr){ 2 while (*pstr != '\0'){ 3 printf("%c",*pstr); 4 pstr++; 5 } 6 7 printf("\n"); 8 exit (-1) 9 }

注意兩點(diǎn):

1.? 參數(shù)是1個字符串的頭部指針,? 實際實參是"abcewew" 這種形式傳遞的.

2.? 我不希望這個函數(shù)被其他文件直接調(diào)用, 所以用了static 前序.

5.4初始化函數(shù) Arr_int(struct Arrlist * pArr, int length);
????
首先說明一下為什么要有這個1個初始化函數(shù).
???? 當(dāng)我們定義1個 struct Arrlist時
????? struct Arrlist arr1;
????? 不就己經(jīng)給變量arr1 分配1塊內(nèi)存了嗎?
??????
?????? 的確, 上面說的沒錯, 但是雖然給這個結(jié)構(gòu)體分配了內(nèi)存, 但是內(nèi)存里它的4個成員因為沒有賦值,所以里面的都是一些垃圾數(shù)據(jù), 關(guān)鍵的是第1個成員addr 可能隨機(jī)指向1個地址.

? ? ? ? 所以初始化時我們就要完成下面動作:
???????? 1.設(shè)定結(jié)構(gòu)體成員的初始值.(第1個成員地址除外)
???????? 2. 在內(nèi)存里劃分1份內(nèi)存空間.
???????? 3. 讓結(jié)構(gòu)體的第1個地址成員指向這個內(nèi)存空間的頭部地址.
???????? 4. 設(shè)置其他成員的值.

????????
代碼如下:

?

1 void Arr_init(struct Arrlist * pArr, int length){ 2 pArr->paddr = (int *)malloc(sizeof(int) * length); 3 4 if (NULL == pArr->paddr){ 5 Arr_error("fail to assign memory!!"); 6 } 7 8 pArr->len = length; 9 pArr->cur_len = 0; 10 pArr->increment = 10; 11 12 pArr->is_inited = TRUE; 13 14 return; 15 }

?

?

?

解析一下上面為什么要加1個NULL判斷呢, 就是因為一塊連續(xù)的內(nèi)存有可能劃分失敗(沒有足夠大的連續(xù)內(nèi)存空間), 萬一失敗, malloc 函數(shù)會返回1個空指針,? 以后的操作都無意義了.?????? 所以判斷分配失敗后直接 exit(-1) 退出整個程序.??

?? ?????? ????????? ? ? ?

5.5 判斷數(shù)組是否為空(0個元素)? Arr_is_empty(struct Arrlist * pArr)???? 1 BOOL Arr_is_empty(struct Arrlist * pArr){ 2 if (TRUE != pArr->is_inited){ 3 Arr_error("Array is not inited yet!!"); 4 } 5 6 if (0 == pArr->cur_len){ 7 return TRUE; 8 } 9 return FALSE; 10 }

?

5.6 判斷數(shù)組是否為滿(len = cur_len)? Arr_is_full(struct Arrlist * pArr) 這個函數(shù)跟上面那個基本寫一樣: 1 BOOL Arr_is_full(struct Arrlist * pArr){ 2 if (TRUE != pArr->is_inited){ 3 Arr_error("Array is not inited yet!!"); 4 } 5 6 if (pArr->len == pArr->cur_len){ 7 return TRUE; 8 } 9 return FALSE; 10 }

?

?5.7 打印元素函數(shù)? Arr_show(struct Arrlist * pArr)

只所以把這個函數(shù)放在Arr_is_empty() 下是因為Arr_show開始最好判斷一下元素個數(shù), 如果是空函數(shù)就不要做任何動作了. 代碼如下: 1 void Arr_show(struct Arrlist * pArr){ 2 if (TRUE != pArr->is_inited){ 3 Arr_error("Array is not inited yet!!"); 4 } 5 6 if (TRUE == Arr_is_empty(pArr)){ 7 printf("It's an empty Arrlist\n"); 8 return; 9 } 10 11 int i; 12 for (i=0; i < (pArr->cur_len - 1); i++){ 13 printf("%d, ", pArr->paddr[i]); 14 } 15 16 printf("%d\n", pArr->paddr[pArr->cur_len -1]); 17 return; 18 }

?

5.8 添加元素到數(shù)組尾部函數(shù) ? Arr_add(struct Arrlist * pArr, int val) 好了, 這是一個相當(dāng)重要的函數(shù), 也是最常被執(zhí)行的. 我們寫1這個函數(shù)時應(yīng)該有1個思路, 就是執(zhí)行這個函數(shù)時, 這個結(jié)構(gòu)體內(nèi)部到底需要做什么事情.1. 首先判斷pArr 指向的數(shù)組是否滿了(cur_len = len) 2. 如果滿了, 擴(kuò)充(擴(kuò)充個數(shù)取決于成員 increment, 同時len+=increment) 3. 如果擴(kuò)充失敗, 則返回false 內(nèi)存里面沒有足夠大的連續(xù)空間了 4. 如果未滿或擴(kuò)充成功了, 則添加1個元素到pArr 指向的數(shù)組尾部 5. cur_len+=1代碼如下: BOOL Arr_add(struct Arrlist * pArr, int val){if (TRUE != pArr->is_inited){Arr_error("Array is not inited yet!!");}if (TRUE == Arr_is_full(pArr)){if (FALSE == Arr_extend(pArr, pArr->increment)){ return FALSE;}}pArr->paddr[pArr->cur_len] = val; // assign the valuepArr->cur_len++; return TRUE; }

?

?其中第2段用到了判斷是否是滿的函數(shù), 如果數(shù)組滿了, 則執(zhí)行擴(kuò)充, 然后就添加元素到數(shù)組的尾部? 擴(kuò)充函數(shù)是Arr_extend. 下面會講到

?

5.9 數(shù)組擴(kuò)容函數(shù) ? Arr_extend(struct Arrlist * pArr)

一旦數(shù)組的元素占滿了數(shù)組的長度, 如果再添加元素. 就有必要進(jìn)行擴(kuò)容了.

所謂擴(kuò)容就是重新為數(shù)組分配1個更長的連續(xù)內(nèi)存空間.

實現(xiàn)的函數(shù)就是realloc函數(shù).

假如,之前數(shù)組初始化前利用malloc函數(shù)動態(tài)分配了40個字節(jié)的連續(xù)內(nèi)存空間,? 那么執(zhí)行realloc函數(shù)時, 則會判斷原來的空間的后面一塊內(nèi)存空間,是否被占用, 如果未被其他程序占用, 則把這塊空間也劃分給數(shù)組, 數(shù)組的頭部地址不變.? 如果被占用了, 則會在內(nèi)存了另外找1個塊更大的連續(xù)內(nèi)存空間. 并把原來內(nèi)存里的數(shù)據(jù)Copy過去, 但是數(shù)組的地址就變化了(時要把原來的空間釋放)

這個函數(shù)要做的事情.

1.為pArr->paddr 分配1個更長的連續(xù)內(nèi)存空間.

2.? 如果pArr->paddr 當(dāng)前地址后面的內(nèi)存沒有被占用, 這樣的話pArr->paddr地址不會變.

3.? 如果當(dāng)前地址后面的內(nèi)存已經(jīng)被占用, 就只能到內(nèi)存的另1個地方找1個更大的連續(xù)內(nèi)存空間,? 這樣地址就變了, 但是無需手動釋放舊的內(nèi)存, realloc會自動釋放!

4. 如果內(nèi)存實在沒有足夠大的連續(xù)空間,? realloc函數(shù)會返回1個空指針,? 我們要把pArr->paddr 返回原來的地址,? 就認(rèn)為擴(kuò)容失敗

5. pArr->len 長度增加.

?

代碼:

static BOOL Arr_extend(ARRINT * pArr, int increment){int * pold = pArr->paddr;pArr->paddr = (int *)realloc(pArr->paddr, sizeof(int) * (pArr->cur_len + increment));if (NULL == pArr->paddr){pArr->paddr = pold;return FALSE;}// realloc will auto free the old memory, it's not allow to free it again!!!! // if (pold != pArr->paddr){ // free(pold); // }pArr->len += increment;return TRUE; }


?

見到我用了static 前序, 是因為i我只希望這個函數(shù)被數(shù)組的內(nèi)部函數(shù)使用, 并不希望它被其他的文件直接調(diào)用.

?

5.10 賦值指定元素函數(shù) ? Arr_set(struct Arrlist * pArr, int index, int val)

也許有人問, 直接用pArr->paddr[index] = val 不就可以了嗎? 為何要專門寫1個函數(shù).

實際上, 上面的寫法有可能被通過編譯. 但是十分不安全,? 因為數(shù)組的長度是有限的,? 如果index的值大于等于數(shù)組的長度就很有可能造成內(nèi)存泄露了.

所以實在上我們要在賦值前判斷一下要賦值的index 和 數(shù)據(jù)實際長度 cur_len的關(guān)系.

1. 判斷index 是否超出當(dāng)前數(shù)組的實際長度cur_len, 如果是, 則告訴用戶, 數(shù)組內(nèi)還沒這個元素呢, 返回false

2. 設(shè)置對應(yīng)元素的值, 并返回true.

?

1 BOOL Arr_set(struct Arrlist * pArr, int index, int val){ 2 if (TRUE != pArr->is_inited){ 3 Arr_error("Array is not inited yet!!"); 4 } 5 6 if((index < 0) || (index >= pArr->cur_len)){ 7 printf("the element is not existed yet\n"); 8 return FALSE; 9 } 10 11 pArr->paddr[index] = val; 12 return TRUE; 13 }

?

?

?

5.11 取指定元素函數(shù) ? Arr_get(struct Arrlist * pArr, int index)

同樣要判斷index 和 cur_len的關(guān)系, 如果index >= cur_len, 要么就退出整個程序拋出error, 但我這里返回1個0算了.

?

1 int Arr_get(struct Arrlist * pArr, int index){ 2 if (TRUE != pArr->is_inited){ 3 Arr_error("Array is not inited yet!!"); 4 } 5 6 if((index < 0) || (index >= pArr->cur_len)){ 7 printf("the element is not existed yet\n"); 8 return 0; 9 } 10 11 return pArr->paddr[index]; 12 }

?

?

?

?

?

5.12 插入1元素到指定位置函數(shù) ? Arr_insert(struct Arrlist * pArr, int position, int val)

首先要理解insert 和 set的區(qū)別,? 上面的Arr_set所賦值的元素必須是數(shù)組已經(jīng)存在的, 并且該元素的值將會變化.

而insert 則不一樣, 似乎插入1個新的元素到數(shù)組到position元素的前1個位置,該新元素后面的其他元素的值不變化, 但是位置可能會被退后1位.

所以Insert動作后, cur_len的值會加1, 因為多了1個元素嘛, 既然cur_len會增加, 就要判斷當(dāng)前數(shù)組是否滿了, 而且可能要用到擴(kuò)容.

1.判斷position是否在cur_len的范圍之內(nèi), 如果否就提醒用戶, 讓他用Arr_add吧. 返回false

2.判斷數(shù)組是否滿了, 是則擴(kuò)容

3.position和到后面所有元素,從最后1個元素開始, 復(fù)制到后1個位置.

4. 把要插入的值寫入到index的位置上.

5. cur_len +1

?

代碼如下:

?

BOOL Arr_insert(struct Arrlist * pArr, int position, int val){if (TRUE != pArr->is_inited){Arr_error("Array is not inited yet!!");}if((position < 0) || (position >= pArr->cur_len)){printf("the position is over the length of array, please use Arr_add instead\n");return FALSE;}if(TRUE == Arr_is_full(pArr)){if (FALSE == Arr_extend(pArr, pArr->increment)){ return FALSE;}}int i;for (i=(pArr->cur_len -1); i>= position; i--){pArr->paddr[i+1] = pArr->paddr[i];}pArr->paddr[position] = val;pArr->cur_len++;return TRUE;}

?


5.13 刪除1個指定位置的元素函數(shù)? Arr_delete(struct Arrlist * pArr, int index)

這個函數(shù)跟上面那個邏輯是對應(yīng)關(guān)系,?

1, 判斷index 是否在cur_len的范圍內(nèi), 否則返回false

2, 從index 位置開始,?? 到最后1個位置的前1個元素, 每個元素的值設(shè)成后1個元素的值.

3, 把最后1個元素的值清空(設(shè)成0)? , 這一步不做也可以, 就當(dāng)里面是垃圾數(shù)據(jù).

4, cur_len 的值減1 ,? 這一步很重要.


代碼如下:

?

1 BOOL Arr_delete(struct Arrlist * pArr, int index){ 2 if (TRUE != pArr->is_inited){ 3 Arr_error("Array is not inited yet!!"); 4 } 5 6 7 if((index < 0) || (index >= pArr->cur_len)) { 8 printf("the element is not existed yet\n"); 9 return FALSE; 10 } 11 12 int i; 13 for(i = (index + 1); i <= (pArr->cur_len -1); i++){ 14 pArr->paddr[i-1]=pArr->paddr[i]; 15 } 16 17 pArr->paddr[pArr->cur_len-1]=0; 18 pArr->cur_len--; 19 return TRUE; 20 21 }

?

?

?

5.14 倒置數(shù)組函數(shù) ? Arr_invert(struct Arrlist * pArr)

所謂倒置就是把數(shù)組前面元素放到后面, 后面的放到前面.

實現(xiàn)的算法其實不復(fù)雜,? 就是最前的與最后互換,? 第個元素與倒數(shù)第2個元素互換.....

代碼如下:

1 void Arr_invert(struct Arrlist * pArr){ 2 if (TRUE != pArr->is_inited){ 3 Arr_error("Array is not inited yet!!"); 4 } 5 6 if (TRUE == Arr_is_empty(pArr)){ 7 return; 8 } 9 10 int i = 0; 11 int j = pArr->cur_len -1; 12 int m; 13 14 while(i<j){ 15 m = pArr->paddr[i]; 16 pArr->paddr[i] = pArr->paddr[j]; 17 pArr->paddr[j] = m; 18 i++; 19 j--; 20 } 21 }

?

?5.15 排序函數(shù) Arr_sort(struct Arrlist * pArr)

排序是一個很有深度的課題, 我這里只用了最簡單實現(xiàn)的冒泡排序法, 當(dāng)然性能也幾乎最渣了, 不過應(yīng)付一般長度的數(shù)組還是可以的..

?

?

?

1 void Arr_sort(struct Arrlist * pArr){ 2 if (TRUE != pArr->is_inited){ 3 Arr_error("Array is not inited yet!!"); 4 } 5 6 if (TRUE == Arr_is_empty(pArr)){ 7 return; 8 } 9 10 Arr_sort_dtlmaopao(pArr->paddr, pArr->cur_len); 11 12 } 13 14 15 static void Arr_sort_dtlmaopao(int * piar, int len){ 16 int i, j, m; 17 for (i=0; i< len; i++){ 18 //printf("\n"); 19 //printf("i is %d\n",i); 20 //Arr_p_array(piar,len); 21 22 for (j=i+1; j< len; j++){ 23 //printf("mv is %d\n",piar[i]); 24 //Arr_p_array(piar,len); 25 if (piar[i] > piar[j]){ 26 m =piar[i]; 27 piar[i] = piar[j]; 28 piar[j] = m; 29 30 } 31 //Arr_p_array(piar,len); 32 } 33 } 34 }

?

?

6.最后寫個小程序測試一下

最基本的幾個函數(shù)我都寫出來, 但是還是要測試一下啦:

寫個小程序:

?

1 int array1_1(){ 2 3 struct Arrlist arr1; 4 struct Arrlist * parr1; 5 6 parr1 = &arr1; 7 8 Arr_init(parr1,10); 9 char empty =Arr_is_empty(parr1); 10 11 12 printf("len is %d\n",parr1->len); 13 printf("is empty is %c\n",empty); 14 printf("\n"); 15 16 int i; 17 for (i=0;i<parr1->len;i++){ 18 Arr_add(parr1,(i+1) * 3); 19 } 20 21 printf("cur_len is %d\n",parr1->cur_len); 22 printf("\n"); 23 24 Arr_set(parr1, 9,Arr_get(parr1,8)); 25 Arr_set(parr1, 10,100); 26 27 Arr_insert(parr1, 10,11111); 28 Arr_insert(parr1, 3,11111); 29 Arr_insert(parr1, 3,22222); 30 Arr_delete(parr1, 4); 31 32 Arr_show(parr1); 33 34 for (i=0; i<20; i++){ 35 Arr_add(parr1,(i+1)*4); 36 37 } 38 39 printf("cur_len is %d\n",parr1->cur_len); 40 printf("len is %d\n",parr1->len); 41 printf("\n"); 42 43 Arr_show(parr1); 44 printf("\n"); 45 46 Arr_invert(parr1); 47 Arr_show(parr1); 48 printf("\n"); 49 50 Arr_sort(parr1); 51 Arr_show(parr1); 52 printf("\n"); 53 54 return 0; 55 }

?

?

輸出:

len is 10 is empty is 1cur_len is 10the element is not existed yet the position is over the length of array, please use Arr_add instead 3, 6, 9, 22222, 12, 15, 18, 21, 24, 27, 27 cur_len is 31 len is 403, 6, 9, 22222, 12, 15, 18, 21, 24, 27, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 8080, 76, 72, 68, 64, 60, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 27, 27, 24, 21, 18, 15, 12, 22222, 9, 6, 33, 4, 6, 8, 9, 12, 12, 15, 16, 18, 20, 21, 24, 24, 27, 27, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 22222array1_main done

?

?


總結(jié)

以上是生活随笔為你收集整理的线性结构 -- 连续存储(数组), 1个简单的c语言代码实现.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。