首页 > 编程语言 >线性表的顺序存储C++代码

线性表的顺序存储C++代码

时间:2023-03-01 19:11:39浏览次数:53  
标签:线性表 sit int elem len C++ sql 顺序存储

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

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

顺序表的特点:

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

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

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

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

顺序表的创建和销毁:

#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;

}


标签:线性表,sit,int,elem,len,C++,sql,顺序存储
From: https://www.cnblogs.com/ndx2004/p/17169371.html

相关文章

  • C++--抽象数据类型
              ......
  • 「面试记录」2.28阿里云一面 C++
    自我介绍项目相关RAFT协议选举流程C++中的new和malloc的区别a.如果说new的时候内存不够了,操作系统会做什么操作引用和指针有什么区别虚函数如何实现多态......
  • 编译PHP 7.3扩展引入自定义的C++库
    这里以mac为例,linux环境也是类似的。这里只是粗略的修改及编译过程,不会有太多详细过程。在https://www.php.net/downloads或者https://github.com/php/php-src/releases下......
  • 排序算法(C++实现)
    1、排序算法总结时间复杂度空间复杂度稳定性原地排序直接插入排序O(n2)O(1)√√折半插入排序O(n2)O(1)√√希尔排序最坏O(n2)O(1)×√......
  • visual studio C++调试出现 无法启动....... 拒绝访问
    Visualstudio 调试C++控制台程序,出现无法启动。。。拒绝访问原因竟然是360安全卫士导致的,关闭后就可以启动了......
  • C++for循环新用法
    1、拷贝range的元素时,使用for(autox:range).2、修改range的元素时,使用for(auto&x:range).3、只读range的元素时,使用for(constauto&x:range).#include<iost......
  • C++刷题笔记
    初始化string数组stringnumbers[12]={{"1"},{"2"},{"10"},{"11"},{"23"},{"25"},{"31"},{"36"},{"37"},{"102"},{"325"},{"438"}};填充for(in......
  • C++substr()函数
    C++中substr函数有三种用法,如下所示:假设strings(“student12”);stringx=s.substr()//默认时的长度为从开始位置到尾stringy=s.substr(5)......
  • C++string大小写转换
    #include<iostream>#include<string>#include<algorithm>usingnamespacestd;intmain(){stringstr="ancdANDG";cout<<"转换前的字符串:"<<str......
  • C++里的memset
    memset函数是内存赋值函数,用来给某一块内存空间进行赋值的;包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化;原型为:void*memset(void*s,intv,......