数据结构 - 线性表

数据结构专题

数据结构的掌握对编程能力的提升是有很大帮助的,尤其对于链表而言,这是Linux中最常见的数据结构,为了便于管理,将开几个章节对常见数据结构进行总结。
编程语言:C
编译器:GCC
已针对每个函数功能进行测试,暂未发现BUG,若存在问题,请予以指正
资料参考:国嵌数据结构课程
		《C语言深度剖析》

线性表基础概念

线性表的概念相信很多资料中都进行了详细说明,这里就不再赘述了,总体而言,线性表的操作不外乎以下几点:
1.创建
2.销毁
3.插入
4.删除
5.获取数据
为了更好拓展线性表功能,还可以加入更改线性表分配空间的功能:
6.重置线性表内存空间

创建线性表

线性表可以通过柔型数组来进行定义
typedef struct SeqList{
	int capacity; /* 总容量大小 */
	int length; /* 当前线性表尾指针 */
	data_t data[];
}T_SeqList,*PT_SeqList;
创建线性表,无非就是为柔性数组分配空间
SeqList* SeqList_Create(int capacity) /* 创建线性表(创建柔性数组) */
{
	PT_SeqList ret = NULL;
	if(capacity > 0)
	{
		ret = (PT_SeqList)malloc(sizeof(*ret) + sizeof(*(ret->data))*capacity);
		assert(NULL != ret);
		ret->capacity= capacity;
		ret->length = 0;
	}
	return ret;
}

销毁线性表

void SeqList_Destroy(SeqList* List)
{
	free(List);
}

插入数据

int SeqList_Insert(SeqList* List, SeqListNode* node, int pos)
{
	PT_SeqList ptList = (PT_SeqList)List;
	assert(ptList != NULL);
	int ret = -1;
	int i = 0;
	
	if((ptList->length + 1 <= ptList->capacity) && (0 <= pos))
	{
		if(pos >= ptList->length)
		{
			pos = ptList->length;
		}
		
		for(i=ptList->length; i>pos; i--)
		{
			ptList->data[i] = ptList->data[i-1]; /* 后移赋值 */
		}
		
		ptList->data[i] = (*(data_t *)node);
		
		ptList->length++;
		
		ret = 0;
	}

	return ret;
}

获取数据元素

SeqListNode* SeqList_Get(SeqList* List, int pos)
{
	PT_SeqList ptList = (PT_SeqList)List;
	SeqListNode* ret = NULL;
	
	assert(ptList != NULL);
	
	if((0 <= pos) && (pos < ptList->length))
	{
		ret = (SeqListNode *)&(ptList->data[pos]); /* 取址 */
	}
	return ret;
}

删除数据元素

SeqListNode* SeqList_Delete(SeqList* List, int pos)
{
	PT_SeqList ptList = (PT_SeqList)List;
	SeqListNode* ret = SeqList_Get(List, pos);
	
	assert(ret != NULL);
	
	for(int i=pos+1; i<ptList->length; i++)
	{
		ptList->data[i-1] = ptList->data[i];
	}
	
	ptList->length--;
	
	return ret;
}

重置线性表空间

SeqList* SeqList_Resetplace(SeqList** List, int new_capacity)
{
	PT_SeqList pt = NULL;
	PT_SeqList tmp = NULL;
	PT_SeqList* ret = (PT_SeqList *)List;
	
	assert(NULL != List);
	
	if((ret != NULL) && (new_capacity > 0) && ((*ret)->length <= new_capacity))
	{
		pt = (PT_SeqList)malloc(sizeof(*pt) + sizeof(*(pt->data)) * new_capacity);
		tmp = pt;
		int len = ((*ret)->capacity < new_capacity)?(*ret)->capacity:new_capacity;
		
		for(int i = 0; i < len; i++)
		{
			tmp->data[i] = (*ret)->data[i];
		}
		
		tmp->length = (*ret)->length;
		tmp->capacity = new_capacity;
		
		free(*List);
	}
	*List = pt;
	return pt;
}
[源代码](https://github.com/ysblmt/DataStructure)
[资源]([https://download.csdn.net/download/moliyw/11824799](https://download.csdn.net/download/moliyw/11824799))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值