线性表的顺序表示与实现

复习

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

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

顺序表

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

//SqList.h
#ifndef SQLIST_H
#define SQLIST_H

#include "SqList.h"
#include 
#include 

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 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 
SqList::SqList()
{
    elem=new ElemType[sizeof(ElemType)*LIST_INIT_SIZE];
    if(!elem) exit(OVERFLOW);
    length=0;
    listsize=LIST_INIT_SIZE;
}


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

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

template 
void SqList::ClearList_Sq()
{
    length=0;
}

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

template 
int SqList::ListLength_Sq()
{
    return length;
}

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

template 
Status SqList::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 
Status SqList::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 
Status SqList::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 
Status SqList::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 
void SqList::ListTraverse()
{
    for(int i=0;i<length;i++)
        cout<" ";
    cout<#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<s.ListTraverse();
    cout<<s.ListLength_Sq()<//顺序表的长度
    if(s.GetElem_Sq(5,e))
        cout<if(s.PriorElem_Sq(e,pre))
        cout<if(s.NextElem_Sq(e,next))
        cout<<next<s.ClearList_Sq();  //清空
    cout<<s.ListLength_Sq()<if(s.ListEmpty_Sq())
        s.ListInsert_Sq(1,10);
    s.ListTraverse();
    return 0;
}

你可能感兴趣的:(数据结构)