C/C++数据结构---顺序表---线性存储结构

这篇具有很好参考价值的文章主要介绍了C/C++数据结构---顺序表---线性存储结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人主页:

仍有未知等待探索_小项目,洛谷刷题,数据结构-CSDN博客

专题分栏---数据结构:

数据结构_仍有未知等待探索的博客-CSDN博客

目录

一、知识储备

二、引例

 三、顺序表

第一步,先创建一个顺序表类型

第二步,定义和初始化顺序表  

 第三步,顺序表的基本操作

1.插入(增)

2.删

3.取

4.查

5.计算链表长度

四、 完整的顺序表


一、知识储备

        我们之前学的高级语言,比如C语言,JAVA语言,讲的是一些语法,顺序结构,选择结构,循环结构,还有怎么通过那三个结构和语法写出代码来解决一些问题。

        而现在,数据结构是在研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。

        数据结构可以大概分为3大类:线性表,树,图。而这三大类基本上都有顺序存储结构和链式存储结构。而这篇文章主要是关于线性表中的顺序表的顺序存储结构

二、引例

顺序表的顺序存储结构是指将线性表的所有数据元素,按其逻辑顺序依次存储在一组连续的内存单元中,用这种存储形式存储的线性表成为顺序表。其特点是逻辑关系相邻的两个数据元素在物理位置上也相邻

学生信息表

学号 姓名 成绩 1 2022123 张三 90 2 2022124 李四 95 3 2022125 王五 85

就像上述的学生信息表一样,要是让你的话如何存储这个表格呢?是不是在一个描述人的结构体里面直接存储这些信息,然后定义一个结构体数组来进行存储呢?

struct student
{
    int num;//学号
    char name[20];//姓名
    int score;//成绩
};
#define MAX 3
struct student s[MAX];
for(int i=0;i<MAX;i++)
{
    scanf("%d",&s[i].num);
    char name[20];
    scanf("%s",name);
    strcpy(s[i].name,name);
    scanf("%d",&s[i].score);
}

是否会像如上一样储存呢?

 三、顺序表

第一步,先创建一个顺序表类型

#define MAX 100
typedef struct
{
    int num;
    char name[20];
    int score;
}elemtype;
typedef struct LNode
{
    elemtype data[MAX];
    int last;
}List;

        大家应该都知道define定义了一个常量MAX,让其值为100。然后,在接下来中所有出现的100,均用MAX代替,这样要是想修改数字(扩大数组)的话,直接在define中定义上改就行,避免了繁琐的修改数据的步骤。

        typedef是一个重命名的关键词,可以给数据类型重新命名。

        在顺序表结构体的定义时,把里面的数组也定义为一个结构体类型,把所需要的数据类型全放在里面。

第二步,定义和初始化顺序表  

List* ListInit()
{
    List* L;
    L = (List*)malloc(sizeof(List));
    L->last = -1;
    return L;
}

C/C++数据结构---顺序表---线性存储结构,数据结构,数据结构,c语言

 把L->last赋值为-1,当输入数据的时候再让L->last++,这个L->last其实存的是数组中最后一个元素的下标。表长为0 的时候,其值为-1。

 第三步,顺序表的基本操作

1.插入(增)

在初始化完的空顺序表中依次添加数据的操作。

要注意顺序表的填入数据要连续存入,不能隔一个存一个。

List* ListInsert(List* L)
{
    int P;//插入的位置,从0开始
    //插入的元素
    int num, score;
    char name[20];
    scanf("%d%d", &P, &num);
    scanf("%s", name);
    scanf("%d", &score);
        if (P<0 || P>L->last+1)//大于L->last+1是因为,数据可以插在顺序表的最后一个元素的后面
        {
            printf("坐标非法\n");
        }
        else
        {
            for (int i = L->last; i >= P; i--)
            {
                L->data[i + 1].num = L->data[i].num;
                L->data[i + 1].score = L->data[i].score;
                strcpy(L->data[i + 1].name, L->data[i].name);
            }
            L->data[P].num = num;
            L->data[P].score = score;
            strcpy(L->data[P].name, name);
            L->last++;
        }
}
if (P<0 || P>L->last+1)//大于L->last+1是因为,数据可以插在顺序表的最后一个元素的后面 

这条语句就是为了让我们的数据是连续存储的。P<0的时候,坐标非法;P>L->last+1是为了让插入数据与原来的顺序表相连。

2.删

删除,是删除指定位置上的数据。

List* Listdelete(List* L)
{
    int P;//删除位置,从0开始
    scanf("%d", &P);
    if (L->last == -1)
    {
        printf("顺序表为空,无法删除\n");
    }
    else
    {
        if (P<0 || P>L->last)
            printf("坐标非法\n");
        else
        {
            for (int i = P; i < L->last; i++)
            {
                L->data[i].num = L->data[i + 1].num;
                L->data[i].score = L->data[i + 1].score;
                strcpy(L->data[i].name, L->data[i + 1].name);
            }
            L->last--;
        }
    }
    return L;
}

3.取

取指定位置上的元素

int ListGet(List* L)
{
    int P;//取指定位置,从0开始
    scanf("%d", &P);
    if (P<0 || P>L->last)
    {
        printf("坐标非法\n");
        return -1;
    }
    else
    {
        return P;
    }
    
}

4.查

查找顺序表中是否有某个元素,找到返回下标,否则返回-1

int ListSearch(List* L)
{
    int X;//查找的数据
    scanf("%d", &X);
    for (int i = 0; i <= L->last; i++)
    {
        if (X == L->data[i].num)
            return i;
    }
    return -1;
}

5.计算链表长度

通过L->last存的是最后元素的下标来计算。

int ListLength(List* L)
{
    return L->last + 1;
}

四、 完整的顺序表

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 5
typedef struct
{
    int num;
    char name[20];
    int score;
}elemtype;
typedef struct LNode
{
    elemtype data[MAX];
    int last;
}List;
List* ListInit();
List* ListInsert(List* L);
List* Listdelete(List* L);
int ListGet(List* L);
int ListSearch(List* L);
int ListLength(List* L);
int main()
{
    List* L;
    L = ListInit();
    int n;//插入数据的个数
    scanf("%d", &n);
    while (n--)
    {
        L = ListInsert(L);
        if (L->last == MAX - 1)
        {
            printf("顺序表已满,无法插入数据\n");
            break;
        }
    }
    L = Listdelete(L);
    int s=ListGet(L);
    if (s != -1)
    {
        printf("%d %s %d\n", L->data[s].num, L->data[s].name, L->data[s].score);
    }
    int s=ListSearch(L);
    if (s != -1)
    {
        printf("找到了,下标为%d\n", s);
    }
    else
    {
        printf("未找到\n");
    }
    int len=ListLength(L);
    printf("%d", len);
	return 0;
}
List* ListInit()
{
    List* L;
    L = (List*)malloc(sizeof(List));
    L->last = -1;
    return L;
}
List* ListInsert(List* L)
{
    int P;//插入的位置
    //插入的元素
    int num, score;
    char name[20];
    scanf("%d%d", &P, &num);
    scanf("%s", name);
    scanf("%d", &score);
    if (P<0 || P>L->last+1)//大于L->last+1是因为,数据可以插在顺序表的最后一个元素的后面
    {
        printf("坐标非法\n");
    }
    else
    {
        for (int i = L->last; i >= P; i--)
        {
            L->data[i + 1].num = L->data[i].num;
            L->data[i + 1].score = L->data[i].score;
            strcpy(L->data[i + 1].name, L->data[i].name);
        }
        L->data[P].num = num;
        L->data[P].score = score;
        strcpy(L->data[P].name, name);
        L->last++;
    }
    return L;
}
List* Listdelete(List* L)
{
    int P;//删除位置
    scanf("%d", &P);
    if (L->last == -1)
    {
        printf("顺序表为空,无法删除\n");
    }
    else
    {
        if (P<0 || P>L->last)
            printf("坐标非法\n");
        else
        {
            for (int i = P; i < L->last; i++)
            {
                L->data[i].num = L->data[i + 1].num;
                L->data[i].score = L->data[i + 1].score;
                strcpy(L->data[i].name, L->data[i + 1].name);
            }
            L->last--;
        }
    }
    return L;
}
int ListGet(List* L)
{
    int P;//取指定位置
    scanf("%d", &P);
    if (P<0 || P>L->last)
    {
        printf("坐标非法\n");
        return -1;
    }
    else
    {
        return P;
    }
    
}
int ListSearch(List* L)
{
    int X;//查找的数据
    scanf("%d", &X);
    for (int i = 0; i <= L->last; i++)
    {
        if (X == L->data[i].num)
            return i;
    }
    return -1;
}
int ListLength(List* L)
{
    return L->last + 1;
}

谢谢各位的支持!!共勉!文章来源地址https://www.toymoban.com/news/detail-712604.html

到了这里,关于C/C++数据结构---顺序表---线性存储结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】线性表(顺序存储和链式存储)两种方法,细节满满,保你学会

    ⭐⭐⭐⭐⭐⭐ 🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【勋章】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 ⭐⭐⭐⭐⭐⭐  目录 ⭐定义:  ⭐ 理解: ⭐存储方式 : ⭐顺序存储的优缺点: 优点: 缺点: ⭐链式存储的优

    2023年04月09日
    浏览(39)
  • C语言数据结构(2)——线性表其一(顺序表)

    欢迎来到博主的新专栏——C语言数据结构 博主ID:代码小豪 再开始这篇文章之前,我们假设要对10个数据进行操作。这十个数据全都被声明成10个变量 如果我们准备为这些数据增加功能,将他们进行赋值,打印,交换等。就会发现一个特别棘手的问题,这些程序写起来太繁杂

    2024年01月19日
    浏览(40)
  • 【数据结构初阶】二、 线性表里的顺序表(C语言实现顺序表)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】一. 复杂度讲解_高高的胖子的博客-CSDN博客  =======================================

    2024年02月08日
    浏览(43)
  • 【数据结构】详谈队列的顺序存储及C语言实现

    大家好,很高兴又和大家见面啦!!! 在上一篇内容中,我们在介绍完队列的基本概念、重要术语以及基本操作后,又回顾了一下数据结构的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。 队列这种数据结构我们已经介绍了它的逻辑结构以及数据运算的定义

    2024年01月21日
    浏览(73)
  • 【数据结构初阶】五、线性表中的栈(C语言 -- 顺序表实现栈)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】四、线性表里的链表(带头+双向+循环 链表 -- C语言实现)_高高的胖子的博客

    2024年02月08日
    浏览(44)
  • 数据结构入门(C语言版)线性表中顺序表介绍及接口实现

    C语言的学习结束,就该入门数据结构了呦 不论在程序员的工作上,还是在学习或是考研上,数据结构都是一门非常重要且值得我们一直研究探索的学科,可以说数据结构和算法就是编程的核心。OK,接下来我们来到数据结构的入门第一步就是学习线性表,接下来由作者来详细

    2023年04月12日
    浏览(48)
  • 【数据结构初阶】七、非线性表里的二叉树(堆的实现 -- C语言顺序结构)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】六、线性表中的队列(链式结构实现队列)-CSDN博客  ===========================

    2024年02月08日
    浏览(44)
  • 头歌(C语言)-数据结构与算法-队列-第1关:实现一个顺序存储的队列

    任务描述 相关知识 顺序存储的队列 顺序队列的主要操作 编程要求 测试说明 任务描述 本关任务:实现 step1/SeqQueue.cpp 中的 SQ_IsEmpty 、 SQ_IsFull 、 SQ_Length 、 SQ_In 和 SQ_Out 五个操作函数,以实现判断队列是否为空、是否为满、求队列长度、队列元素入队和出队等功能。 相关知

    2024年02月06日
    浏览(161)
  • 头歌(C语言)-数据结构与算法-栈的实现-第1关:实现一个顺序存储的栈

    任务描述 相关知识 栈的基本概念 栈结构的定义(C) 顺序栈的操作 编程要求 测试说明 任务描述 本关任务是实现 step1/SeqStack.cpp 中的 SS_IsFull 、 SS_IsEmpty 、 SS_Length 、 SS_Push 和 SS_Pop 五个操作函数,以实现判断栈是否为满、是否为空、求栈元素个数、进栈和出栈等功能。 相关

    2024年02月07日
    浏览(64)
  • [数据结构(C语言版本)上机实验]稀疏矩阵的三元组顺序表压缩存储以及转置实现(含快速转置)

    实现效果: 1、编写程序任意 输入 一个稀疏矩阵,用 三元组顺序表 压缩存储 稀疏矩阵 。 2、对稀疏矩阵进行 转置 , 输出 转置后的矩阵。 对应《数据结构(C语言版)》 第5章 数组与广义表 实验: 1、 掌握下三角矩阵的输入、输出、压缩存储算法; 2、 理解稀疏矩阵的三元

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包