数据结构——顺序表

        数据结构中的表为线性结构,一般分为顺序表和链式表。其中顺序表用一组连续的内存空间存储,可以理解为用数组存储。下面我们详细说:

先给 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

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值