目录
0、前言
线性表(Linear List)。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。
非线性表。在非线性表中,数据之间并不是简单的前后关系
数组(Array)。是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。最大的特点就是支持随机访问,但插入、删除操作也因此变得比较低效,平均情况时间复杂度为 O(n)
一、动态数组数据结构
struct dstrct_array
{
unsigned int size; /* array total size */
unsigned int used; /* array used size, from 1 to size */
unsigned int tpsz; /* data type size */
void *p; /* array, dynamically applied by array_init()*/
};
二、动态数组增删改查函数声明
extern struct dstrct_array* array_creat(unsigned int size, unsigned int tpsz);
extern int array_init(struct dstrct_array *array, unsigned int size, unsigned int tpsz);
extern int array_insert (struct dstrct_array *array, unsigned int pos, void *const value);
extern int array_del_value (struct dstrct_array *array, void *value);
extern int array_del_pos (struct dstrct_array *array, unsigned int pos);
extern int array_modify (struct dstrct_array *array, unsigned int pos, void *const value);
extern int array_search_pos(struct dstrct_array *array, void* const value);
extern int array_empty (struct dstrct_array *array);
extern int array_destroy(struct dstrct_array *array);
extern unsigned int array_used(struct dstrct_array *array);
extern unsigned int array_size(struct dstrct_array *array);
extern void algo_array_test(void);
三、数组创建
1、头部动态创建
/**
* dynamically create a dynamic array, including the array header and data space.
*
* @param size: array size
* @param tpsz: array data type length
* @return NULL:malloc fail
* !NULL:success
*/
struct dstrct_array* array_creat(unsigned int size, unsigned int tpsz)
{
struct dstrct_array *array = NULL;
if (size <= 0 || tpsz <= 0)
return NULL;
/* malloc an array control struct */
array = ARRAR_MALLOC(sizeof(*array));
if (array == NULL)
{
return NULL;
}
/* calloc an array */
void *p = ARRAR_CALLOC(1, (size * tpsz));
if (p == NULL)
return NULL;
array->used = 0;
array->size = size;
array->tpsz = tpsz;
array->p = p;
return array;
}
2、头部静态创建
/**
* init a dynamic array, malloc a data space.
*
* @param array:
* @param size: array size
* @param tpsz: array data type length
* @return -1:array is null or malloc fail
* 0:success
*/
int array_init(struct dstrct_array *array, unsigned int size, unsigned int tpsz)
{
if (array == NULL)
return -1;
/* calloc an array */
void *p = ARRAR_CALLOC(1, (size * tpsz));
if (p == NULL)
return -1;
array->used = 0;
array->size = size;
array->tpsz = tpsz;
array->p = p;
return 0;
}
四、元素添加
/**
* insert a value to an array.
* @note The array cannot be inserted after it is full,
* and can only be inserted when the used is less than the size
* The purpose is to leave at least one space for carrying
* @param array:
* @param pos: 1 - size
* @param value: data
* @return -1:array is null
* -2:pos overstep the boundary of array
* -3:used is greater than size
* 0:success
*/
int array_insert(struct dstrct_array *array, unsigned int pos, void *const value)
{
char *pbegin = NULL;
void *pnew = NULL, *pold = NULL, *pinsert = NULL;
unsigned int i = 0;
if (array == NULL)
return -1;
/* adjust the pos did cross the array*/
if (pos > array->size || pos <= 0)
return -2;
/* adjust used is not greater than size */
if (array->used >= array->size)
return -3;
/* move the array data back one cell */
pbegin = array->p;
for (i=array->used; i>=pos; i--)
{
pnew = pbegin + i * array->tpsz;
pold = pbegin + (i - 1) * array->tpsz;
memcpy(pnew, pold, array->tpsz);
}
/* insert the data*/
pinsert = pbegin + (pos - 1) * array->tpsz;
memcpy(pinsert, value, array->tpsz);
array->used++;
return 0;
}
五、元素删除
1、根据元素值删除
/**
* delete the array data by value.
*
* @param array: delete array
* @param value: delete value
* @return -1:array is null
* -2:value is not matched
* 0:success
*/
int array_del_value(struct dstrct_array *array, void *value)
{
char *pbegin = NULL;
void *pnew = NULL, *pold = NULL;
int i = 0, res = 0;
int check_flag = 1, check_succ = 0;
if (array == NULL)
return -1;
pbegin = array->p;
for (i=0; i<array->used; i++)
{
/* Check the match value */
if (check_flag)
{
res = memcmp(pbegin + i * array->tpsz, value, array->tpsz);
if (res == 0)
{
check_flag = 0;
check_succ = 1;
}
}
/* delete the check value and move one cell forward*/
else
{
pnew = pbegin + (i - 1) * array->tpsz;
pold = pbegin + i * array->tpsz;
memcpy(pnew, pold, array->tpsz);
}
}
/* match and deleat success*/
if (check_succ)
{
array->used--;
return 0;
}
return -2;
}
2、根据元素位置删除
/**
* delete the array data by pos.
*
* @param array: delete array
* @param pos: the array data pos
* @return -1:array is null
* -2:pos overstep the boundary of array
* 0:success
*/
int array_del_pos(struct dstrct_array *array, unsigned int pos)
{
char *pbegin = NULL;
void *pnew = NULL, *pold = NULL;
int i = 0;
if (array == NULL)
return -1;
if (pos <= 0 || pos > array->used)
return -2;
pbegin = array->p;
for (i=pos; i<=array->used; i++)
{
pnew = pbegin + (i - 1) * array->tpsz;
pold = pbegin + i * array->tpsz;
memcpy(pnew, pold, array->tpsz);
}
array->used--;
return 0;
}
六、元素修改
/**
* modify a value.
*
* @param array:
* @param pos: 1 - size
* @param value: data
* @return -1:array is null
* -2:pos overstep the boundary of array
* 0:success
*/
int array_modify(struct dstrct_array *array, unsigned int pos, void *const value)
{
char *pbegin = NULL;
void *pmodify = NULL;
if (array == NULL)
return -1;
/* adjust the pos did cross the array*/
if (pos > array->size || pos <= 0)
return -2;
pbegin = array->p;
pmodify = pbegin + (pos - 1) * array->tpsz;
memcpy(pmodify, value, array->tpsz);
return 0;
}
七、元素查找
/**
* search the value pos.
*
* @param array:
* @param value: data
* @return -1:array is null
* -2:pos overstep the boundary of array
* 1 - size: the value pos
*/
int array_search_pos(struct dstrct_array *array, void* const value)
{
char *pbegin = NULL;
void *psearch = NULL;
unsigned int i = 0, pos = 0;
if (array == NULL)
return -1;
/* adjust the pos did cross the array*/
if (pos > array->size || pos <= 0)
return -2;
pbegin = array->p;
for (i=0; i<array->used; i++)
{
psearch = pbegin + i * array->tpsz;
if (!memcmp(psearch, value, array->tpsz))
{
pos = i + 1;
break;
}
}
return pos;
}
八、数组清空
/**
* delete the array space.
*
* @return -1:array is null
* 0:success
*/
int array_empty(struct dstrct_array *array)
{
if (array ==NULL)
return -1;
ARRAY_FREE(array->p);
array->p = NULL;
return 0;
}
九、数组销毁
/**
* delete the array space and array control struct.
* @note The array space to be empty before destroy array
* @param array: delete array
* @return -1:array is null
* 0:success
*/
int array_destroy(struct dstrct_array *array)
{
if (array_empty(array) != 0)
return -1;
ARRAY_FREE(array);
array = NULL;
return 0;
}
十、验证程序
struct array_struct_test
{
int a;
int b;
}array_struct_test[10];
int array_test[10] = {0};
void algo_array_test(void)
{
struct dstrct_array *array_int = NULL;
struct dstrct_array *array_str = NULL;
unsigned int i = 0;
unsigned int insert_value = 0x55, del_value = 0x55, mdy_value = 0x66;
struct array_struct_test struct_test;
/* int type test*/
array_int = array_creat(10, sizeof(int));// int p[10]
for (i=0;i<5;i++)
{
array_insert(array_int, i+1, (void*)&i);
}
for (i=0;i<5;i++)
{
array_insert(array_int, 1, (void*)&insert_value);
}
for (i=0;i<array_int->used;i++)
{
array_test[i] = ((int*)array_int->p)[i];//1、((int*)array->p) 2、p[i]
}
array_del_value(array_int, (void*)&del_value);
array_del_pos(array_int,2);
array_del_pos(array_int,5);
array_del_pos(array_int,6);
array_modify(array_int, 5, (void*)&mdy_value);
memset(array_test, 0, sizeof(array_test));
for (i=0;i<array_int->used;i++)
{
array_test[i] = ((int*)array_int->p)[i];//1、((int*)array->p) 2、p[i]
}
/* srtruct type test*/
array_str = array_creat(10, sizeof(struct array_struct_test)); // struct array_struct_test p[10]);
for (i=0;i<5;i++)
{
struct_test.a = i;
struct_test.b = i + 1;
array_insert(array_str, i+1, (void*)&struct_test);
}
for (i=0;i<5;i++)
{
array_insert(array_str, 1, (void*)&struct_test);
}
for (i=0;i<array_str->used;i++)
{
array_struct_test[i] = ((struct array_struct_test*)array_str->p)[i];//1、((struct array_struct_test*)array->p) 2、p[i]
}
}