数据结构中的表为线性结构,一般分为顺序表和链式表。其中顺序表用一组连续的内存空间存储,可以理解为用数组存储。下面我们详细说:
先给 int 类型起个别名(非必要)
#define TYPE int
现在我们来创建顺序表的结构体
typedef struct Array
{
TYPE *ptr;//数组
size_t cap;//总容量
size_t cnt;//元素个数
}Array;
下面我们开始写顺序表的相关运算算法:
创建
//创建
Array *create_arry(size_t size)
{
Array *arr=malloc(sizeof(Array));
arr->ptr=malloc(sizeof(TYPE)*size);
arr->cap=size;
arr->cnt=0;
return arr;
}
销毁
//销毁
void destroy_array(Array *arr)
{
if(arr==NULL) return;
else
{
free(arr);
arr=NULL;
}
}
清空 注意:上面的销毁是销毁整个表,清空则是只格式化数据,注意区分
//清空
void clean_array(Array *arr)
{
if(arr==NULL) return;
arr->cnt=0;
}
插入
//插入
bool insert_arry(Array*arr,int index,TYPE val)
{
if(arr==NULL)
{
arr=create_arry(10);
}
if(arr->cnt>=arr->cap) return false;
if(index<0||index>arr->cnt) return false;
/*for(int i=arr->cnt;i>index;i--)
{
arr->ptr[i]=arr->ptr[i-1];
}*/
memmove(arr->ptr+index+1,arr->ptr+index,(arr->cnt-index)*sizeof(TYPE));
arr->ptr[index]=val;
arr->cnt++;
return true;
}
删除
//删除
bool delete_array(Array *arr,int index)
{
if(arr==NULL) return true;
for(int i=index;i<arr->cnt;i++)
{
arr->ptr[i] = arr->ptr[i + 1];
}
//memmove(arr->ptr + index, arr->ptr + index + 1, (arr->cnt - (index + 1) * sizeof(TYPE)));
arr->cnt--;
return true;
}
访问
//访问
bool access_array(Array *arr,int index,TYPE *val)//把index下标的值赋给val
{
if(arr==NULL) return false;
if(index<0||index>arr->cnt) return false;
*val = arr->ptr[index];
return true;
}
查询
//查询
int query_array(Array *arr,TYPE key)
{
if(arr==NULL) return -1;
for(int i=0;i<arr->cnt;i++)
{
if(arr->ptr[i]==key) return i;
}
return -1;
}
修改
//修改
bool modify_array(Array *arr,int index,TYPE val)
{
if(arr==NULL) return false;
if(index<0||index>arr->cnt) return false;
arr->ptr[index]=val;
return true;
}
排序(冒泡)
//排序
void sort_array(Array *arr)
{
for(int i=0;i<arr->cnt;i++)
{
for(int j=i+1;j<arr->cnt;j++)
{
if(arr->ptr[i]>arr->ptr[j])
{
TYPE temp=arr->ptr[i];
arr->ptr[i]=arr->ptr[j];
arr->ptr[j]=temp;
}
}
}
}
排序(快排函数)注意加头文件
int cmp(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
qsort(arr->ptr,arr->cnt,sizeof(TYPE),cmp);
遍历
//遍历
void show_array(Array *arr)
{
for(int i=0;i<arr->cnt;i++)
{
printf("%d ",arr->ptr[i]);
}
printf("\n");
}
到这里,我们顺序表的基本运算就算是写完了,现在可以在主函数里做一些简单的测试:
int main(int argc,const char* argv[])
{
Array *array=create_arry(10);
for (int i = 0; i < array->cap&&insert_arry(array,i,i+1); i++){}
//clean_array(array);
modify_array(array, 4, 20);
//sort_array(array);
bool a=access_array(array, 4, 20);
int b = query_array(array, 7);
delete_array(array, 3);
show_array(array);
return 0;
}
over