数据结构 矩阵操作文档格式.docx
《数据结构 矩阵操作文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构 矩阵操作文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
head=tail=pTmp=NULL;
}
//链表构造函数
~LinkList(){Clear();
}//链表析构函数
//链表相关操作
intLength(){returncount;
}//用于获取当前标的长度
voidClear(){while(count)DelHead();
}//表清空
voidShow();
//输出表中现有的所有元素
voidReShow();
//逆序输出表中现有的所有元素
*GetPosP(intpostion);
//获取指向第postion个位置结点的指针
voidHeadInsert(ET&
e);
//从表头插入元素
voidTailInsert(ET&
//从表尾插入元素
voidInsert(intposition,ET&
//向表中第postion个位置插入新的结点元素,元素总数加一
voidReTailInsert(intposition,ET&
//重置表中第cTmp个位置元素的数据部分为e,元素总数不变
voidGetElem(intposition,ET&
//从表中获取第cTmp元素,写入e中,由e输出
voidDelHead();
//删除表头
voidDelTail();
//删除表尾
voidDelElem(intposition);
//删除表中第cTmp个位置的元素.元素减一
voidoperator=(LinkList<
&
cop);
//赋值符重载函数,实现链表的复制功能
voidSUB(LinkList<
&
A,LinkList<
B);
//实现链表相减,将仅存在于A中的元素写入当前链表
voidADD(LinkList<
//实现链表相加,将表A表B中的元素依次写入当前链表
voidSeprate();
//奇偶分离函数,使得所有奇数均排列在偶数前
voidSort();
//对链表中的元素进行排序
voidKillDouble();
//对链表中的元素进行排序去重
voidCinHelp();
//提示输入函数,用于实现键盘输入交互式操作
voidLinkList<
:
Show()
{
cTmp=count;
pTmp=head;
//指向头指针的第一个后继
cout<
<
endl<
"
当前链表中共有"
count<
个元素,"
依次为:
"
;
while(cTmp>
0&
count>
0)//当表中有元素时
{
dataTmp=pTmp->
data;
cout<
dataTmp<
//将后继的数据部分逐一输出
cTmp--;
//计数元素总数减一
pTmp=pTmp->
next;
//每输出一位向后移动一位
}
endl;
ReShow()
pTmp=tail;
back;
DblNode<
*LinkList<
GetPosP(intpostion)
cTmp=postion;
if(cTmp<
1)cout<
操作无效!
请确保输入元素位置大于0"
else
if(cTmp==1)returnhead;
if(cTmp>
count){cTmp=cTmp%count;
if(cTmp==0)cTmp=count;
//当输入位置大于元素总数时取余数得对应位置
if(cTmp<
=count/2+1)//前count/2用next指针访问
{
pTmp=head;
//不断指向下一个结点,头指针所在位置为1
while(cTmp>
1){pTmp=pTmp->
cTmp--;
}
else
{//后count/2用back指针访问
cTmp=count-cTmp+1;
pTmp=tail;
//不断指向下一个结点,头指针所在位置为零
}
returnpTmp;
ReTailInsert(intposition,ET&
e)
cTmp=position;
if(count==0)cout<
表当前为空,无元素可修改"
elseGetPosP(cTmp)->
data=e;
//重置表中元素,元素总数不变
HeadInsert(ET&
if(count==0)//向表中插入第一个结点元素
{
head=newDblNode<
tail=pTmp=head;
head->
count++;
back=newDblNode<
back->
next=head;
head=head->
TailInsert(ET&
tail=newDblNode<
head=pTmp=tail;
tail->
next=newDblNode<
pTmp=tail->
pTmp->
back=tail;
tail=pTmp;
Insert(intposition,ET&
{//在第pos个位置插入一个新结点
intpos=position;
//因为此成员函数调用了获取指针位置函数GetPosP(),而该函数使用了cTmp计数区间,故需使用其他空间计数
if(pos<
if(count==0)HeadInsert(e);
//当元素总数为0时
else
if(pos>
count)//当输入位置大于元素总数时
if(pos%count==1)pos=count+1;
//输入位置大于元素总数且取余后为1,将pos置为插入尾部
elseif(pos%count==0)pos=count;
elsepos=pos%count;
if(pos==1)HeadInsert(e);
elseif(pos==count+1)TailInsert(e);
else
pTmp=GetPosP(pos-1);
//获取指向第pos-1个结点的指针
DblNode<
*posNext=pTmp->
//获取指向第pos个结点的指针
pTmp->
//在pos-1后生成新结点
next->
back=pTmp;
//新结点前驱为第pos-1个结点
next=posNext;
//新结点后继为原pos个结点
posNext->
back=pTmp->
//原pos个位置的结点前驱指向新结点
count++;
GetElem(intposition,ET&
elsee=GetPosP(cTmp)->
//获取指向第cTmp个结点的数据部分
DelHead()
操作无效!
当前表已为空"
pTmp=head->
deletehead;
head=pTmp;
count--;
DelTail()
deletetail;
DelElem(intpositon)
{//删除在第cTmp个位置的结点
cTmp=positon;
if(cTmp>
count)cTmp=cTmp%count;
elseif(count==1||cTmp==1)DelHead();
elseif(cTmp==count)DelTail();
pTmp=GetPosP(cTmp-1);
//获取指向第cTmp-1个结点的指针
*pNext=pTmp->
//获取指向第cTmp个结点的指针
next=pNext->
//将第cTmp-1个结点的后继指向第cTmp个结点的后继
pNext->
//将第cTmp+1个结点的前驱指向第cTmp-1个结点
deletepNext;
//将第cTmp个结点删除
//表元素元素总数减一
operator=(LinkList<
cop)
{//赋值符“=”重载
Clear();
//对当前链表先清空
if(cop.count>
0)
cTmp=cop.count;
cop.pTmp=cop.head;
//复制cop的头指针注意:
cop.pTmp不可换做pTmp?
否则运行报错
while(cTmp>
0)//当表中还有元素时
dataTmp=cop.pTmp->
//取出后继结点中的数据
TailInsert(dataTmp);
//生成新结点
cTmp--;
//计数元素总数减一
cop.pTmp=cop.pTmp->
//向后继结点移动一位
SUB(LinkList<
B)
//对当前链表先清空
intcountA=1,countB;
ETelemA,elemB;
*posA=A.head,*posB;
while(countA<
=A.count)//当表A中还有元素时
countB=1;
posB=B.head;
//从B表表头开始比对
elemA=posA->
//依次获取A表中元素的数据部分
posA=posA->
countA++;
while(countB<
=B.count)//当表B中还有元素时
elemB=posB->
posB=posB->
if(elemA==elemB)break;
//将A中的每一个元素分别与B中的每一个元素进行比较,若相同则中断本次循环
countB++;
if(countB>
B.count)TailInsert(elemA);
//若与B中所有元素均不相同时将该元素写入当前表中
ADD(LinkList<
intcountA=1,countB=1;
*posA=A.head,*posB=B.head;
TailInsert(posA->
data);
//依次获取A表中元素的数据部分,写入当前链表
while(countB<
=B.count)//当表B中还有元素时
TailInsert(posB->
//依次获取B表中元素的数据部分
posB=posB->
countB++;
Seprate()//奇偶分离函数,使得所有奇数均排列在偶数前
inti=0,jb=0,jc=0;
int*B=newint[count],*C=newint[count];
//将链表中的元素按奇数、偶数分别存放到数组B、C中
*pos=head;
ETtmp;
while(i<
count)
tmp=pos->
pos=pos->
if(tmp%2==1){B[jb]=tmp;
jb++;
}//jb用于计数奇数的个数
else{C[jc]=tmp;
jc++;
}//jc用于计数偶数的个数
i++;
i=0;
pos=head;
jb)//将奇数依次存回到链表中
pos->
data=B[i];
jc)//将偶数依次存回到链表中奇数之后
data=C[i];
Sort()//对链表中的元素进行排序
inti=1,j;
*posi=head,*posj;
//初始时让posi指向第一个元素
=count-1)//i循环至count-1
j=i+1;
posj=posi->
//初始时让posj指向第二个元素
while(j<
=count)//j循环至count
if(posi->
data>
posj->
data)//若前面的元素大于后面的元素,则交换两元素的数据部分
{tmp=posi->
posi->
data=posj->
data=tmp;
posj=posj->
j++;
posi=posi->
KillDouble()
Sort();
//对链表中的元素进行排序
inti=1;
//初始时让pos指向第一个元素
count)//i循环至count-1
if(pos->
data==pos->
data){DelElem(i);
//若第i个位置的元素和i+1个位置的元素数据部分相同时删除第i个元素
else{i++;
pos=pos->
}//否则指针指向下一个元素
CinHelp()
intchoice=1,tmp;
while(choice)
请选择链表相关操作:
1.添加新的元素2.插入数据元素3.删除表元素4.修改元素5.逆序输出表元素"
6.链表清空7.数据链表奇前偶后分离8.数据链表元素排序9.数据链表元素排序去重"
选择并以Enter确认:
cin>
>
choice;
switch(choice)
case1:
cout<
请输入要输入的表元素个数Enter确认:
cin>
tmp;
choice=count;
//链表中原有的元素数不应在计数范围内
请依次输入"
tmp<
个数据元素空格间隔Enter确认:
while(count<
tmp+choice){cin>
dataTmp;
TailInsert(dataTmp);
Show();
break;
case