C語言 動態陣列的實現

2021-10-08 14:58:51 字數 4600 閱讀 8356

動態陣列(dynamic array),顧名思義就是能改變大小的陣列。使用動態陣列可以有效的提高記憶體利用率。

下面附上動態陣列的c語言實現

標頭檔案:dynamic_array.h

#ifndef __dynamic_array_h__

#define __dynamic_array_h__

#ifdef __cpluscplus

extern "c" ;

//初始化陣列

struct dynamic_array * init_dynamic_array(int capacity);

//插入功能

void insert_dynamic_array(struct dynamic_array *array,int pos,void *data);

//遍歷陣列

void foreach_dynamic_array(struct dynamic_array *array,void(*my_foreach)(void *));

//刪除功能

//按照位置來刪除

void remove_pos_dynamic_array(struct dynamic_array *array,int pos);

//按照數值來刪除

void remove_value_dynamic_array(struct dynamic_array *array,void *data,int(*my_compare)(void *,void *));

//銷毀陣列

void destroy_dynamic_array(struct dynamic_array *array);

#ifdef __cplusplus

} #endif

#endif

動態陣列功能實現: dynamic_array.c

#include "dynamic_array.h"

//初始化陣列

struct dynamic_array * init_dynamic_array(int capacity)

struct dynamic_array * array = malloc(sizeof(struct dynamic_array));

//判斷記憶體是否申請成功

if(null == array)

//設定容量

array->m_capacity = capacity;

//設定大小

array->m_size = 0;

//維護在堆區的陣列指標

array->paddr = malloc(sizeof(void *)*array->m_capacity);

}//插入功能

void insert_dynamic_array(struct dynamic_array *array,int pos,void *data)

if(null == data)

if(pos < 0 || pos > array->m_size)

//先判斷是否已經滿載,如果滿了,動態開闢

if(array->m_size >= array->m_capacity)

//插入新的資料元素

//從最後乙個位置開始,依次移動資料(後移)

for(int i = array->m_size;i >= pos;i--)

//將新資料查到指定位置

array->paddr[pos] = data;

//更新大小

array->m_size++;

}//遍歷陣列

void foreach_dynamic_array(struct dynamic_array *array,void(*my_foreach)(void *))

if(null == my_foreach)

for(int i = 0;i < array->m_size;i++)

}//刪除功能

//按照位置來刪除

void remove_pos_dynamic_array(struct dynamic_array *array,int pos)

if(pos < 0 || pos > array->m_size -1)

//從pos位置開始 到陣列尾 資料進行前移

for(int i = pos;i < array->m_size - 1;i++)

array->m_size--;

}//按照數值來刪除

void remove_value_dynamic_array(struct dynamic_array *array,void *data,int(*my_compare)(void *,void *))

if(null == data)

for(int i = 0;i < array->m_size;i++)

}}//銷毀陣列

void destroy_dynamic_array(struct dynamic_array *array)

if(null != array->paddr)

free(array);

array = null;

}

功能寫好了,那就要測試一下,新建了test.c和test.**件。

測試標頭檔案:test.h

#ifndef __tese_h__

#define __tese_h__

#ifdef __cpluscplus

extern "c" ;

//列印陣列

void my_print_person(void *data);

//比較陣列值

int my_compare_person(void *data1,void *data2);

//動態陣列功能測試

void function_test(void);

#ifdef __cplusplus

} #endif

#endif

測試檔案:test.c

#include "test.h"

void my_print_person(void *data)

int my_compare_person(void *data1,void *data2)

void function_test(void)

; struct person p2 =;

struct person p3 =;

struct person p4 =;

struct person p5 =;

struct person p6 =;

//列印插入前容量

printf("當前的容量:%d\n",arr->m_capacity);

//將資料插入到動態陣列中

insert_dynamic_array(arr,0,&p1);

insert_dynamic_array(arr,0,&p2);

insert_dynamic_array(arr,0,&p3);

insert_dynamic_array(arr,2,&p4);

insert_dynamic_array(arr,10,&p5);

insert_dynamic_array(arr,1,&p6);

//輸出順序:關羽 妲己 張飛 項羽 亞瑟 宮本

//遍歷輸出插入結果

foreach_dynamic_array(arr,my_print_person);

//列印插入後容量

printf("插入資料後的容量:%d\n",arr->m_capacity);

//刪除指定位置資料

remove_pos_dynamic_array(arr,1);

//遍歷輸出刪除後的陣列

printf("刪除元素後,陣列中的資料為:\n");

foreach_dynamic_array(arr,my_print_person);

//刪除指定資料值

struct person p =;

remove_value_dynamic_array(arr,&p,my_compare_person);

printf("刪除指定值後,陣列中的資料為:\n");

foreach_dynamic_array(arr,my_print_person);

//銷毀陣列

destroy_dynamic_array(arr);

arr = null;

}

接下來把需要用的所有標頭檔案放到includes.h裡面,這樣便於管理。

標頭檔案集合:includes.h

#ifndef __includes_h__

#define __includes_h__

#ifdef __cpluscplus

extern "c"

#endif

#endif

在主程式中呼叫function_test函式測試功能

入口檔案:main.c

#include "includes.h"

//主函式

int main(void)

C語言動態陣列實現

環境 vs2015 1 標頭檔案 dynamicarray.h ifndef dynamicarray h 如果沒有定義 define dynamicarray h 則定義 include include include typedef struct dynamicarray dynamic arr...

C語言中動態陣列的實現

c語言中陣列直接申請,int a 10 是存放在棧上。棧是被系統嚴格管理胡,故陣列的大小一經申請便無法再被修改。因此,動態陣列需要在堆中才能實現,使用malloc,calloc等函式在系統中開闢所需的記憶體空間,接收返回的位址作為陣列的首位址 頭指標 在用迴圈即可進行動態陣列的初始化。注 動態陣列需...

C語言佇列實現 動態陣列

queue.h created on 2011 10 7 author admin ifndef queue h define queue h include include the data type that contained in the queue typedef int queuedat...