最近在复习数据结构与算法,决定作个完整的总结。之后会已两天一次的速度更新,但愿能对在学数据结构的朋友有所帮助。固然,本人也不是什么大牛,不免出错,还请见谅。有问题请评论,博主会与大家一块儿探讨并一一回复。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> ©);//赋值构造函数模板 SqList<ElemType> operater = (const SqList<ElemType> ©);//重载算数运算符 */ }; #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