【数据结构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);
    }
}

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

相关推荐
小王C语言1 小时前
【基础IO】————简单设计一下libc库
前端·数据结构·算法
_日拱一卒1 小时前
LeetCode:滑动窗口的最大值
数据结构·算法·leetcode
老约家的可汗2 小时前
list 容器详解:基本介绍与常见使用
c语言·数据结构·c++·list
Book思议-2 小时前
【数据结构】字符串模式匹配:暴力算法与 KMP 算法实现与解析
数据结构·算法·kmp算法·bf算法
mifengxing2 小时前
力扣HOT100——(1)两数之和
java·数据结构·算法·leetcode·hot100
罗湖老棍子3 小时前
【 例 1】区间和(信息学奥赛一本通- P1547)(基础线段树和单点修改区间查询树状数组模版)
数据结构·算法·线段树·树状数组·单点修改 区间查询
Book思议-3 小时前
【数据结构】栈与队列核心对比
数据结构·栈与队列对比
旺仔.2913 小时前
常用算法 详解
数据结构·算法
今儿敲了吗3 小时前
算法复盘——差分
数据结构·c++·笔记·学习·算法
西西弟3 小时前
最短路径之Dijkstra算法(数据结构)
数据结构·算法