类模板.docx

上传人:b****5 文档编号:5939868 上传时间:2023-01-02 格式:DOCX 页数:14 大小:18.16KB
下载 相关 举报
类模板.docx_第1页
第1页 / 共14页
类模板.docx_第2页
第2页 / 共14页
类模板.docx_第3页
第3页 / 共14页
类模板.docx_第4页
第4页 / 共14页
类模板.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

类模板.docx

《类模板.docx》由会员分享,可在线阅读,更多相关《类模板.docx(14页珍藏版)》请在冰豆网上搜索。

类模板.docx

类模板

信息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*back;//指向前驱的指针域

DblNode*next;//指向后继的指针域

//构造函数模板:

DblNode();//无数据的构造函数模板

DblNode(ElemTypeitem,

DblNode*linkBack=NULL,

DblNode*linkNext=NULL);//已知数据域和指针域建立结构

};

 

//双向链表结点类模板的实现部分

template

DblNode:

:

DblNode()

//操作结果:

构造指针域为空的结点

{

next=NULL;

}

template

DblNode:

:

DblNode(ElemTypeitem,

DblNode*linkBack,

DblNode*linkNext)

//操作结果:

构造一个数据域为item和指针域为linkBack和linkNext的结点

{

data=item;

back=linkBack;

next=linkNext;

}

//双向链表类模板

template

classDblLinkList

{

protected:

//循环链表实现的数据成员:

DblNode*head;//头结点指针

mutableintcurPosition;//当前位置的序号

mutableDblNode*curPtr;//指向当前位置的指针

intcount;//元素个数

//辅助函数模板:

DblNode*GetElemPtr(intposition)const;//返回指向第position个结点的指针

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&ccopy);//复制构造函数模板

DblLinkList&operator=(constDblLinkList&ccopy);//重载赋值运算符

DblNode*GetHeadPtr();

};

template

DblNode*DblLinkList:

:

GetHeadPtr()

{

returnhead;

}

//链表类模板的实现部分

template

DblNode*DblLinkList:

:

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*tmpPtr=head->next;tmpPtr!

=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;

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;

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;

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,*nextPtr,*newPtr;

tmpPtr=GetElemPtr(position-1);//取出指向第position-1个结点的指针

nextPtr=tmpPtr->next;//nextPtr指向第position个结点

newPtr=newDblNode(e,tmpPtr,nextPtr);//生成新结点

tmpPtr->next=newPtr;//修改向右的指针

nextPtr->back=newPtr;//修改向左的指针

curPosition=position;//设置当前位置的序号

curPtr=newPtr;//设置指向当前位置的指针

count++;//插入成功后元素个数加1

returnSUCCESS;

}

}

template

DblLinkList:

:

DblLinkList(constDblLinkList&ccopy)

//操作结果:

由线性表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&DblLinkList:

:

operator=(constDblLinkList&ccopy)

//操作结果:

将线性表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&L)

{

//请补充完整

}

 

intmain(void)

{

DblLinkListla,lb;

intx;

//cout<<"随机输入一些数据,输入0时结束"<

while(cin>>x&&x!

=0)

{

la.Insert(la.Length()+1,x);

}

lb=la;

//cout<<"排序前的数据是:

";

lb.Traverse(Write);

cout<

Sort(la);

//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

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1