【数据结构1】实现线性表

目录

一、类型重命名、定义表头

二、设计接口

三、实现接口

[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);
    }
}

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

相关推荐
不想看见4041 小时前
Combinations -- 回溯法--力扣101算法题解笔记
数据结构·算法
凤年徐1 小时前
优选算法——双指针专题 3.快乐数 4.盛水最多的容器
开发语言·数据结构·c++·算法
小亮✿2 小时前
算法—并查集
数据结构·c++·算法
热爱生活的猴子2 小时前
二分查找类算法题核心笔记
数据结构·笔记·算法
zhim002 小时前
数据结构笔记(下)
数据结构
不想看见4042 小时前
旋转数组查找数字--力扣101算法题解笔记
数据结构·算法
L_Aria3 小时前
3875. 【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)
数据结构·算法·图论
仰泳的熊猫3 小时前
题目 1473: 蓝桥杯基础练习VIP-芯片测试
数据结构·c++·算法·蓝桥杯
拳里剑气3 小时前
C++:封装红黑树实现map和set
开发语言·数据结构·c++·学习方法