自学内容网 自学内容网

数据结构:顺序表

1.顺序表的概念

顺序表是用一段 物理地址连续 的存储单元依次存储数据元素的线性结构,一般情况下采用数组存
储。在数组上完成数据的增删查改。

2.接口实现 

 2.1初始化

void SLInit(SL* psl)
{
assert(psl);
psl->a = (SeqListData*)malloc(sizeof(SeqListData)*4);
if (NULL == psl->a)
{
perror("malloc");
return;
}
psl->capacity = 4;
psl->size = 0;
}

 2.2销毁

void SLDestroy(SL* psl)
{
assert(psl);
free(psl->a);
psl->a = NULL;
psl->capacity = 0;
psl->size = 0;
}

 2.3顺序表打印

void SLPrint(SL* psl)
{
assert(psl);

for (int i = 0; i < psl->size; i++)
{
printf("%d ",psl->a[i]);
}
}

 2.4增加数据

 2.4.1检查容量

void ChackCapacity(SL* psl)
{
assert(psl);

if (psl->size == psl->capacity)
{
SeqListData* tmp = (SeqListData*)realloc(psl->a, sizeof(SeqListData) * psl->capacity * 2);
if (NULL == tmp)
{
perror("realloc fail");
return;
}
psl->a = tmp;
psl->capacity *= 2;
}
}

在增加数据之前,需要检查是否有足够的容量。不够就扩容。 

 2.4.2头插

void SLPushFront(SL* psl, SeqListData x)
{
assert(psl);

ChackCapacity(psl);
int end = psl->size - 1;
while (end >= 0)
{
psl->a[end + 1] = psl->a[end];
end--;
}
psl->a[0] = x;
psl->size++;
}

 2.4.3尾插 

void SLPushBack(SL* psl, SeqListData x)
{
assert(psl);

ChackCapacity(psl);
psl->a[psl->size++] = x;
}

 2.4.4在pos位置增加数据

void SLInsert(SL* psl, int pos, SeqListData x)
{
assert(psl);
assert(0<=pos && pos<= psl->size);
ChackCapacity(psl);
int end = psl->size - 1;
while (end >= pos)
{
psl->a[end+1] = psl->a[end];
end--;
}
psl->a[pos] = x;
psl->size++;
}

前面的头插和尾插可以复用这段代码。 

 2.5删除数据

 2.5.1头删

void SLPopFront(SL* psl)
{
assert(psl);
assert(psl->size > 0);
int start = 0;
while(start < psl->size - 1)
{
psl->a[start] = psl->a[start+1];
++start;
}
psl->size--;
}

 2.5.2尾删

void SLPopBack(SL* psl)
{
assert(psl);
assert(psl->size > 0);
psl->size--;
}

 2.5.3在pos位置删除数据

void SLErase(SL* psl, int pos)
{
assert(psl);
assert(0<=pos && pos<psl->size);
int start = pos + 1;
while (start < psl->size)
{
psl->a[start-1] = psl->a[start];
start++;
}
psl->size--;
}

头删和尾删可以复用这段代码。 

 2.6查找数据

int SLFind(SL* psl, SeqListData x)
{
assert(psl);

for (int i = 0; i < psl->size; i++)
{
if (psl->a[i] == x)
{
return i;
}
}
return -1;
}

2.7修改数据 

void SLModify(SL* psl, SeqListData x, int pos)
{
assert(psl);

psl->a[pos] = x;
}


原文地址:https://blog.csdn.net/2402_83501061/article/details/138580526

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!