顺序存储之顺序表

简介: 这篇文章介绍了顺序表的创建、操作和顺序存储的实现,包括定义数据类型、构建顺序表结构、顺序表的创建、扩容、数据插入、删除、遍历和销毁。

顺序表的创建与操作(顺序存储)

1.首先我们需要定义数据类型

//定义数据类型  这儿我们使用int
typedef int DATA;   //给int取别名为DATA

2.构建顺序表的排序准则

//定义顺序表以index为顺序升序或降序排序
struct Node
{
    int index;
    DATA data;
};

3.定义顺序表结构

typedef struct seqList
{
    int size;     //当前顺序表长度
    struct Node* memory;   //存储顺序表数据的内存
}SQL,*LPSQL;
//SQL为该结构体类型的别名
//LPSQL为该结构体指针类型的别名

4.顺序表的创建

LPSQL createSeqList()
{
    LPSQL sqlist = (LPSQL)malloc(sizeof(SQL));
    if (NULL == sqlist)
    {
        printf("顺序表创建失败!");
        return NULL;
    }
    sqlist->size = 0;
    sqlist->memory = (struct Node*)malloc(sizeof(struct Node) * MAX);
    return sqlist;
}

5.顺序表的扩容

//这里直接采用扩大两倍内存的方式
void reallocMemeory(LPSQL sqlist, int curSize, int newSize)
{
    int max = curSize > newSize ? curSize : newSize;
    (struct Data*)realloc(sqlist->memory, sizeof(struct Node) * max);
}

6.顺序表的数据插入

//插入,我们采用直接插入到表尾,然后(根据准则)移动元素
//采用准则升序排序
void insertData(LPSQL sqlist, struct Node data)
{
    if (sqlist->size == MAX)
    {
        reallocMemeory(sqlist, MAX, MAX * 2);
        printf("顺序表已扩容\n");
    }
    //直接插在表尾
    sqlist->memory[sqlist->size] = data;
    //调整位置
    for (int i = sqlist->size; i > 0; i--)   //注意此处下标越界问题
    {
        if (sqlist->memory[i - 1].index > sqlist->memory[i].index)
        {
            struct Node temp = sqlist->memory[i - 1];
            sqlist->memory[i - 1] = sqlist->memory[i];
            sqlist->memory[i] = temp;
        }
        else
        {
            break;
        }
    }
    sqlist->size++;
}

7.顺序表的数据删除

void deleteListData(LPSQL sqlist, int index)
{
    //找到位置  删除  移动后面的元素
    int pos = -1;
    for (int i = 0; i < sqlist->size; i++)
    {
        if (sqlist->memory[i].index == index)
        {
            pos = i;
            break;
        }
    }if (pos == -1)
    {
        printf("顺序表之中没有该元素!");
        return;
    }
    else  //移动元素
    {
        for (int i = pos; i < sqlist->size; i++)
        {
            sqlist->memory[i] = sqlist->memory[i + 1];
        }
    }
    sqlist->size--;
}

8.顺序表的遍历

void traverseList(LPSQL sqlist)
{
    for (int i = 0; i < sqlist->size; i++)
    {
        printf("index: %d\tDATA:%d\n", (sqlist->memory[i]).index,
            (sqlist->memory + i)->data);
    }
    printf("\n");
}

9.顺序表的销毁

//这里因为需要改变指针的指向,因此需要传入二级指针
void deleteList(LPSQL* psqlist)
{
    free(*psqlist);
    printf("销毁成功\n");
}

总体代码

#include<stdio.h>
#include<stdlib.h>   //system()函数头文件
#define MAX 2       //定义一个初始长度

//定义数据类型  这儿我们使用int
typedef int DATA;   
//构建准则 (构建顺序表以何种顺序排列)
struct Node
{
    int index;
    DATA data;
};
//定义顺序表结构
typedef struct seqList
{
    int size;     //当前顺序表长度
    struct Node* memory;   //存储顺序表数据的内存
}SQL,*LPSQL;
//创建顺序表
LPSQL createSeqList()
{
    LPSQL sqlist = (LPSQL)malloc(sizeof(SQL));
    if (NULL == sqlist)
    {
        printf("顺序表创建失败!");
        return NULL;
    }
    sqlist->size = 0;
    sqlist->memory = (struct Node*)malloc(sizeof(struct Node) * MAX);
    return sqlist;
}
//顺序表扩容
void reallocMemeory(LPSQL sqlist, int curSize, int newSize)
{
    int max = curSize > newSize ? curSize : newSize;
    (struct Data*)realloc(sqlist->memory, sizeof(struct Node) * max);
}
//数据插入
void insertData(LPSQL sqlist, struct Node data)
{
    if (sqlist->size == MAX)
    {
        reallocMemeory(sqlist, MAX, MAX * 2);
        printf("顺序表已扩容\n");
    }
    //直接插在表尾
    sqlist->memory[sqlist->size] = data;
    //调整位置
    for (int i = sqlist->size; i > 0; i--)   //注意此处下标越界问题
    {
        if (sqlist->memory[i - 1].index > sqlist->memory[i].index)
        {
            struct Node temp = sqlist->memory[i - 1];
            sqlist->memory[i - 1] = sqlist->memory[i];
            sqlist->memory[i] = temp;
        }
        else
        {
            break;
        }
    }
    sqlist->size++;
}
//数据删除
void deleteListData(LPSQL sqlist, int index)
{
    //找到位置  删除  移动后面的元素
    int pos = -1;
    for (int i = 0; i < sqlist->size; i++)
    {
        if (sqlist->memory[i].index == index)
        {
            pos = i;
            break;
        }
    }if (pos == -1)
    {
        printf("顺序表之中没有该元素!");
        return;
    }
    else  //移动元素
    {
        for (int i = pos; i < sqlist->size; i++)
        {
            sqlist->memory[i] = sqlist->memory[i + 1];
        }
    }
    sqlist->size--;
}
//顺序表遍历
void traverseList(LPSQL sqlist)
{
    for (int i = 0; i < sqlist->size; i++)
    {
        printf("index: %d\tDATA:%d\n", (sqlist->memory[i]).index,
            (sqlist->memory + i)->data);
    }
    printf("\n");
}
//销毁顺序表
void deleteList(LPSQL* psqlist)
{
    free(*psqlist);
    *psqlist = NULL;
    if (NULL == psqlist)
    printf("销毁成功\n");
}
int main()
{
    //创建顺序表
    LPSQL seqList = createSeqList();
    struct Node data[8] = { {2,522},{8,528},{1,521},{3,523},
                       {5,525},{7,527},{4,524},{6,526} };
    //数据插入
    for (int i = 0; i < 8; i++)
    {
        insertData(seqList,data[i]);
    }
    //打印数据
    traverseList(seqList);
    //数据删除
    deleteListData(seqList, 3);
    //打印数据
    traverseList(seqList);
    //销毁顺序表
    deleteList(&seqList);

    system("pause");
    return 0;
}

10.输出结果
在这里插入图片描述
到此就结束了-------------------------->

相关文章
|
27天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
3天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
372 16
|
19天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
6天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
21天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
23天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2594 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
5天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
182 2
|
3天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
105 65
|
7天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
332 2
|
23天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1580 17
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码