收藏 分享(赏)

数据结构实习题目.doc

上传人:精品资料 文档编号:10415588 上传时间:2019-11-08 格式:DOC 页数:36 大小:218.59KB
下载 相关 举报
数据结构实习题目.doc_第1页
第1页 / 共36页
数据结构实习题目.doc_第2页
第2页 / 共36页
数据结构实习题目.doc_第3页
第3页 / 共36页
数据结构实习题目.doc_第4页
第4页 / 共36页
数据结构实习题目.doc_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、 n( n20)的阶乘 【问题描述】 大数运算计算 n 的阶乘(n=20) 。 【基本要求】 (1)数据的表示和存储; (1.1 ) 累积运算的中间结果和最终的计算结果的数据类型要求是整型 这是问题本身的要求; (1.2 ) 试设计合适的存储结构,要求每个元素或结点最多存储数据的 3 位数值。 (2)数据的操作及其实现: 基于设计的存储结构实现乘法操作,要求从键盘上输入 n 值,在屏幕上显示最终计算结果。 【测试数据】 (1)n20,n!2432902008176640000 (2)n30,n!265252859812191058636308480000000 #include “stdafx

2、.h“ #include #include using namespace std; template class Chain; template class ChainNode friend Chain; private: T data; ChainNode *link; ; template class Chain public: Chain() first = 0; /构造函数 Chain(); /析构函数 bool IsEmpty() const return first = 0; /判断链表是否为空 int Length() const; /求链表的长度 bool Find(int

3、k, T /查找第 k 个元素 int Search(const T /查找元素 x Chain /删除第 k 个元素 Chain /在第 k 个元素之后插入 x void Output(ostream /单链表的输出 Chain /求大数阶乘 private: ChainNode *first; / 指向第一个节点 ; template Chain:Chain() /删除所有的节点 ChainNode *next; while (first) next = first-link; delete first; first = next; template bool Chain:Find(int

4、 k, T int index = 1; while (index link; index+; if (current) x = current-data; return true; return false; template int Chain:Search(const T int index = 1; while (current index+; if (current) return index; return 0; template Chain if (k = 1) first = first-link; else ChainNode *q = first; for (int ind

5、ex = 1; index link; p = q-link; q-link = p-link; x = p-data; delete p; return *this; template int Chain:Length() const / 返回链表的长度 ChainNode *current = first; int len = 0; while (current) len+; current = current-link; return len; template Chain for (int index = 1; index link; ChainNode *y = new ChainN

6、ode; y-data = x; if (k) y-link = p-link; p-link = y; else y-link = first; first = y; return *this; template void Chain:Output(ostream int i=0,j=Length(); for (current = first; current;current = current-link) i+; if(i=j return out; template Chain long j=n; while(j999) Insert(i,j%1000); i+; j=j/1000;

7、Insert(i,j); /通过插入来建立链表(0,20) /计算 long m=0, k=0; ChainNode *current; for(;n2;n-) for (current = first;current;current = current-link)/? m=k; k=(current-data*(n-1)+k)/1000; /向前进位 current-data=(current-data*(n-1)+m)%1000; if(!current-link k=k/1000; Insert(Length(),k); /链表长度加一 k=0; break; return *this;

8、 int main() long n; char ch; do coutn; Chain a; a.Fac(n); coutch; while(ch=Y); return 0; 2:题目:表达式求值 要求:实现关键 栈的使用 两位数以上、负数、小数点? 实现方式 控制台程序 MFC 对话框#include “stdafx.h“#include using namespace std;#include#include #include templateclass Stackpublic:Stack(int sz=50);Stack()deleteelements;void Push(const

9、T /压入栈bool Pop(T /弹出栈T GetTop(void)const; /取栈顶元素bool IsEmpty()constreturn(top=-1)?true:false;bool IsFull()/判断栈是否满return (top=MaxSize-1)?true:false;int GetSize()const/?return top+1;void MakeEmpty()top=-1;private:T *elements;int top;int MaxSize;void overflowProcess();/栈溢出处理;templateStack:Stack(int sz)

10、top=-1;MaxSize=sz;elements=new TMaxSize;/创建栈的数组空间assert(elements!=NULL);/判断动态内存是否分配成功是否templatevoid Stack:Push(const Ttop+;elementstop=x;templatebool Stack:Pop(Tx=elementstop-;return true;templateT Stack:GetTop(void)const/返回栈顶元素if(IsEmpty()=true)cerrvoid Stack:overflowProcess() /溢出处理T *newArray=new

11、T2*MaxSize; /扩充栈的空间for(int i=0;is; /声明 double 型的栈对象void AddOperand(double value);/把数值压入栈中bool GetOperand(double /判断取操作数操作是否成功void DoOperator(char ch);/进行操作;void Calculater:AddOperand(double value)s.Push(value);bool Calculater:GetOperand(doublebreak;default: /其实也是一种 case,只不过就是指“除了指定的几个 case 以外的其他情况”

12、,不是操作符cin.putback(ch);/字符放回输入流cinnewOperand;/重新读取操作数,一个操作数的第一个字符AddOperand(newOperand);/将操作数放入栈中int main()Calculater call;couttemplateclass BinaryTreeNode/二叉树结点/friend BinaryTree;public:BinaryTreeNode()LeftChild=RightChild=0;BinaryTreeNode(const TLeftChild=RightChild=0;BinaryTreeNode(const TLeftChil

13、d=l;RightChild=r;public:T data;BinaryTreeNode*LeftChild,*RightChild;templateclass BinaryTreefriend BinaryTreeNode;public:BinaryTree()root=0;BinaryTree()bool IsEmpty()constreturn (root)?false:true);void Creat();void PreOrder(void (*Visit)(BinaryTreeNode*u)/前序遍历 PreOrder(Visit,root);void InOrder(void

14、(*Visit)(BinaryTreeNode*u)/中序遍历InOrder(Visit,root);void PostOrder(void (*Visit)(BinaryTreeNode*u)/后序遍历PostOrder(Visit,root);void LevelOrder(void(*Visit)(BinaryTreeNode*u)/层次遍历PreOrder(Output,root);cout*iCreat();void swap()/交换左右节点swap(root);int leave()/计算叶子节点个数return leave(root);int noleave()/计算非叶子节点

15、个数return noleave(root);private:BinaryTreeNode*root;void PreOrder(void(*Visit)(BinaryTreeNode*u),BinaryTreeNode*t);void InOrder(void(*Visit)(BinaryTreeNode*u),BinaryTreeNode*t);void PostOrder(void(*Visit)(BinaryTreeNode*u),BinaryTreeNode*t);/void LevelOrder(void(*Visit)(BinaryTreeNode*u),BinaryTreeNo

16、de*t);static void Output(BinaryTreeNode* t)/输出树的所有节点coutdata *t)const;int Size(BinaryTreeNode*t)const; void swap(BinaryTreeNode*t);int leave(BinaryTreeNode*t);int noleave(BinaryTreeNode*t);templateint BinaryTree:Height(BinaryTreeNode*t)constif(!t) return 0;int hl=Height(t-LeftChild);int hr=Height(t-

17、RightChild);if(hlhr) return +hl;else return +hr;templateint BinaryTree:Size(BinaryTreeNode*t)constif(!t) return 0;int sl=Size(t-LeftChild);int sr=Size(t-RightChild);return (1+sl+sr);templateBinaryTreeNode*BinaryTree:iCreat( ) T ch;cinch;BinaryTreeNode * root;if(ch=#)root=NULL;elseroot=new BinaryTree

18、Node;root-data=ch;root-LeftChild=this-iCreat();root-RightChild=this-iCreat();return root; templatevoid BinaryTree:Creat() this-root = iCreat();templatevoid BinaryTree:PreOrder(void(*Visit)(BinaryTreeNode*u),BinaryTreeNode*t)if(t) Visit(t);PreOrder(Visit,t-LeftChild);PreOrder(Visit,t-RightChild);temp

19、late void BinaryTree:InOrder(void(*Visit)(BinaryTreeNode*u),BinaryTreeNode*t)if(t)InOrder(Visit,t-LeftChild);Visit(t);InOrder(Visit,t-RightChild);templatevoid BinaryTree:PostOrder(void(*Visit)(BinaryTreeNode*u),BinaryTreeNode*t)if(t)PostOrder(Visit,t-LeftChild);PostOrder(Visit,t-RightChild);Visit(t)

20、;templatevoid BinaryTree:swap(BinaryTreeNode *t)BinaryTreeNode *temp;if(!t) return;elsetemp=t-LeftChild;t-LeftChild=t-RightChild;t-RightChild=temp;swap(t-LeftChild);swap(t-RightChild);templateint BinaryTree:leave(BinaryTreeNode*t)if(!t) return 0;if(t-LeftChild=0int leafl=leave(t-LeftChild);int leafr

21、=leave(t-RightChild); return leafl+leafr;templateint BinaryTree:noleave(BinaryTreeNode *t)if(!t) return 0;if(!t-LeftChildint leafl=noleave(t-LeftChild);int leafr=noleave(t-RightChild);return leafl+leafr+1;#endif #include “stdafx.h“#include“binarytree.h“#include void main() cout Tree;Tree.Creat();/co

22、ut#include“queue.h“templateclass BinaryTree;template/二叉树的二叉链表class BinaryTreeNodefriend BinaryTree;public:BinaryTreeNode()LeftChild=RightChild=0;/构造函数BinaryTreeNode(const TLeftChild=RightChild=0;BinaryTreeNode(const TLeftChild=l;RightChild=r;private:T data;BinaryTreeNode*LeftChild,*RightChild;templa

23、teclass BinaryTreepublic:BinaryTree()/构造函数 空树root=0;BinaryTree()bool IsEmpty()constreturn (root)?false:true);/void BinaryTree:LevelOrder(void(* Visit)(BinaryTreeNode*u);void LevelOrder(void(BinaryTree:* Visit)(BinaryTreeNode*u);/层次访问,在访问某一层结点时把下一层结点记忆在队列(尾)中,然后在访问在队头的结点void LevelOutPut()if(!root)/空树

24、return;coutdata;LevelOrder(Output);cout*createBinaryTree(T *VLR,T*LVR,int n)/构造二叉树前 中 n 为元素个数if(n=0)return NULL;int k=0;while(VLR0!=LVRk)/在中序前序结合找根k+;BinaryTreeNode*t=new BinaryTreeNode(VLR0);/根结点为 tt-LeftChild=createBinaryTree(VLR+1,LVR,k);/从前序 VLR+1 开始对中序 0k-1 左子序列的 k 个元素递归建立左子树t-RightChild=create

25、BinaryTree(VLR+k+1,LVR+k+1,n-k-1);/从前序 VLR+k+1 开始对中序 k+1n-1 左子序列的 n-k-1 个元素递归建立右子树return t;BinaryTreeNode*root;void Output(BinaryTreeNode* t)if(t-LeftChild|t-RightChild)/左或又子树不为空if(t-LeftChild)coutLeftChild-data;elsecoutRightChild)coutRightChild-data;elsecoutvoid BinaryTree:LevelOrder(void (BinaryTr

26、ee:*Visit)(BinaryTreeNode *u)/void BinaryTree:LevelOrder(void(* Visit)(BinaryTreeNode*u)LinkedQueue*Q;BinaryTreeNode *p=root;Q.EnQueue(p);/根节点进队while(!Q.IsEmpty ()Q.DeQueue(p);/根节点出队(this-*Visit)(p);/访问根结点if(p-LeftChild!=NULL)Q.EnQueue(p-LeftChild);/左子女进队if(p-RightChild!=NULL)Q.EnQueue(p-RightChild)

27、; /右子女进队#endif/queqe.h#ifndef QUEQE_H#define QUEQE_H/单链表的链式队列templateclass LinkedQueue;templateclass Nodefriend LinkedQueue;private:T data;Node*link;templateclass LinkedQueue public:LinkedQueue() /构造函数front=rear=0;/建立空队列LinkedQueue(); /析构函数bool IsEmpty()constreturn (front)?false:true);LinkedQueue/往队

28、尾队列中插入元素LinkedQueue/从队头删除元素private:Node*front;Node*rear;templateLinkedQueue:LinkedQueue()/析构函数的实现Node*next;while(front)next=front-link;delete front;front=next;templateLinkedQueuep-data=x;p-link=0;if (front) rear-link=p;/在列尾添加新的结点else/队列为空,新结点成为第一个结点 front=p;rear=p;return *this;templateLinkedQueue/暂存

29、队头结点x=front-data;front=front-link;/队头修改delete p;return*this;#endif#include “stdafx.h“#include“binarytree.h“#include void main()BinaryTree Tree;/char 类型的int n;coutn;char *L=new charn; char *R=new charn;coutLi;i+;coutRj;j+;Tree.root=Tree.createBinaryTree(L,R,n);cout#include “minheap.h“#include /const

30、int MaxN = 100;template class HuffmanTree;template class HuffmanTreeNode/树结点的类定义/friend class HuffmanTree;public:int arrkey;Type data;/结点数据HuffmanTreeNode *leftChild, *rightChild, *parent;template class HuffmanCodeNode/friend class HuffmanTree;public:HuffmanTreeNode *dataptr;int bitMaxN;int start;te

31、mplate class HuffmanTree/friend class HuffmanTreeNode;/friend class HuffmanCodeNode;public:HuffmanTree();HuffmanTree(Type weight, int n);HuffmanCode();/求 huffman 编码protected:HuffmanTreeNode *hfTree;HuffmanCodeNode *hfCode;int currentSize;void MergeTree(HuffmanTreeNode pt-rightChild = pt-data = bt1.d

32、ata + bt2.data;pt-parent = NULL; bt1.parent = pt; bt2.parent = pt;template HuffmanTree : HuffmanTree(Type weight, int n)/n 个权值为 W1HuffmanTreeNode *firstchild, *secondchild, *parent;HuffmanTreeNode *TNode;if(n MaxN)cout n;TNode = new HuffmanTreeNode n;for(int i = 0;i hp(TNode,n);for(i = 0;i ;firstchi

33、ld = hp.RemoveMin();secondchild = hp.RemoveMin();MergeTree(*firstchild, *secondchild, parent);hp.Insert(*parent);hfTree = parent;template HuffmanTree : HuffmanCode()HuffmanCodeNode *cd = new HuffmanCodeNode;HuffmanTreeNode *child, *parent;for(int i=0;i start = currentSize -1;child = hfCodei.dataptr;

34、parent = child-parent;while(parent != NULL)if(parent-leftChild = child)/向左标记为 0cd-bitcd-start = 0;elsecd-bitcd-start = 1; /向右标记为 0child = parent;parent = parent-parent;cd-start-;for(int k=0;k bitk;hfCodei.start = cd-start+1;coutdata class MinHeap /friend class Type;public:MinHeap(int maxSize);MinHea

35、p(Type a, int n);/构造函数MinHeap()delete heapArr;/析构函数int Insert(Type /把数据元素插入最小堆中Type * RemoveMin();/删除堆顶上最小元素private:Type * heapArr;/存放堆中元素的数组Type * Arr;Type * saveNode100;int saveNodeCount;int heapCurrentSize;/堆中当前元素个数int heapMaxSize;/最多元素个数void siftDown(int p);/从 p 下滑调整为最小堆void siftUp(int p);/从 p 上

36、滑调整为最小堆;template MinHeap : MinHeap(int maxSize)heapMaxSize = maxSize;heapArr = new Type heapMaxSize;/创建堆存储空间 heapCurrentSize = 0;/当前元素个数为 0template MinHeap:MinHeap(Type a,int n)heapMaxSize = n;heapArr = new TypeheapMaxSize;saveNodeCount=n;for(int j=0;j=0)siftDown(i);/再向前换一个分支结点i-;/*if (heapMaxSize%2

37、=0)for(int k=0;kvoid MinHeap:siftDown(const int start)/堆下滑,从开始结点开始int i=start,j;Type temp=heapArri;j=2*i+1;/左子女位置while(j heapArrj+1.data) j+;if(temp.data int MinHeap:Insert(TypeheapArrheapCurrentSize.arrkey=saveNodeCount;siftUp(heapCurrentSize);heapCurrentSize+;saveNodesaveNodeCount+=return 1;templa

38、te void MinHeap:siftUp(int p)int j=p,i;Type temp = heapArrj;i=(j-1)/2;while(j0)if(heapArri.data Type * MinHeap:RemoveMin()Type * temp=new HuffmanTreeNode;(*temp)=heapArr0;heapArr0= heapArrheapCurrentSize-1;heapCurrentSize-;siftDown(0);if(temp-arrkey-1 else if(temp-arrkey=heapMaxSize #endif#include “

39、stdafx.h“#include “huffmantree.h“#include int main(int argc, char* argv)char weightMaxN;int n;cout n;coutweighti;HuffmanTree a (weight,n);a.HuffmanCode();return 0;实习题目 6. 要求:自己设计图并编码进行存储,同时输出图的两种遍历方式的结果。 实现关键 图的存储方式的选择 图的遍历算法 实现方式 控制台程序 输出图的两种遍历方式的结果/graph.h#ifndef GRAPH_H#define GRAPH_H#include con

40、st int defaultVertices=20; /默认最大顶点数const int maxweight=100000000000000;#include “queue.h“templateclass Graph/图的类定义public:Graph()Graph()bool GraphIsempty()const/判断图空否if(numEdges=0)return true;elsereturn false;bool GraphIsfull()const/判断图满否if(numVertices=maxVertices|numEdges=maxVertices*(maxVertices-1)

41、/2)/?return true;elsereturn false;int NumberOfVertices()/返回当前的点顶数return numVertices;int NumberOfEdges()/返回当前边数return numEdges;int maxVertices;/最大顶点数int numEdges;/当前边数int numVertices;templateclass Graphmtx:public Graph/图的邻接矩阵类定义public:Graphmtx(int sz=defaultVertices);/构造函数Graphmtx()/析构函数deleteVertice

42、s;for(int i=0; i=0friend ostreamvoid DFS(Graphmtx/从图顶点 v 出发,对图 G 进行深度优先遍历的主过程 深度优先生成树void DFS(Graphmtx/从顶点位置 v 出发,以深度优先的次序访问所有可读入的尚未访问过的顶点。子过程/算法中用到辅助数组 visited,对已访问过的顶点做访问标记void BFS(Graphmtx/从图顶点 v 出发,对图 G 进行广度优先遍历的过程private:T * Vertices;/顶点表E *Edge;/邻接矩阵;template/图的邻接矩阵构造函数Graphmtx:Graphmtx(int sz)maxVertices=sz;numVertices=0;numEdges=0;int i,j;Vertices=new T maxVertices;/顶点表数组Edge=(E*)new E*maxVertices;/邻接矩阵数组for(i=0;iint Graphmtx:getfirstNeighbor(int v)if(v!=-1)for(int col=0;col0col0/表满elseVerticesnumVertices+=vertex;/+numVertices;

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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