线性表的顺序表示与实现

复习

大二下学期考完试小学期开始前没什么事做闲的无聊,刚好数据结构也有些忘了也筹划了很久写博客所以就乘着考试考完小学期还没开始的这段时间写一写大二上学过的数据结构自己也相当于重新复习一下。

由于当初学习的时候用的是严蔚敏老师的《数据结构》一书按照C语言写的,所以这次复习按照书的顺序用C++将数据结构再重新实现一遍。

顺序表

顾名思义就是用一组连续的地址依次存储线性表的数据元素话不多说直接上代码。

//SqList.h
#ifndef SQLIST_H
#define SQLIST_H

#include "SqList.h"
#include <iostream>
#include <stdlib.h>

using namespace std;

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2


//Status 是函数类型,其值是函数结果状态代码
typedef int Status;

template <class ElemType>
// 定义顺序表类

class SqList
{
public:
    SqList();   //创建一个大小为sz的顺序表
    SqList(const SqList& s);
    ~SqList();
    void ClearList_Sq();  //清空顺序表
    bool ListEmpty_Sq();  //顺序表是否为空
    int ListLength_Sq();
    Status GetElem_Sq(int i,ElemType& e); //获得第i个位置的元素
    //Status LocateElem_Sq(ElemType& e,bool(* compare)(ElemType)); //获取第一个满足compare()关系的元素
    Status PriorElem_Sq(ElemType e,ElemType& pre_e);  //获取元素e的前一个元素
    Status NextElem_Sq(ElemType e,ElemType& next_e);  //获取元素e的后一个元素
    Status ListInsert_Sq(int i,ElemType e);  //第i个位置之前插入元素e
    Status ListDelete_Sq(int i,ElemType& e); //删除第i个元素并返回元素的值
    void ListTraverse(); //遍历顺序表
private:
    ElemType *elem;
    int length;
    int listsize;
};

template <class ElemType>
SqList<ElemType>::SqList()
{
    elem=new ElemType[sizeof(ElemType)*LIST_INIT_SIZE];
    if(!elem) exit(OVERFLOW);
    length=0;
    listsize=LIST_INIT_SIZE;
}


template <class ElemType>
SqList<ElemType>::SqList(const SqList& s)
{
    elem=new ElemType[LIST_INIT_SIZE*sizeof(ElemType)];
    length=s.length;
    listsize=s.listsize;
}

template <class ElemType>
SqList<ElemType>::~SqList()
{
    delete[] elem;
    length=listsize=0;
}

template <class ElemType>
void SqList<ElemType>::ClearList_Sq()
{
    length=0;
}

template <class ElemType>
bool SqList<ElemType>::ListEmpty_Sq()
{
    if(length==0)
        return true;
    return false;
}

template <class ElemType>
int SqList<ElemType>::ListLength_Sq()
{
    return length;
}

template <class ElemType>
Status SqList<ElemType>::GetElem_Sq(int i,ElemType& e)
{
    if(i<=0||i>length)  return ERROR;
    e=elem[i-1];
    return OK;
}

template <class ElemType>
Status SqList<ElemType>::PriorElem_Sq(ElemType e,ElemType& pre_e)
{
    for(int i=0;i<length;i++)
    {
        if(elem[i]==e&&i!=0)
        {
            pre_e=elem[i-1];
            return OK;
        }
    }
    return ERROR;
}
template <class ElemType>
Status SqList<ElemType>::NextElem_Sq(ElemType e,ElemType& next_e)
{
    for(int i=0;i<length;i++)
    {
        if(elem[i]==e&&i!=length-1)
        {
            next_e=elem[i+1];
            return OK;
        }
    }
    return ERROR;
}
template <class ElemType>
Status SqList<ElemType>::ListInsert_Sq(int i,ElemType e)
{
    if(length>=listsize||i<=0||i>listsize)  //当顺序表已满 插入的位置不符合要求
        return ERROR;
    length++;
    for(int j=length;j>=i;j--)
        elem[j]=elem[j-1];
    elem[i-1]=e;
    return OK;
}
template <class ElemType>
Status SqList<ElemType>::ListDelete_Sq(int i,ElemType& e)
{
    if(i<=0||i>length||length==0) //顺序表为空 删除的位置不符合要求
        return ERROR;
    length--;
    e=elem[i-1];
    for(int j=i-1;j<length;j++)
    {
        elem[j]=elem[j+1];
    }
    return OK;
}
template <class ElemType>
void SqList<ElemType>::ListTraverse()
{
    for(int i=0;i<length;i++)
        cout<<elem[i]<<" ";
    cout<<endl;
}

#endif // SQLIST_H



//useSqList.cpp

#include "SqList.h"

int main()
{
    SqList<int> s;        //创建一个空表
    for(int i=1;i<=10;i++)
    {
        s.ListInsert_Sq(i,i);      //110个位置依次插入数字1-10
    }
    s.ListTraverse(); //遍历
    int e,pre,next;
    s.ListDelete_Sq(3,e);  //删除第三个位置
    cout<<e<<endl;
    s.ListTraverse();
    cout<<s.ListLength_Sq()<<endl; //顺序表的长度
    if(s.GetElem_Sq(5,e))
        cout<<e<<endl;
    if(s.PriorElem_Sq(e,pre))
        cout<<pre<<endl;
    if(s.NextElem_Sq(e,next))
        cout<<next<<endl;
    s.ClearList_Sq();  //清空
    cout<<s.ListLength_Sq()<<endl;
    if(s.ListEmpty_Sq())
        s.ListInsert_Sq(1,10);
    s.ListTraverse();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值