目录
1. 引子:线性表
2. 简单数据结构:顺序表
2.1 顺序表简介与功能模块分析
简介:
功能模块分析:
2.2 顺序表的实现
2.2.1 顺序表:存储数据结构的构建
静态顺序表:
//替换更改表中元素类型
typedef int STDatatype;
//定义能够存储的数据个数
#define N 100
//静态
typedef struct SeqList
{
STDatatype data[N];
int capacity;
int size;
}SeqList;
动态顺序表:
typedef struct SeqList
{
STDatatype* data;
int capacity;
int size;
}SeqList;
2.2.2 顺序表:初始化与空间清理(动态)
初始化:
void SLInit(SeqList* s)
{
//不为NULL
assert(s);
//初始空间开辟4个数据大小
s->data = (STDatatype*)malloc(4 * sizeof(STDatatype));
if (s->data == NULL)
{
perror("malloc fail");
exit(-1);
}
s->capacity = 4;
s->size = 0;
}
空间清理:
void SLDestroy(SeqList* s)
{
assert(s);
free(s->data);
s->capacity = 0;
s->size = 0;
}
2.2.3 顺序表:插入与删除数据
扩容函数:
void CheckCapacity(SeqList* s)
{
assert(s);
if (s->capacity == s->size)
{
//使用临时变量去接收新地址(可能会扩容失败返回NULL),增加程序的健壮性
STDatatype* tmp = (STDatatype*)realloc(s->data, s->capacity * 2 * sizeof(STDatatype));
if (tmp == NULL)
{
perror("realloc fail");
exit(-1);
}
s->data = tmp;
s->capacity *= 2;
}
}
尾插,尾删
//尾插
void SLPush_Back(SeqList* s, STDatatype val)
{
assert(s);
CheckCapacity(s);
s->data[s->size] = val;
s->size++;
}
//尾删
void SLPop_Back(SeqList* s)
{
assert(s);
assert(s->size > 0);
s->size--;
}
头插,头删
//头插
void SLPush_Front(SeqList* s, STDatatype val)
{
assert(s);
CheckCapacity(s);
int i = s->size;
while (i > 0)
{
s->data[i] = s->data[i - 1];
i--;
}
s->data[i] = val;
s->size++;
}
//头删
void SLPop_Front(SeqList* s)
{
assert(s);
//暴力检查
assert(s->size > 0);
//警告
/*if (s->size == 0)
{
printf("表内已无元素,删除失败\n");
return;
}*/
int i = 0;
while (i < s->size - 1)
{
s->data[i] = s->data[i + 1];
i++;
}
s->size--;
}
随机插入:
//在pos位置插入元素
//pos为下标
void SLInsert(SeqList* s, int pos, STDatatype val)
{
assert(s);
assert(pos >= 0);
assert(pos < s->size);
CheckCapacity(s);
int i = s->size;
while (i > pos)
{
s->data[i] = s->data[i - 1];
i--;
}
s->data[pos] = val;
s->size++;
}
随机删除:
void SLErase(SeqList* s, int pos)
{
assert(s);
assert(s->size > 0);
assert(pos >= 0);
assert(pos < s->size);
int i = pos;
while (i < s->size - 1)
{
s->data[i] = s->data[i + 1];
i++;
}
s->size--;
}
2.2.4 查找数据与修改
//找到返回下标,未找到返回-1
int SLFind(SeqList* s, STDatatype val)
{
assert(s);
int i = 0;
for (i = 0; i < s->size; i++)
{
if (s->data[i] == val)
{
return i;
}
}
return -1;
}
//高内聚,低耦合f
void SLModify(SeqList* s, int pos, STDatatype val)
{
assert(s);
assert(pos > 0);
assert(pos < s->size);
s->data[pos] = val;
}