最近在複習數據結構與算法,決定作個完整的總結。之後會已兩天一次的速度更新,但願能對在學數據結構的朋友有所幫助。固然,本人也不是什麼大牛,不免出錯,還請見諒。有問題請評論,博主會與大家一塊兒探討並一一回復。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