数据结构与算法入门1-线性表的顺序存储

       最近在复习数据结构与算法,决定作个完整的总结。之后会已两天一次的速度更新,但愿能对在学数据结构的朋友有所帮助。固然,本人也不是什么大牛,不免出错,还请见谅。有问题请评论,博主会与大家一块儿探讨并一一回复。ios

    废话少说,先从线性表的顺序存储开始。懒得打字,直接上代码(C++版)。算法


头文件 linearList.h数据结构

#ifndef LINEARLIST_H_INCLUDED
#define LINEARLIST_H_INCLUDED
#define DEFAULT_SIZE 10
//定义状态码
typedef int StatusCode;
const static StatusCode RANGE_ERROR=0;
const static StatusCode SUCCESS=1;
const static StatusCode OVER_FLOW=2;
//顺序表类模板
template <class ElemType>
class SqList
{
protected:
    //顺序表的数据成员
    int count;
    int maxSize;
    ElemType *elems;
    //辅助函数模板
    bool Full()const;//判断线性表是否已满
    void Init(int size);//初始化线性表
public:
    //抽象数据类型方法声明
    SqList(int size=DEFAULT_SIZE);
    virtual ~SqList();
    int Length()const;//求线性表长度
    bool Empty()const;//判断线性表是否为空
    void clear();//清空线性表
    void Traverse(void (*visit)(const ElemType));//遍历线性表
    StatusCode GetElem(int position,ElemType &e)const;//求指定位置的元素
    StatusCode SetElem(int position,const ElemType &e);//设置指定位置处的元素值
    StatusCode Delete(int position,ElemType &e);//删除元素
    StatusCode Insert(int position,const ElemType &e);//插入元素
    /*
    SqList(const SqList<ElemType> &copy);//赋值构造函数模板
    SqList<ElemType> operater = (const SqList<ElemType> &copy);//重载算数运算符
    */
};

#endif // LINEARLIST_H_INCLUDED

函数实现 LinearList.cpp函数

#include "linearList.h"
#include <stdio.h>
using namespace std;
template <class ElemType>
bool SqList<ElemType>::Full()const
{
    return maxSize==count;
}
template <class ElemType>
void SqList<ElemType>::Init(int size)
{
    maxSize=size;
    if(elems!=NULL)
    {
        delete []elems;
    }
    elems=new ElemType[maxSize];
    count=0;
}
template <class ElemType>
SqList<ElemType>::SqList(int size)
{
    Init(size);
}
template <class ElemType>
SqList<ElemType>::~SqList()
{
    delete []elems;
}
template <class ElemType>
int SqList<ElemType>::Length()const
{
    return count;
}
template <class ElemType>
bool SqList<ElemType>::Empty()const
{
    return count==0;
}
template <class ElemType>
void SqList<ElemType>::clear()
{
    count=0;
}
template <class ElemType>
StatusCode SqList<ElemType>::SetElem(int position,const ElemType &e)
{
    if(position<1||position>Length())
    {
        return RANGE_ERROR;
    }
    elems[position]=e;
    return SUCCESS;
}
template <class ElemType>
StatusCode SqList<ElemType>::Insert(int position,const ElemType &e)
{
    if(position<1||position>Length()+1)
    {
        return RANGE_ERROR;
    }
    if(Full())
    {
        return OVER_FLOW;
    }
    ElemType elem;
    for(int curPosition=Length();curPosition>position;curPosition--)
    {
        elems[curPosition+1]=elems[curPosition];
    }
    elems[position]=e;
    count++;
    return SUCCESS;
}
template <class ElemType>
StatusCode SqList<ElemType>::GetElem(int position,ElemType &e)const
{
    if(position<1||position>Length())
    {
        return RANGE_ERROR;
    }
    e=elems[position];
    return SUCCESS;
}
template <class ElemType>
StatusCode SqList<ElemType>::Delete(int position,ElemType &e)
{
    if(position<1||position>Length())
    {
        return RANGE_ERROR;
    }
    GetElem(position,e);
    for(int curPosition=position+1;curPosition<=Length();curPosition++)
    {
        elems[curPosition-1]=elems[curPosition];
    }
    count--;
    return SUCCESS;
}
template <class ElemType>
void SqList<ElemType>::Traverse(void(*visit)(const ElemType))
{
    for(int curPosition=1;curPosition<=Length();curPosition++)
    {
        visit(elems[curPosition]);
    }
}

测试代码:测试

#include <iostream>
#include "linearList.h"
#include "linearList.cpp"
using namespace std;
void show(const int e);
int main()
{
    int size=12;
    SqList<int> list(size);
    StatusCode status=list.Insert(1,2);
    cout<<"插入状态:"<<status<<endl;
    int k;
    list.GetElem(1,k);
    cout<<"第一个元素是:"<<k<<endl;
    cout << "线性表的长度为:"<<list.Length() << endl;
    cout<<"线性表是否为空:"<<list.Empty()<<endl;
    cout<<"调用SetElem以后:"<<endl;
    list.SetElem(1,100);
    list.GetElem(1,k);
    cout<<"第一个元素是:"<<k<<endl;
    list.Insert(2,23);
    list.Insert(3,25);
    list.Insert(4,6);
    cout<<"删除前:"<<endl;
    for(int i=1;i<=list.Length();i++)
    {
        list.GetElem(i,k);
        cout<<k<<"  ";
    }
    cout<<endl;
    list.Delete(2,k);
    cout<<"删除后:"<<endl;
    for(int i=1;i<=list.Length();i++)
    {
        int k;
        list.GetElem(i,k);
        cout<<k<<"  ";
    }
    cout<<endl;
    cout<<"删除的元素是:"<<k<<endl;
    cout<<"遍历元素"<<endl;
    list.Traverse(show);
    return 0;
}
void show(const int e)
{
    cout<<e<<endl;
}

或许你已注意到,SqList中有两个函数被注释并未实现。请读者自行完成。如须要完整实现,请留言。spa

相关文章
相关标签/搜索