數據結構與算法入門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

相關文章
相關標籤/搜索