顺序表
1.概念
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中
2.数据结构
typedef int ElemType;
//顺序表的数据结构
typedef struct SeqList
{
ElemType* ptr;
int index;
int capacity;
}SeqList;
3.顺序表的初始化
//顺序表的初始化
void InitSeqList(SeqList* list)
{
if (NULL == list) { return; }
list->ptr = (ElemType*)malloc(sizeof(ElemType) * 4);
if (list->ptr == NULL) { exit(-1); }
memset(list->ptr, 0, sizeof(ElemType) * 4);
list->index = 0;
list->capacity = 4;
}
4.顺序表的扩容
//顺序表扩容
void ExtendCapacity(SeqList* list)
{
if (NULL == list) { return; }
ElemType* p = list->ptr; //防止内存泄漏
list->ptr = (ElemType*)realloc(list->ptr, list->capacity * 1.5 * sizeof(ElemType));
if (list->ptr == NULL)
{
free(p);
exit(-1);
}
p = NULL;
list->capacity *= 1.5; //了解为什么1.5倍扩容
}
5.顺序表的插入
//在指定位置插入一个数据
bool Insert(SeqList* list, int pos, ElemType elem)
{
if (NULL == list) { return false; }
//插入的时候,容量够不够
if (list->index + 1 > list->capacity)
{
ExtendCapacity(list);
}
//插入的位置正确不正确
if (pos > list->index)
{
return false;
}
// 0 1 2 3
for (int i = list->index ; i > pos; i--)
{
list->ptr[i] = list->ptr[i - 1];
}
list->ptr[pos] = elem;
list->index++;
}
//在头部插入
bool PushFront(SeqList* list, ElemType elem)
{
return Insert(list, 0, elem);
}
//在尾部插入
bool PushBack(SeqList* list, ElemType elem)
{
return Insert(list, list->index, elem);
}
6.顺序表的查找
//顺序表的查找
int FindValue(SeqList* list, ElemType elem)
{
if (NULL == list) { return -1; }
int pos = 0;
for (; pos < list->index&&list->ptr[pos]!=elem; pos++);
return pos == list->index?-1:pos;
}
7.顺序表的删除
//顺序表的删除
bool Delete(SeqList* list, int pos)
{
if (NULL == list) { return false; }
//判断删除的位置正不正确
if (pos >= list->index&& pos<0) { return false; }
for (int i = pos; i < list->index-1; i++)
{
list->ptr[i] = list->ptr[i+1];
}
list->index--;
}
//删除某个特定的值
bool DeleteValue(SeqList* list, ElemType elem)
{
if (NULL == list) { return -1; }
int pos = FindValue(list, elem);
if (pos != -1)
{
Delete(list, pos);
return true;
}
return false;
}
8.顺序表的修改
//顺序表的修改
bool Alter(SeqList* list, int pos, ElemType elem)
{
if (NULL == list) { return -1; }
if (pos >= list->index && pos < 0) { return false; }
list->ptr[pos] = elem;
return true;
}
9.打印顺序表
//打印顺序表
void Print(SeqList* list)
{
if (NULL == list) { return ; }
for (int i = 0; i < list->index; i++)
{
printf("%d ", list->ptr[i]);
}
printf("\n");
}
10.销毁顺序表
void Destory(SeqList* list)
{
if (NULL == list) { return; }
if (list->ptr != NULL)
{
free(list->ptr);
list->ptr = NULL;
}
list->index = 0;
list->capacity = 0;
}
11.清除顺序表
//清除顺序表
void Clear(SeqList* list)
{
if (NULL == list) { return; }
list->index = 0;
}
一起学习,一起成长。