目录
[3.1 创建表头](#3.1 创建表头)
[3.2 往表中压入元素](#3.2 往表中压入元素)
[3.3 任意位置插入元素](#3.3 任意位置插入元素)
[3.4 删除表中元素](#3.4 删除表中元素)
[3.5 显示表中所有元素](#3.5 显示表中所有元素)
[3.6 释放表及表中数据](#3.6 释放表及表中数据)
一、类型重命名、定义表头
cpp
C
// 类型重命名
typedef int Element_t;
// 表头(结构体形式)
typedef struct
{
Element_t *data; // 存储表数据空间的首地址
int pos; // 指向数据空间中的待插入的位置
int capacity; // 表中目前最大的存储容量
}SEQTable_t;
二、设计接口
cpp
C
// 栈上申请空间与堆上申请空间的区别
// 栈上分配/释放空间都是自动的
// 堆上分配/释放空间都是手动的
void func() {
int a = 10; // 栈上申请
int arr[100]; // 栈上申请数组
SEQTable_t table; // 栈上申请结构体变量
} // 函数结束自动释放
void func() {
int *p = (int*)malloc(100 * sizeof(int)); // 堆上申请
SEQTable_t *table = createSeqTable(100); // 堆上申请
free(p); // 必须手动释放
releaseSeqTable(table); // 必须手动释放
}
接口:
1、创建表头
2、压入元素
3、任意位置插入元素
4、删除表中元素
5、显示表中所有元素
6、释放表头(包括表和数据)
cpp
C
//表头在堆上申请,提供给其他的函数使用,需要释放接口
SEQTable_t *createSeqTable(int n); //创建表头,同时申请了数据存储空间,表头在堆上
void releaseSeqTable(SEQTable_t *table); //释放表头,同时释放表中指向的数据存储空间
int pushbackSeqTable(SEQTable_t *table,Element_t value);
int insertPosSeqTable(SEQTable_t *table,int index,Element_t value);
int deleteSeqTable(SEQTable_t *table,Element_t value); //删除表中某个值
void showSeqTable(const SEQTable_t *table);
三、实现接口
3.1 创建表头
cpp
C
SEQTable_t *createSeqTable(int n)
{
//定义一张表为空
SEQTable_t * table = NULL;
// 在堆上申请表空间
table = malloc(sizeof(SEQTable_t));
// 申请数据空间
table->data = malloc(sizeof(Element_t) * n);
// 初始化:pos为0,总的容量赋值为传进接口的数据n
table->pos = 0;
table->capacity = n;
// 返回所创建的新表
return table;
}
3.2 往表中压入元素
C
int pushbackSeqTable(SEQTable_t* table, Element_t value)
{
if (table == NULL)
{
fprintf(stderr,"table is nullptr\n");
return -1;
}
// 进行扩容
if (table->pos >= table->capacity && enlargerTable(table))
{
System.out.println("!!!\n");
// 扩容失败返回
return -1;
}
// 填入新元素
table->data[table->pos] = value;
++table->pos;
return 0;
}
3.3 任意位置插入元素
C
int insertPosSeqTable(SEQTable_t* table, int index, Element_t value)
{
// 插入位置有效性判断
if (index < 0 || index > table->pos)
{
printf("index invalid\n");
return -1;
}
//顺序表进行扩容
if (table->pos >= table->capacity && enlargerTable(table))
{
printf("=========\n");
return -1;
}
//搬移数据为新数据预留位置 从后往前进行搬移 data[i+1] = data[i];
// [pos-1,index] 使用for循环
for (int i = table->pos-1;i >= index;--i) //--i效率更高
{
table->data[i+1] = table->data[i];
}
// 填入新数据
table->data[index] = value;
++table->pos;
return 0;
}
3.4 删除表中元素
C
// 查找要删除元素的下标
static int findSeqTable(const SEQTable_t* table, Element_t value)
{
for (int i = 0; i < table->pos; ++i)
{
if (table->data[i] == value)
{
return i;
}
}
return -1;
}
//
int deleteSeqTable(SEQTable_t* table, Element_t value)
{
// 查找value在数据结构中的索引位置,没找到
int index = findSeqTable(table,value);
if (index == -1)
{
printf("no find:%d\n",value);
return -1;
}
// 把[index+1,pos) 把后面的元素搬移到前面覆盖,后一个给前一个
for (int i = index+1;i < table->pos; ++i)
{
table->data[i-1] = table->data[i];
}
--table->pos;
return 0;
}
3.5 显示表中所有元素
C
void showSeqTable(const SEQTable_t* table)
{
if (table == NULL)
{
return;
}
for (int i = 0; i < table->pos; ++i)
{
printf("%d\t", table->data[i]);
}
printf("\n");
}
3.6 释放表及表中数据
C
void releaseSeqTable(SEQTable_t* table)
{
if (table)
{
if (table->data)
{
free(table->data);
}
free(table);
}
}
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!
