线性表(顺序表)——顺序表的定义、基本操作

一、顺序表的定义:(静态、动态分配内存)

#include<iostream>
using namespace std;
/**
静态分配存储空间
*/
//#define MaxSize 10//定义最大存储空间大小
//
//typedef struct
//{
//    int data[MaxSize];
//    int length;//定义线性表中当前的长度
//}SqList;//顺序表类型的定义(相当于一个新的数据类型)
基本操作——初始化线性表
//void InitList(SqList &L)
//{
//    for(int i=0;i<MaxSize;i++)
//        L.data[i]=0;//将所有数据元素设置为默认值
//        /**如果没有这个循环,初始化表的数据值可能不为默认值,
//        这是由于内存可能有遗留的“垃圾数据”。
//        这个for循环可要可不要,因为在真正的数据操作中,要处理的数据元素
//        会覆盖掉里边的所谓的“垃圾数据”
//        */
//    L.length=0;//顺序表的初始长度为0
//}
/**
动态分配存储空间
*/
#define InitSize 10//默认最大长度
typedef struct
{
    int *data;//指示动态分配数组的指针
    int Maxsize;//顺序表的最大容量
    int length;//顺序表的当前长度
}SeqList;
//基本操作——初始化表
void InitSqList(SeqList &L)
{
    //用malloc函数动态申请连续的存储空间
    L.data=(int *)malloc(sizeof(int)*InitSize);

    L.length=0;
    L.Maxsize=InitSize;
}
//增加动态数组的长度realloc()函数也可以实现此操作
//void IncreaseSize(SeqList &L,int len)
//{
//    int *p=L.data;
//    L.data=(int *)malloc(L.Maxsize+len*sizeof(int));
//    for(int i=0;i<L.length;i++)
//        L.data[i]=p[i];
//    L.Maxsize+=len;
//    free(p);
//}
int GetElem(SeqList L,int i)//获取第i个元素
{
    return L.data[i-1];
}
int main()
{
    SeqList L;
    InitSqList(L);
    cout<<"初始化顺序表默认最大长度为10,我们设置要存的元素个数n为:";
    int n;
    cin>>n;
    cout<<"输入要存的这n个元素:"<<endl;
    for(int i=0;i<n;i++)
    {
        cin>>L.data[i];
        L.length++;
    }
    cout<<"获取第3个元素的值:"<<GetElem(L,3)<<endl;
    return 0;
}

注:下边的代码中一些含参函数有“&”的运用,如果有读者不理解其作用可以先看看C语言和c++中的引用调用
二、顺序表的基本操作:

#include<iostream>
#define Initsize 10
using namespace std;

typedef struct
{
    int *data;
    int length;
    int Maxsize;
}SqList;
//初始化顺序表
void InitList(SqList &L)
{
    L.data=(int *)malloc(Initsize*sizeof(int));
    L.Maxsize=Initsize;
    for(int i=0;i<L.Maxsize;i++)
        L.data[i]=0;
    L.length=0;
}
//插入元素
bool InsertList(SqList &L,int pos,int elem)
{
    if(pos<1||pos>L.length)//判断pos的范围是否合法
    return false;
    if(L.length>=Initsize)//若存储空间已经满了,也不能插入元素
    return false;
    /*插入元素时,将插入位置往后的元素(包括自身)往后移动
     *并且注意得总后边开始往后边挪动,防止元素被覆盖
     */
    for(int j=L.length-1;j>=pos-1;j--)
        L.data[j+1]=L.data[j];
    L.data[pos-1]=elem;
    L.length++;
    return true;
}
//删除元素
bool DeleteList(SqList &L,int pos,int &e)//删除pos-1位置上的元素,并用e返回删除元素的值
{
    if(pos<1||pos>L.length)
        return false;
    /*接下来开始进行删除操作
     *用e记录删除元素的值
     *并将删除位置后边的元素往前移动(注意这次移动是从前开始)
     */
     e=L.data[pos-1];
     for(int i=pos-1;i<L.length-1;i++)
        L.data[i]=L.data[i+1];
     L.length--;
     return true;
}
//按位查找
int GetElem(SqList L,int pos)
{
    return L.data[pos-1];
}
//按值查找
int LocateElem(SqList L,int elem)
{
    bool flag=false;
    for(int i=0;i<L.length;i++)
    {
        if(L.data[i]==elem)
        {
            flag=true;
            return i+1;
        }
    }
    if(flag==false)
        return -1;
}
int main()
{
    int n;
    cin>>n;
    SqList sq;
    InitList(sq);//申请内存
    for(int i=0;i<n;i++)
    {
        cin>>sq.data[i];
        sq.length++;
    }
    for(int i=0;i<sq.length;i++)
        cout<<"顺序表中的第"<<i+1<<"个元素的值为:"<<sq.data[i]<<endl;
    cout<<"获取第2个元素值为:"<<GetElem(sq,2)<<endl;
    cout<<"获取值为5的元素的位置:"<<LocateElem(sq,5)<<endl;
    cout<<"在第3个位置处插入元素5,新的顺序表为:"<<endl;
    InsertList(sq,3,5);
    for(int i=0;i<sq.length;i++)
        cout<<"顺序表中的第"<<i+1<<"个元素的值为:"<<sq.data[i]<<endl;
    int x;
    DeleteList(sq,3,x);
    cout<<"删除第3个元素,删除的元素值为:"<<x<<endl;
    cout<<"删除第3个元素,新的顺序表为:"<<endl;
    for(int i=0;i<sq.length;i++)
        cout<<"顺序表中的第"<<i+1<<"个元素的值为:"<<sq.data[i]<<endl;
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值