类模板.docx
- 文档编号:5939868
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:14
- 大小:18.16KB
类模板.docx
《类模板.docx》由会员分享,可在线阅读,更多相关《类模板.docx(14页珍藏版)》请在冰豆网上搜索。
类模板
信息13级——数据结构实验1窗体顶端
窗体底端
一、程序设计题 (10分)
1.双向链表排序问题4分
题目描述
随机输入一些数据,然后排序后输出。
建议使用双向链表结点和双向链表类来实现。
参考第4讲ppt里的第3个例题。
可以不使用下面的参考代码,自行编写。
关于双向链表和双向结点的参考代码如下:
//自定义类型
enumStatusCode{SUCCESS,FAIL,UNDER_FLOW,OVER_FLOW,RANGE_ERROR,DUPLICATE_ERROR,
NOT_PRESENT,ENTRY_INSERTED,ENTRY_FOUND,VISITED,UNVISITED};
template
voidWrite(constElemType&e)
//操作结果:
显示数据元素
{
cout< } //双向链表结点类模板 template structDblNode { //数据成员: ElemTypedata;//数据域 DblNode DblNode //构造函数模板: DblNode();//无数据的构造函数模板 DblNode(ElemTypeitem, DblNode DblNode }; //双向链表结点类模板的实现部分 template DblNode : DblNode() //操作结果: 构造指针域为空的结点 { next=NULL; } template DblNode : DblNode(ElemTypeitem, DblNode DblNode //操作结果: 构造一个数据域为item和指针域为linkBack和linkNext的结点 { data=item; back=linkBack; next=linkNext; } //双向链表类模板 template classDblLinkList { protected: //循环链表实现的数据成员: DblNode mutableintcurPosition;//当前位置的序号 mutableDblNode intcount;//元素个数 //辅助函数模板: DblNode voidInit();//初始化线性表 public: //抽象数据类型方法声明及重载编译系统默认方法声明: DblLinkList();//无参数的构造函数模板 virtual~DblLinkList();//析构函数模板 intLength()const;//求线性表长度 boolEmpty()const;//判断线性表是否为空 voidClear();//将线性表清空 voidTraverse(void(*visit)(constElemType&))const;//遍历线性表 intGetCurPosition()const;//返回当前位置 StatusCodeGetElem(intposition,ElemType&e)const;//求指定位置的元素 StatusCodeSetElem(intposition,constElemType&e);//设置指定位置的元素值 StatusCodeDelete(intposition,ElemType&e);//删除元素 StatusCodeInsert(intposition,constElemType&e);//插入元素 DblLinkList(constDblLinkList DblLinkList DblNode }; template DblNode : GetHeadPtr() { returnhead; } //链表类模板的实现部分 template DblNode : GetElemPtr(intposition)const //操作结果: 返回指向第position个结点的指针 { if(curPosition {//当前位置在所查找位置之前,向后查找 for(;curPosition curPtr=curPtr->next;//查找位置position } elseif(curPosition>position) {//当前位置在所查找位置之后,向前查找 for(;curPosition>position;curPosition--) curPtr=curPtr->back;//查找位置position } returncurPtr; } template voidDblLinkList : Init() //操作结果: 初始化线性表 { head=newDblNode head->next=head;//空循环链表的头结点后继为头结点本身 head->back=head;//空双向循环链表的头结点前驱为头结点本身 curPtr=head;curPosition=0;//初始化当前位置 count=0;//初始化元素个数 } template DblLinkList : DblLinkList() //操作结果: 构造一个空链表 { Init(); } template DblLinkList : ~DblLinkList() //操作结果: 销毁线性表 { Clear();//清空线性表 deletehead;//释放头结点所点空间 } template intDblLinkList : Length()const //操作结果: 返回线性表元素个数 { returncount; } template boolDblLinkList : Empty()const //操作结果: 如线性表为空,则返回true,否则返回false { returnhead->next==head; } template voidDblLinkList : Clear() //操作结果: 清空线性表 { ElemTypetmpElem;//临时元素值 while(Length()>0) {//表性表非空,则删除第1个元素 Delete(1,tmpElem); } } template voidDblLinkList : Traverse(void(*visit)(constElemType&))const //操作结果: 依次对线性表的每个元素调用函数(*visit) { for(DblNode =head;tmpPtr=tmpPtr->next) {//用tmpPtr依次指向每个元素 (*visit)(tmpPtr->data);//对线性表的每个元素调用函数(*visit) } } template intDblLinkList : GetCurPosition()const //操作结果: 返回当前位置 { returncurPosition; } template StatusCodeDblLinkList : GetElem(intposition,ElemType&e)const //操作结果: 当线性表存在第position个元素时,用e返回其值,返回ENTRY_FOUND, //否则返回NOT_PRESENT { if(position<1||position>Length()) {//position范围错 returnNOT_PRESENT;//元素不存在 } else {//position合法 DblNode tmpPtr=GetElemPtr(position);//取出指向第position个结点的指针 e=tmpPtr->data;//用e返回第position个元素的值 returnENTRY_FOUND; } } template StatusCodeDblLinkList : SetElem(intposition,constElemType&e) //操作结果: 将线性表的第position个位置的元素赋值为e, //position的取值范围为1≤position≤Length(), //position合法时返回SUCCESS,否则返回RANGE_ERROR { if(position<1||position>Length()) {//position范围错 returnRANGE_ERROR; } else {//position合法 DblNode tmpPtr=GetElemPtr(position);//取出指向第position个结点的指针 tmpPtr->data=e;//设置第position个元素的值 returnSUCCESS; } } template StatusCodeDblLinkList : Delete(intposition,ElemType&e) //操作结果: 删除线性表的第position个位置的元素,并用e返回其值, //position的取值范围为1≤position≤Length(), //position合法时返回SUCCESS,否则返回RANGE_ERROR { if(position<1||position>Length()) {//position范围错 returnRANGE_ERROR; } else {//position合法 DblNode tmpPtr=GetElemPtr(position-1);//取出指向第position-1个结点的指针 tmpPtr=tmpPtr->next;//tmpPtr指向第position个结点 tmpPtr->back->next=tmpPtr->next;//修改向右的指针 tmpPtr->next->back=tmpPtr->back;//修改向左的指针 e=tmpPtr->data;//用e返回被删结点元素值 if(position==Length()) {//删除尾结点,当前结点变为头结点 curPosition=0;//设置当前位置的序号 curPtr=head;//设置指向当前位置的指针 } else {//删除非尾结点,当前结点变为第position个结点 curPosition=position;//设置当前位置的序号 curPtr=tmpPtr->next;//设置指向当前位置的指针 } count--;//删除成功后元素个数减1 deletetmpPtr;//释放被删结点 returnSUCCESS; } } template StatusCodeDblLinkList : Insert(intposition,constElemType&e) //操作结果: 在线性表的第position个位置前插入元素e //position的取值范围为1≤position≤Length()+1 //position合法时返回SUCCESS,否则返回RANGE_ERROR { if(position<1||position>Length()+1) {//position范围错 returnRANGE_ERROR;//位置不合法 } else {//position合法 DblNode tmpPtr=GetElemPtr(position-1);//取出指向第position-1个结点的指针 nextPtr=tmpPtr->next;//nextPtr指向第position个结点 newPtr=newDblNode tmpPtr->next=newPtr;//修改向右的指针 nextPtr->back=newPtr;//修改向左的指针 curPosition=position;//设置当前位置的序号 curPtr=newPtr;//设置指向当前位置的指针 count++;//插入成功后元素个数加1 returnSUCCESS; } } template DblLinkList : DblLinkList(constDblLinkList //操作结果: 由线性表copy构造新线性表——复制构造函数模板 { intcopyLength=ccopy.Length();//copy的长度 ElemTypee; Init();//初始化线性表 for(intcurPosition=1;curPosition<=copyLength;curPosition++) {//复制数据元素 ccopy.GetElem(curPosition,e);//取出第curPosition个元素 Insert(Length()+1,e);//将e插入到当前线性表 } } template DblLinkList : operator=(constDblLinkList //操作结果: 将线性表copy赋值给当前线性表——重载赋值运算符 { if(&ccopy! =this) { intcopyLength=ccopy.Length();//copy的长度 ElemTypee; Clear();//清空当前线性表 for(intcurPosition=1;curPosition<=copyLength;curPosition++) {//复制数据元素 ccopy.GetElem(curPosition,e);//取出第curPosition个元素 Insert(Length()+1,e);//将e插入到当前线性表 } } return*this; } template voidSort(DblLinkList { //请补充完整 } intmain(void) { DblLinkList intx; //cout<<"随机输入一些数据,输入0时结束"< while(cin>>x&&x! =0) { la.Insert(la.Length()+1,x); } lb=la; //cout<<"排序前的数据是: "; lb.Traverse(Write cout< Sort //cout<<"排序后的数据是: "; la.Traverse(Write return0;//返回值0,返回操作系统 } 输入描述 随机的数据,以0作为输出结束标记。 输出描述 链表创建好后的数据,以及排序后链表中的数据。 样例输入 210350 样例输出 21035 23510 2.一元多项式问题6分 题目描述 符号多项式的操作是表处理的典型应用,在数学上一元n次多项式按升幂排列,可进行加、减、乘的运算。 请用单链表实现多项式的表示及三种运算操作。 思路提示: #include usingnamespacestd; enumStatusCode{SUCCESS,FAIL,UNDER_FLOW,OVER_FLOW,RANGE_ERROR,DUPLICATE_ERROR, NOT_PRESENT,ENTRY_INSERTED,ENTRY_FOUND,VISITED,UNVISITED}; //1结点类 //定义一个Node类,在线性链表类里要用到,见P32 //也可查找课件文件夹里的node.h文件,直接拷贝 //2线性链表类 //定义一个SimpleLinkList类,实现一些方法,见教材P32 //查找文件夹里的simple_lk_list.h //3多项式项类 //定义一个PolyItem类,成员有系数doublecoef和指数intexpn //在多项式类里要用到,见教材P56 //4多项式类 //定义一个Polynomial类,就是一个单链表, //只是实现了加减乘运算符的重载,见教材P57 //加法在ppt课件的例题里已经讲解了 //减法就是将第二项的所有系数取反,再调用加法 //乘法具体的讲解见参考教材 intmain(void) { inti,c,n,m; Polynomialfa,fb,fc;//用多项式类实例化3个对象 PolyItemit;//接收每一项数据所使用的临时变量 cin>>n; for(i=0;i { cin>>it.coef>>it.expn; fa.InsItem(it);//把每一项插入到多项式链表里 } cin>>m; for(i=0;i { cin>>it.coef>>it.expn; fb.InsItem(it); } while(cin>>c&&c) { if(c==1)fc=fa+fb; elseif(c==2)fc=fa-fb; elsefc=fa*fb; fc.Display(); cout< } return0;//返回值0,返回操作系统 } 输入描述 第一个多项式的项数n,每一项的系数和指数;第二个多项式的项数m,每一项的系数和指数。 分别用1、2、3代表加、减、乘三种运算,输入数字即执行具体的某一种运算。 输入0表示程序结束。 输出描述 输出运算结果,每种运算占一行,且用数字有序对升幂表示。 样例输入 3 123456 2 1234 1 2 3 2 1 0 样例输出 226456 56 14661481510 56 226456
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模板