動態陣列(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...