C++实现线性表顺序存储的示例代码

 更新时间:2023年03月02日 09:03:03   作者:NDX  
这篇文章主要为大家详细介绍了C++实现线性表顺序存储的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下

我学习顺序表时找不到相关的代码,以及我不清楚写一个线性表需要的知识,当我写出来可以使用的线性表我就把这些内容贴了出来。

前置知识点:结构体,常量指针

顺序表的特点:

  • 需要一片连续的存储空间
  •  逻辑上相连的数据的存储位置也是相邻的。

所以如果我们想要创建一个顺序表我们需要做两件事:

  • 向系统申请一片空间供数组使用。
  • 创建一个指针记录空间地址。

而删除顺序表就是把空间释放,并让指针指向空。

顺序表的创建和销毁:

#include<iostream>
#include<cstdlib>
#define EleType int//方便日后使用
#define Maxsize 1000
using namespace std;

//定义结构体
struct sql{
    int* elem;
    int len;//防止越界访问
};


//初始化
void InitList(sql &l)
{
    l.elem=new int [Maxsize];
    if(!l.elem) cout<<"申请空间失败"<<endl;
    l.len=0;
}

//销毁线性表
void DestroyList(sql &l)
{
    delete [] l.elem;
    l.elem=nullptr;
}

int main()
{
    sql l;
    InitList(l);
    return 0;

}

数据的插入和删除:

因为在顺序存储所有的数据的存储地址是连续的,所以在插入和删除数据时你需要改变后续的所有数据的位置。在插入时把后面的数据往后挪,删除时把数据向前挪。

void adds(sql &l,EleType target,int sit)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;//插入位置错误
        exit(0);
    }
    if(l.len+1>Maxsize)
    {
        cout<<"Too many"<<endl;//存储空间已满
        exit(0);
    }
    //把后面的数据往后挪
    for(int i=l.len-1;i>=sit-1;i--)
    {
        l.elem[i+1]=l.elem[i];
    }
    l.elem[sit-1]=target;
    l.len++;//更新表长
}

//删除元素
void DeletElem(sql &l,int sit)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;
        exit(0);
    }
    for(int i=sit-1;i<l.len;i++)
    {
        l.elem[i]=l.elem[i+1];
    }
    l.len--;//更新表长
}

其他操作:

查找和更改:

//查找
int finding(sql l,EleType target)
{
    for(int i=0;i<l.len;i++)
    {
        if(l.elem[i]==target) return i+1;
    }
    return 0;
}

//更改
void Changing(sql& l,int sit,EleType target)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;
        exit(0);
    }
    l.elem[sit-1]=target;
}

清空、获取长度、判断是否为空:

//清空线性表
void ClearLine(sql &l)
{
    l.len=0;
}

//获取线性表的长度
int Getlen(sql l)
{
    return l.len;
}

//判断线性表是否为空
bool IsEmpty(sql l)
{
    if(l.len==0) return true;
    return false;
}

完整代码

#include<iostream>
#include<cstdlib>
#define Maxsize 1000
#define EleType int//方便日后使用
using namespace std;

//创建结构体
struct sql{
    EleType* elem;//创建一个指针
    int len;
};

//初始化
void InitList(sql &l)
{
   
    l.elem=new EleType [Maxsize];
    if(!l.elem) cout<<"申请空间失败"<<endl;
    l.len=0;
}


//输出
void print(sql l)
{
    for(int i=0;i<l.len;i++)
    {
        cout<<l.elem[i]<<" ";
    }
    cout<<endl;
}

//插入
void adds(sql &l,EleType target,int sit)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;
        exit(0);
    }
    if(l.len+1>Maxsize)
    {
        cout<<"Too many"<<endl;
        exit(0);
    }
    for(int i=l.len-1;i>=sit-1;i--)
    {
        l.elem[i+1]=l.elem[i];
    }
    l.elem[sit-1]=target;
    l.len++;
}

//删除元素
void DeletElem(sql &l,int sit)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;
        exit(0);
    }
    for(int i=sit-1;i<l.len;i++)
    {
        l.elem[i]=l.elem[i+1];
    }
    l.len--;
}

//销毁线性表
void DestroyList(sql &l)
{
    delete [] l.elem;
}

//清空线性表
void ClearLine(sql &l)
{
    l.len=0;
}

//获取线性表的长度
int Getlen(sql l)
{
    return l.len;
}

//判断线性表是否为空
bool IsEmpty(sql l)
{
    if(l.len==0) return true;
    return false;
}

//查找
int finding(sql l,EleType target)
{
    for(int i=0;i<l.len;i++)
    {
        if(l.elem[i]==target) return i+1;
    }
    return 0;
}

//更改
void Changing(sql& l,int sit,EleType target)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;
        exit(0);
    }
    l.elem[sit-1]=target;
}

int main()
{
    sql l;
    InitList(l);
    EleType j=0;
    for(int i=1;i<10;i++,j++)
        adds(l,j,i);
    DeletElem(l,2);
    print(l);
    return 0;

}

到此这篇关于C++实现线性表顺序存储的示例代码的文章就介绍到这了,更多相关C++线性表顺序存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VSCode之CMake使用小结

    VSCode之CMake使用小结

    本文主要介绍了VSCode之CMake使用小结,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • c++只保留float型的小数点后两位问题

    c++只保留float型的小数点后两位问题

    这篇文章主要介绍了c++只保留float型的小数点后两位问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • OJ中G++和C++的区别

    OJ中G++和C++的区别

    今天小编就为大家分享一篇关于OJ中G++和C++的区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • C++中浮点类型的具体使用

    C++中浮点类型的具体使用

    C++提供了不同精度的浮点类型,主要有 float、double 和 long double,这些浮点类型具有不同的字节大小和范围,用于满足不同应用场景的精度要求,本文主要介绍了C++中浮点类型的具体使用,感兴趣的可以了解一下
    2023-08-08
  • VisualStudio类文件的管理(类文件的分离)的实现

    VisualStudio类文件的管理(类文件的分离)的实现

    在使用 Visual Studio 开发项目的时候,学会进行“类文件的分离”十分重要,本文主要介绍了VisualStudio类文件的管理(类文件的分离)的实现,感兴趣的可以了解一下
    2024-03-03
  • c++ typeid关键字的使用

    c++ typeid关键字的使用

    这篇文章主要介绍了c++ typeid关键字的使用,帮助大家更好的理解和使用c++,感兴趣的朋友可以了解下
    2020-11-11
  • C语言求解最长公共子字符串问题及相关的算法分析

    C语言求解最长公共子字符串问题及相关的算法分析

    最长公共子字符串问题即是求一个字符串在另一个字符串中出现的连续最多字符,这里我们来看一下面试中经常出现的C语言求解最长公共子字符串问题及相关的算法分析
    2016-06-06
  • C语言顺序表的基本结构与实现思路详解

    C语言顺序表的基本结构与实现思路详解

    顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。本文将通过示例为大家讲解一下顺序表的基本操作,需要的可以参考一下
    2023-02-02
  • c语言中assert断言用法实例详解

    c语言中assert断言用法实例详解

    断言是C语言中一种用于检查程序中假设语句正确性的方法,通过使用断言,开发人员可以在程序中插入一些条件,以确保程序的执行满足特定的预期,这篇文章主要给大家介绍了关于c语言中assert断言用法的相关资料,需要的朋友可以参考下
    2024-02-02
  • C++访问std::variant类型数据的几种方式小结

    C++访问std::variant类型数据的几种方式小结

    std::variant是 C++17中引入的一个新的类模板,提供了一种存储不同类型的值的方式,本文主要介绍了C++访问std::variant类型数据的几种方式小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02

最新评论