增序顺序储存线性表的基本操作

本文实现了顺序储存结构线性表的基本操作,可能存在一些bug。

算法分析

顺序表的初始化

算法步骤

1、将长度初始化为零
2、设置一个默认的大小,用于实现动态扩充
3、动态分配一块内存

顺序表的取值

算法步骤

1、判断位置是否正确
2、若正确返回RIGHT,注意,数组的下标是从0开始的

时间复杂度

由于是直接取值,所以是时间复杂度为O(1)。

顺序表的查找

遍历数组,若找到返回位置,否则为ERROR

时间复杂度

时间主要耗费在元素的比较上,设pi为查找第i个元素的概率,Ci为找到第i个数据元素时已经比较过的次数,则平均查找长度为pi*Ci
假设每个元素的查找概率相等,则pi=1/n
则平均查找长度为∑PiCi (i=1,2,3,…,n)=(n+1)/2
所以平均复杂度为O(2)

顺序表的插入

1、判断位置是否合法
2、将长度加一
3、若长度大于该顺序表的大小,则重新申请一块内存,大小为原顺序表的两倍,将原顺序表拷贝到新的顺序表中
4、将插入位置的元素依次向后移动一位
5、在插入位置插入元素

时间复杂度

E=∑pi*(n-i+1)(i=1->n+1)
pi为在第i个元素之前插入的概率,n-i+1为需要移动的元素个数
假设在任何位置插入元素的概率相等,则pi=1/(n+1)
则E=1/(n+1)*∑(n-i+1)(i=1->n+1)=n/2
所以平均复杂度为O(n)

顺序表的删除

1、判断位置是否合法
2、将删除位置的元素以此向前移动
3、长度减一

时间复杂度

E=∑pi*(n-i)
pi为在第i个元素之前插入的概率,n-i为需要移动的元素个数
假设在任何位置插入元素的概率相等,则pi=1/n
则E=1/n*∑(n-i)(i=1->n+1)=(n-1)/2
所以平均复杂度为O(n)

顺序表的追加

1、长度加一
2、若长度大于该顺序表的大小,则重新申请一块内存,大小为原顺序表的两倍,将原顺序表拷贝到新的顺序表中
3、在尾部添加一个元素

C++实现

#include <iostream>
#include <cstdlib>
#define FSIZE 5

using namespace std;
class MyList
{
private:
    int *a;
    int size;
    int length;
public:
    MyList();
    MyList(int);
    ~MyList();
    //添加一个元素进入顺序表并以升序进行排列
    bool Add(int e);
    //删除某一个元素
    bool Delete(int p);
    //查找某一个元素,若成功返回true,并将值储存到p中,否则返回false
    bool Find(int e,int &p);
    //判断是否为空
    bool isEmpty();
    //获取长度
    int GetLength();
    //获取下标为e-1的元素并放到p中
    bool GetItem(int e, int &p);

};

void Show(MyList &l)
{
    for(int i=0;i<l.GetLength();i++)
    {
        int p;
        if(l.GetItem(i,p))
            cout << p << endl;
    }
}

int main()
{
    MyList l;
    for(int i=0;i<99;i++)
    {
        l.Add(rand()%100);
    }
    cout << "=====输出测试1======" << endl;
    Show(l);
    cout << endl;
    for(int i=0;i<12;i++)
    {
        int p;
        if(l.GetItem(i,p))
            cout << p << endl;
    }

    return 0;
}


//===========================================
MyList::MyList()
{
    size=FSIZE;
    a=new int[size];
    length=0;
}
MyList::MyList(int l)
{
    length=l;
    size=l*2;
    a=new int[size];
}

MyList::~MyList()
{
    delete []a;
}

bool MyList::Add(int e)
{
    int *temp;
    length++;
    if(length>=size)
    {
        size=length*2;
        temp=new int[size];
        for(int i=0;i<length-1;i++)
            temp[i]=a[i];
        delete []a;
        a=temp;
    }
    a[length-1]=e;
    for(int i=length-1;i>0&&a[i]<a[i-1];i--)
    {
        int t=a[i];
        a[i]=a[i-1];
        a[i-1]=t;
    }
    return true;
}

bool MyList::Delete(int p)
{
    if(isEmpty())
    {
        cout << "The List is empty" << endl;
        return false;
    }
    else
    {
        for(int i=p;i<length-1;i++)
        {
            a[i]=a[i+1];
        }
        --length;
        return true;
    }
}

bool MyList::isEmpty()
{
    return length==0;
}

bool MyList::Find(int e,int &p)
{
    for(int i=0;i<length;i++)
    {
        if(a[i]==e)
        {
            p=i+1;
            return true;
        }
    }
    return false;
}

bool MyList::GetItem(int e,int &p)
{
    if(e<0||e>length-1)
    {
        cout << "Wrong Input" << endl;
        return false;
    }
    else
    {
        p=a[e];
        return true;
    }
}

int MyList::GetLength()
{
    return length;
}

申请内存与释放内存的正确打开方式

int *a;
a=new int[10];//a=new int(10)错误
delete []a;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值