数据结构专题
数据结构的掌握对编程能力的提升是有很大帮助的,尤其对于链表而言,这是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))