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