写在前面:
本博客主要是记录自己学习的数据结构中的实践编码,参考了传智播客扫地僧的数据结构的视频,在此感谢;
1.线性表定义
线性表是0个或者多个数据元素的集合;
线性表中的元素之间是有顺序的;
线性表中的数据元素个数是有限的;
线性表中的数据元素的类型必须相同;
性质:
抽象表达:线性表是a0,a1,a2…,an;有序的数据元素集合,其中a0是线性表的第一个元素,只有一个后继;
an是线性表的最后一个元素,只有一个前驱,除了a0和an外的其他元素都是即有前驱,又有后继,线性表能够逐项访问和顺序存储;
1.1.1 线性表的操作
(1)创建线性表
(2)向线性表中插入元素
(3)根据指定位置删除线性表中的元素
(4)根据指定位置获取线性表的元素
(5)获取线性表的长度
(6)销毁线性表
(7)线性表复位操作
1.1.2 线性表的数组方式实现:
typedef void Seqlist;
typedef void SeqlistNode;
typedef void (*PrintFunc)(SeqlistNode* node);
Seqlist * Seqlist_create(int icapicity);
int Seqlist_insert(Seqlist* list, SeqlistNode* node, int pos);
int Seqlist_Length(Seqlist *list);
int Seqlist_capicaty(Seqlist* list);
Seqlist * Seqlist_get(Seqlist* list, int pos);
void Seqlist_reset(Seqlist* list);
Seqlist * Seqlist_delete(Seqlist *list, int pos);
void Seqlist_destroy(Seqlist *list);
void seqlist_print(Seqlist* list, PrintFunc myshow);
//线性表数据结构,用来管理线性表的数据结构
typedef struct _tag_seqlist
{
int iCapacity;
int length;
Seqlist **pAddr; //指向线性表的地址,使用二级指针来指向线性表地址
}TSeqlist;
//创建线性表,返回线性表地址
Seqlist * Seqlist_create(int icapicity)
{
TSeqlist * tlist = NULL;
tlist = (TSeqlist *) malloc(sizeof(TSeqlist));
if(tlist == NULL)
{
printf("malloc error\n");
return NULL;
}
tlist->iCapacity = icapicity;
tlist->length = 0;
tlist->pAddr = (Seqlist **)malloc(sizeof(void*) * icapicity);
if(tlist->pAddr == NULL)
{
if(tlist)
{
free(tlist);
}
return NULL;
}
return (Seqlist*)tlist;
}
//插入元素
int Seqlist_insert(Seqlist* list, SeqlistNode* node, int pos)
{
TSeqlist * tlist = NULL;
int i = 0;
if(list == NULL || node == NULL || pos < 0)
{
return -1;
}
tlist = (TSeqlist *)list;
if(pos >= tlist->iCapacity)
{
return -2;
}
//判断是否满了
if(tlist->length >= tlist->iCapacity)
{
printf("tlist full\n");
return -2;
}
//修正
if(tlist->length < pos)
{
pos = tlist->length;
}
//插入元素之前,将元素后移
for(i = tlist->length; i > pos; i--)
{
tlist->pAddr[i] = tlist->pAddr[i - 1];
}
// 将新节点放入要插入的位置
tlist->pAddr[i] = node;
tlist->length++;
return 0;
}
Seqlist * Seqlist_delete(Seqlist *list, int pos)
{
TSeqlist * tlist = NULL;
SeqlistNode * ret = NULL;
int i = 0;
if(list == NULL || pos < 0)
{
return NULL;
}
tlist = (TSeqlist *)list;
if(pos >= tlist->iCapacity)
{
return NULL;
}
if(pos > tlist->length)
{
pos = tlist->length;
}
ret = tlist->pAddr[pos];
//删除元素,将元素前移
for(i = pos + 1; i < tlist->length; i++)
{
tlist->pAddr[i - 1] = tlist->pAddr[i];
}
tlist->length--;
return ret;
}
int Seqlist_Length(Seqlist *list)
{
TSeqlist * tlist = NULL;
int i = 0;
if(list == NULL)
{
return -1;
}
tlist = (TSeqlist*)list;
return tlist->length;
}
int Seqlist_capicaty(Seqlist* list)
{
TSeqlist * tlist = NULL;
int i = 0;
if(list == NULL)
{
return -1;
}
tlist = (TSeqlist*)list;
return tlist->iCapacity;
}
Seqlist * Seqlist_get(Seqlist* list, int pos)
{
TSeqlist * tlist = NULL;
int i = 0;
if(list == NULL || pos < 0)
{
return NULL;
}
tlist = (TSeqlist*)list;
//修正
if(pos > tlist->length)
{
pos = tlist->length;
}
return tlist->pAddr[pos];
}
void Seqlist_reset(Seqlist* list)
{
TSeqlist * tlist = NULL;
int i = 0;
if(list == NULL)
{
return ;
}
if(tlist->pAddr)
{
free(tlist->pAddr);
tlist->pAddr = NULL;
}
tlist->iCapacity = 0;
tlist->length = 0;
if(tlist)
{
free(tlist);
}
return ;
}
void Seqlist_destroy(Seqlist *list)
{
TSeqlist * tlist = NULL;
int i = 0;
if(list == NULL)
{
return ;
}
if(tlist->pAddr)
{
free(tlist->pAddr);
tlist->pAddr = NULL;
}
free(tlist);
}
void seqlist_print(Seqlist* list, PrintFunc myshow)
{
TSeqlist* tlist = NULL;
int i = 0;
if(list == NULL)
{
return;
}
tlist = (TSeqlist *)list;
for(i = 0; i < tlist->length; i++)
{
myshow(tlist->pAddr[i]);
}
}