收藏 分享(赏)

数据结构算法与应用-C++语言描述代码new.doc

上传人:dzzj200808 文档编号:2692218 上传时间:2018-09-25 格式:DOC 页数:77 大小:642.14KB
下载 相关 举报
数据结构算法与应用-C++语言描述代码new.doc_第1页
第1页 / 共77页
数据结构算法与应用-C++语言描述代码new.doc_第2页
第2页 / 共77页
数据结构算法与应用-C++语言描述代码new.doc_第3页
第3页 / 共77页
数据结构算法与应用-C++语言描述代码new.doc_第4页
第4页 / 共77页
数据结构算法与应用-C++语言描述代码new.doc_第5页
第5页 / 共77页
点击查看更多>>
资源描述

1、程序 3-1 基于公式的类 LinearListtemplate class LinearListpublic:LinearList(int MaxListSize);/构造函数LinearList()delete element;/析构函数bool IsEmpty() constreturn length=0;int Length() constreturn length;bool Find(int k, T /返回第 k 个元素至 x 中int Search(const T / 返回 x 所在位置LinearList/ 删除第 k 个元素并将它返回至 x中LinearList/ 在第 k

2、个元素之后插入 xvoid Output(ostreamprivate:int length;int MaxListSize;T *element;/ 一维动态数组;程序 3-2 使 new 引发 NoMem 异常而不是 xalloc 异常最后一行调用了 C+函数 set newhandler,每当分配内存失败时,该函数就让操作符new 调用函数 mynewhandler,每当分配内存失败时,setnewhandler 将返回一个指针,指向由 n e w 此前所调用的那个函数,该指针保存在变量 Old_Handle_中./ 内存不足class NoMempublic:NoMem();/ 使 n

3、ew 引发 NoMem 异常而不是 xalloc 异常void my_new_handler()throw NoMem();new_handler Old_Handler_=set_new_handler(my_new_handler);程序 3-3 基本的表操作templateLinearList:LinearList(int MaxListSize)/ 基于公式的线性表的构造函数MaxSize = MaxListSize;element = new TMaxSize;length = 0;bool LinearList:Find(int k.T /不存在第 k 个元素x = element

4、k - 1;return true;int LinearList:Search(const T i y(100);程序 3-4 从线性表中删除一个元素templateLinearListiLinearList/ 在第k个元素之后插入 x/ 如果不存在第k个元素,则引发异常OutOfBounds/ 如果表已经满,则引发异常NoMemif(k length) throw OutOfBounds();if(length = MaxSize) throw NoMem();/ /向后移动一个位置for(int i=k;ivoid LinearList:Output(ostream i return ou

5、t;程序 3-7 采用类 LinearList 的例子假定程序3 - 1至3 - 6均存储在文件 llist.h之中,且异常类定义位于文件 xcept.h 之中#include #include “llist.h“#include “xcept.h“using namespace std;void main(void)try /创建一个大小为5的整数线性表LLinearList L(5);/输出该表的长度(为0)cout m) return 0;/在右边有剩余空间吗?寻找最小的j (ji ),使得 last j class ChainNode friend Chain;private:T da

6、ta;ChainNode *link;template class Chain public:Chain() first = 0;Chain();bool IsEmpty() const return first = 0;int Length() const;bool Find(int k, Tint Search(const TChainChainvoid Output(ostreamprivate:ChainNode *first; / 指向第一个节点的指针;可以采用如下的描述来创建一个空的整数型线性表:Chain L;注意,线性表的链表描述不需要指定表的最大长度。程序 3-9 删除链表中

7、的所有节点templateChain:Chain()/ 链表的析构函数,用于删除链表中的所有节点ChainNode *next; / 下一个节点while (first) next = first-link;delete first;first = next;程序 3-10 确定链表的长度templateint Chain:Length() const(/ 返回链表中的元素总数ChainNode *current = first;int len = 0;while (current) len+;current = current-link;return len;程序 3 - 11 在链表中查找

8、第 k 个元素templatebool Chain:Find(int k, Tint index = 1; / current的索引while (index link;index+;if (current) x = current-data; return true;return false; / 不存在第 k个元素程序 3-12 在链表中搜索templateint Chain:Search(const Tint index = 1; / current的索引while (current index+;if (current) return index;return 0;程序 3-13 输出链

9、表templatevoid Chain:Output(ostreamfor (current = first; current; current = current-link)out data ostream return out;程序 3-14 从链表中删除一个元素templateChain/ 将p移动至第k个元素,并从链表中删除该元素if (k = 1) / p已经指向第 k个元素first = first-link; / 删除之else / 用 q指向第k - 1个元素ChainNode *q = first;for (int index = 1; index link;if (!q |

10、 !q-link)throw OutOfBounds(); /不存在第k个元素p = q-link; / 存在第k个元素q-link = p-link; / 从链表中删除该元素/保存第k个元素并释放节点px = p-data;delete p;return *this;程序 3-15 向链表中插入元素templateChain/将 p 移动至第 k 个元素for(int index=1;indexlink;if(k0 /不存在第 k 个元素/ 插入ChainNode *y = new ChainNode;Y-data = x;if(k)/ 在 p 之后插入y-link = p-link;p-l

11、ink = y;else/ 作为第一个元素插入y-link = first;First = y;return *this;程序 3-16 删除链表中的所有节点templatevoid Chain:Earase();/删除链表中的所有节点ChainNaode *next;while(first)next = first-link;delete first;first = next;程序 3-17 在链表右端添加一个元素templateChainy = new ChainNode;y-data = x;y-link = 0;if(first)/链表非空last-link = y;last = y;

12、else/ 链表为空First = last = y;Return *this;程序 3-18 链表遍历器类templateclass ChainIteratorpublic:T* initalize(const Chainif(location) return return 0;T* Next()if(!location) return 0;location =location-link;if(location) return return 0;private:ChainNode *location;程序 3-19 采用链表遍历器输出整数链表 Xint *x;ChainIterator c;

13、x = c.Initalize(X);while(x)coutint CircularList:Search(const Tint index = 1;/ current 的索引first-data = x;/ 把 x 放入头节点/ 查找 xwhile(current-data != x)current = current-link;index+;/ 是链表表头吗?return (current = first) ? 0 : index);程序 3-21 双向链表的类定义templatecalss DoubleNodefriend Double;private:T data;DoubleNod

14、e *left,*right;templateclass Doublepublic:Double()LeftEnd = RightEnd = 0Double();int Length() const;bool Find(int k, TInt Search(const TDoubleDoublevoid Output(ostreamprivate:DoubleNode *LeftEnd,*RightEnd;程序 3-22 间接寻址表的类定义templateclass IndirectListpublic:IndirectList(int MaxSize = 10);IndirectList()

15、;bool isEmpty() const return length = 0;int Length() const return length;bool Find(int k,Tint Search(const TInsirectListInsirectListvoid Output(ostreamprivate:T *table;/ 一维 T 类型指针数组int length,MaxSize;程序 3-23 间接寻址的构造函数和析构函数templateIndirectList:IndirectList(int MaxListSize)/ 构造函数MaxSize = MaxListSize;

16、table = new T *MaxSize;length = 0;templateIndirectList:IndirectList()/删除表for (int i = 0; i bool IndirectList:Find(int k, T / 不存在第k个元素x = *tablek - 1;return true;程序 3-25 从间接寻址表中删除元素templsteIndirectList iIndirectListIf(length = MaxSize) throw NoMem();/ /向后移动一个位置for(int i=length-i;i=k;i-)tablei+1 = tab

17、lei;Tablek = new T;*tablek = x;length+;Return *this;程序 3-27 模拟指针的类定义templsteclass SimNodefriend SimSpace;private:T data;int link;templsteclass SimSpacepublic:SimSpace(int MaxSpaceSize=100);SimSpace()delete node;int Allocate();/分配一个节点void Deallocate(int/释放节点 iprivate:int NumberOfNodes,first;SimNode*

18、node;/节点数组;程序 3-28 初始化可用空间表templateSimSpace:SimSpace(int MaxSpaceSize)/ /构造函数NumberOfNodes = MaxSpaceSize;/ /初始化可用空间表node = new SimNodeNumberOfNodes;/ /创建一个节点链表for(int i=0;iint SimSpace:Allocate()/ 分配一个自由节点if (first = -1) throw NoMem();int i = first; /分配第一个节点first = nodei.link; /first指向下一个自由节点return

19、 i;程序3-30 使用模拟指针释放一个节点templatevoid SimSpace:Deallocate(intfirst = i;i = -1;程序 3-31 使用两个可用空间表的构造函数templateSimSpace:SimSpace(int MaxSpaceSize)/使用两个可用空间表的构造函数NmuberOfNodes = MaxSpaceSize;node = new SimNodeNumberOfNodes;/ /初始化可用空间表first1 = 0;first2 = -1;程序3-32 使用两个可用空间表的A l l o c a t e函数templateint SimS

20、pace:Allocate()/分配一个自由节点if(first2 = -1)/ 第2个表为空if(first = NumberOfNodes) throw NoMem();retunrn first+;/ /分配链表中的第一个节点 int i = first2;first2 = nodei.link;return i;程序3-33 释放一个循环链表templatevoid SimSpace:DeallocateCircular(intnodec.link = first;first = next;c = -1;程序3-34 模拟链表的类定义templateclass SimChainpubl

21、ic:SimChain()first = -1;SimChain()Destroy();void Destroy();/ 使表为空int Length() const;bool Find(int k,TSimChainSimChainvoid Output(ostreamprivate:int first;/ 第一个节点的索引static SimSpace S;/使用模拟空间S来定义一个链表类;程序3-35 模拟指针的构造函数和L e n g t h函数templatevoid SimChain:Destroy()/ 释放链表节点int next;while (first != -1) nex

22、t = S.nodefirst.link;S . D e a l l o c a t e ( f i r s t ) ;first = next;templateint SimChain:Length() const/ 返回链表的长度int current = first;/ /链节点的当前位置len = 0; /元素计数while (current != -1) current = S.nodecurrent.link;len+;return len;程序3-36 模拟指针的 F i n d函数templatebool SimChain:Find(int k, T/ 为插入操作分配一个新节点

23、int y = S.Allocate();S.nodey.data = x;/ /向链表中插入新节点/ 首先检查新节点是否要插到链表的首部if (k) /在 p之后插入S.nodey.link = S.nodep.link; S.nodep.link = y;else / 作为链表首节点S.nodey.link = first; first = y;return *this;程序3-39 使用模拟链表#include #include “schain.h“SimSpace SimChain:S;void main(void)int x;SimChain c;cout Node x;Chain

24、*bin;bin = new Chain range + 1;/ /分配到每个箱子中for (int i = 1; i = 0; j-)while (!binj.IsEmpty() binj.Delete(1,x);X.Insert(0,x);delete bin;程序3-44 Binsort作为C h a i n类的成员templatevoid Chain:BinSort(int range)/ 按分数排序int b; / 箱子索引号ChainNode *bottom, *top;/ /箱子初始化bottom = new ChainNode* range + 1;top = new Chai

25、nNode* range + 1;for (b = 0; b link) / 添加到箱子中b = first-data;if (bottomb) /箱子非空topb-link = first;topb = first;else / 箱子为空bottom b = topb = first;/ /收集各箱子中的元素,产生一个排序链表ChainNode *y = 0;for (b = 0; b link = bottomb;else / 第一个非空的箱子first = bottomb;y = topb;if (y) y-link = 0;delete bottom;delete top;程序3-45

26、 按不同的域进行排序inline int F1(Nodeinline int F2(Nodeinline int F3(Nodevoid main(void)Node x;Chain L;r a n d o m i z e ( ) ;for (int i = 1; i class Array1D public:Array1D(int size = 0);Array1D(const Array1D / 复制构造函数Array1D() delete element;Tint Size() return size;Array1DArray1D operator+() const; / 一元加法操作符

27、Array1D operator+(const Array1DArray1D operator-() const; / 一元减法操作符Array1D operator-(const Array1DArray1D operator*(const Array1DArray1Dprivate:int size;T *element; /一维数组;程序4-2 一维数组的构造函数templateArray1D:Array1D(int sz)/ 一维数组的构造函数if (sz Array1D:Array1D(const Array1Delement = new Tsize; / 申请空间for (int

28、i = 0; i Treturn elementi;程序4-4 重载赋值操作符=templateArray1Ddelete element; / 释放原空间element = new Tsize; / 申请空间for (int i = 0; i Array1D Array1D: operator-(const Array1D/ 创建结果数组wArray1D w(size);for (int i = 0; i Array1D Array1D:operator-() const/ 返回w = -(*this)/ 创建结果数组wArray1D w(size);for (int i = 0; i Ar

29、ray1D i class Array2D public:Array2D(int r = 0, int c = 0);Array2D(const Array2D / 复制构造函数Array2D() delete row;int Rows() const return rows;int Columns() const return cols;Array1DArray2DArray2D operator+() const; / 一元加法操作符Array2D operator+(const Array2DArray2D operator-() const; / 一元减法操作符Array2D oper

30、ator-(const Array2DArray2D operator*(const Array2DArray2Dprivate:int rows, cols; / 数组维数Array1D *row; / 一维数组的数组;程序4-7 二维数组的构造函数templateArray2D:Array2D(int r, int c)/ 二维数组的构造函数/ 合法的 r 和cif (r r;/ 调整每个元素的大小for (int i = 0; i Array2D:Array2D(const Array2Dcols = m.cols;/ 分配指向一维数组的数组row = new Array1D rows;

31、/ 复制每一行for (int i = 0; i Array1Dreturn rowi;程序4-10 二元减法操作符templateArray2D Array2D: operator-(const Array2D/ 创建存放结果的数组wArray2D w(rows,cols);for (int i = 0; i Array2D Array2D: operator*(const Array2D/ 创建存放结果的数组wArray2D w(rows, m.cols);for (int i = 0; i class Matrix public:Matrix(int r = 0, int c = 0);

32、Matrix(const Matrix /复制构造函数Matrix() delete element;int Rows() const return rows;int Columns() const return cols;TMatrixMatrix operator+() const; / 一元加法Matrix operator+(const MatrixMatrix operator-() const; / 一元减法Matrix operator-(const MatrixMatrix operator*(const MatrixMatrixprivate:int rows, cols;

33、/ 矩阵维数T *element; / 元素数组;程序4-13 类M a t r i x的构造函数templateMatrix:Matrix(int r, int c)/ 类M a t r i x的构造函数/ 验证 r和c的合法性if (r Treturn element(i - 1) * cols + j - 1;程序4-15 类M a t r i x的减法操作符templateMatrix Matrix: operator-(const Matrix/ 创建结果矩阵wMatrix w(rows, cols);for (int i = 0; i Matrix Matrix: operator

34、*(const MatrixMatrix w(rows, m.cols); / 结果矩阵/ 为*this, m和w 定义游标/ 并设定初始位置为( 1 , 1 )int ct = 0, cm = 0, cw = 0;/ 对所有的 i和j计算w ( i , j )for (int i = 1; i class DiagonalMatrix p u b l i c :DiagonalMatrix(int size = 10)n = size; d = new T n;DiagonalMatrix() delete d; / 析构函数D i a g o n a l M a t r i x T Ret

35、rieve(int i, int j) const;p r i v a t e :int n; /矩阵维数T *d; / 存储对角元素的一维数组 ;templateDiagonalMatrixif (i != j if (i = j) di-1 = x;return *this;template T DiagonalMatrix:Retrieve(int i, int j) const/ 返回D ( i , j ) .if (i n | j n)throw OutOfBounds();if (i = j) return di-1;else return 0;程序4-18 Tr i d i a

36、g o n a l M a t r i x类templateclass TridiagonalMatrix p u b l i c :TridiagonalMatrix(int size = 10)n = size; t = new T 3*n-2;TridiagonalMatrix() delete t;TridiagonalMatrixT Retrieve(int i, int j) const;p r i v a t e :int n; / 矩阵维数T *t; / 存储三对角矩阵的一维数组 ;templateTridiagonalMatrixswitch (i - j) case 1:

37、/ 低对角线ti - 2 = x; break;case 0: / 主对角线tn + i - 2 = x; break;case -1: / 高对角线t2 * n + i - 2 = x; break;default: if(x != 0) throw MustBeZero();return *this;template T TridiagonalMatrix:Retrieve(int i, int j) const/ 返回T ( i , j )if ( i n | j n)throw OutOfBounds();switch (i - j) case 1: /低对角线return ti -

38、2;case 0: / 主对角线return tn + i - 2;case -1: / 高对角线return t2 * n + i - 2;default: return 0;程序4-19 LowerMatrix类templateclass LowerMatrix p u b l i c :LowerMatrix(int size = 10)n = size; t = new T n*(n+1)/2;LowerMatrix() delete t;LowerMatrixT Retrieve(int i, int j) const;p r i v a t e :int n; / 矩阵维数T *t

39、; / 存储下三角矩阵的一维数组 ;templateLowerMatrix/ 当且仅当 i j 时(i,j) 位于下三角if (i = j) ti*(i-1)/2+j-1 = x;else if (x != 0) throw MustBeZero();return *this;template T LowerMatrix:Retrieve(int i, int j) const / /返回 L ( i , j ) .if ( i n | j n)throw OutOfBounds();/ 当且仅当 i j 时(i,j) 位于下三角if (i = j) return ti*(i-1)/2+j-1

40、;else return 0;程序4-20 类S p a r s e M a t r i xtemplateclass SparseMatrixfriend ostreamfriend istreamp u b l i c :SparseMatrix(int maxTerms = 10);SparseMatrix() delete a;void Transpose(SparseMatrix void Add(const SparseMatrix p r i v a t e :void Append(const Termint rows, cols; /矩阵维数int terms; / 非0 元

41、素数目Term *a; / 存储非0元素的数组int MaxTerms; / 数组a的大小;程序4-21 类S p a r s e M a t r i x的构造函数templateSparseMatrix:SparseMatrix(int maxTe r m s )/ 稀疏矩阵的构造函数if (maxTerms MaxTe r m s ;terms = rows = cols = 0;程序4-22 类S p a r s e M a t r i x的输入和输出函数/ 重载 ostreamif (x.terms x.MaxTerms) throw NoMem();/ 输入矩阵元素for (int

42、i = 0; i x.ai.row x.ai.col x.ai.value;return in;程序4-23 转置一个稀疏矩阵templatevoid SparseMatrix: Transpose(SparseMatrix / 设置转置特征b.cols = rows;b.rows = cols;b.terms = terms;/ 初始化int *ColSize, *RowNext;ColSize = new intcols + 1;RowNext = new introws + 1;/ 计算 * t h i s每一列的非0元素数for (int i = 1; i void SparseMatrix:Append(const Termaterms = t;t e r m s + + ;程序4-25 两个稀疏矩阵相加templatevoid SparseMatrix:Add(const SparseMatrix / 不能相加

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报