数据结构 矩阵操作.docx
《数据结构 矩阵操作.docx》由会员分享,可在线阅读,更多相关《数据结构 矩阵操作.docx(33页珍藏版)》请在冰豆网上搜索。
![数据结构 矩阵操作.docx](https://file1.bdocx.com/fileroot1/2022-12/11/f35408ba-196b-4a74-a063-54387b72eb69/f35408ba-196b-4a74-a063-54387b72eb691.gif)
数据结构矩阵操作
运行时的显示界面,可选择相应操作
#include
//多用链表结点
template
structDblNode
{
ETdata;//结点数据域,存储该结点的数据部分
DblNode*next;//结点指针域,指示下一个节点的位置
DblNode*back;//指向结点的前驱
DblNode(){next=NULL;back=NULL;}//无参数结点构造函数,用于未给定参数时结点的初始化
};
//====================================================================================================================================
//
//链表类部分
//
//====================================================================================================================================
template
classLinkList
{
protected:
ETdataTmp;//用于临时存取数据,供成员函数使用
intcount,cTmp;//count用于计数表元素个数,即表长;cTmp用于临时计数用
DblNode*head,*tail,*pTmp;//*head记录表头的位置;*tail记录表尾的位置;*pTmp记录每次操作结点的指针位置
public:
LinkList(){count=cTmp=0;head=tail=pTmp=NULL;}
//链表构造函数
~LinkList(){Clear();}//链表析构函数
//链表相关操作
intLength(){returncount;}//用于获取当前标的长度
voidClear(){while(count)DelHead();}//表清空
voidShow();//输出表中现有的所有元素
voidReShow();//逆序输出表中现有的所有元素
DblNode*GetPosP(intpostion);//获取指向第postion个位置结点的指针
voidHeadInsert(ET&e);//从表头插入元素
voidTailInsert(ET&e);//从表尾插入元素
voidInsert(intposition,ET&e);//向表中第postion个位置插入新的结点元素,元素总数加一
voidReTailInsert(intposition,ET&e);//重置表中第cTmp个位置元素的数据部分为e,元素总数不变
voidGetElem(intposition,ET&e);//从表中获取第cTmp元素,写入e中,由e输出
voidDelHead();//删除表头
voidDelTail();//删除表尾
voidDelElem(intposition);//删除表中第cTmp个位置的元素.元素减一
voidoperator=(LinkList&cop);//赋值符重载函数,实现链表的复制功能
voidSUB(LinkList&A,LinkList&B);
//实现链表相减,将仅存在于A中的元素写入当前链表
voidADD(LinkList&A,LinkList&B);
//实现链表相加,将表A表B中的元素依次写入当前链表
voidSeprate();//奇偶分离函数,使得所有奇数均排列在偶数前
voidSort();//对链表中的元素进行排序
voidKillDouble();//对链表中的元素进行排序去重
voidCinHelp();//提示输入函数,用于实现键盘输入交互式操作
};
template
voidLinkList:
:
Show()
{
cTmp=count;
pTmp=head;//指向头指针的第一个后继
cout<";
while(cTmp>0&&count>0)//当表中有元素时
{
dataTmp=pTmp->data;
cout<cTmp--;//计数元素总数减一
pTmp=pTmp->next;//每输出一位向后移动一位
}
cout<}
template
voidLinkList:
:
ReShow()
{
cTmp=count;
pTmp=tail;//指向头指针的第一个后继
cout<";
while(cTmp>0&&count>0)//当表中有元素时
{
dataTmp=pTmp->data;
cout<cTmp--;//计数元素总数减一
pTmp=pTmp->back;//每输出一位向后移动一位
}
cout<}
template
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->next;cTmp--;}
}
else
{//后count/2用back指针访问
cTmp=count-cTmp+1;
pTmp=tail;//不断指向下一个结点,头指针所在位置为零
while(cTmp>1){pTmp=pTmp->back;cTmp--;}
}
}
returnpTmp;
}
template
voidLinkList:
:
ReTailInsert(intposition,ET&e)
{
cTmp=position;
if(count==0)cout<elseGetPosP(cTmp)->data=e;//重置表中元素,元素总数不变
}
template
voidLinkList:
:
HeadInsert(ET&e)
{
if(count==0)//向表中插入第一个结点元素
{
head=newDblNode;
tail=pTmp=head;
head->data=e;
count++;
}
else
{
head->back=newDblNode;
head->back->next=head;
head=head->back;
head->data=e;
count++;
}
}
template
voidLinkList:
:
TailInsert(ET&e)
{
if(count==0)//向表中插入第一个结点元素
{
tail=newDblNode;
head=pTmp=tail;
tail->data=e;
count++;
}
else
{
tail->next=newDblNode;
pTmp=tail->next;
pTmp->back=tail;
tail=pTmp;
tail->data=e;
count++;
}
}
template
voidLinkList:
:
Insert(intposition,ET&e)
{//在第pos个位置插入一个新结点
intpos=position;//因为此成员函数调用了获取指针位置函数GetPosP(),而该函数使用了cTmp计数区间,故需使用其他空间计数
if(pos<1)cout<请确保输入元素位置大于0"<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->next;//获取指向第pos个结点的指针
pTmp->next=newDblNode;//在pos-1后生成新结点
pTmp->next->back=pTmp;//新结点前驱为第pos-1个结点
pTmp->next->next=posNext;//新结点后继为原pos个结点
pTmp->next->data=e;
posNext->back=pTmp->next;//原pos个位置的结点前驱指向新结点
count++;
}
}
}
template
voidLinkList:
:
GetElem(intposition,ET&e)
{
cTmp=position;
if(cTmp<1)cout<请确保输入元素位置大于0"<elsee=GetPosP(cTmp)->data;//获取指向第cTmp个结点的数据部分
}
template
voidLinkList:
:
DelHead()
{
if(count==0)cout<当前表已为空"<else
{
pTmp=head->next;
deletehead;
head=pTmp;
count--;
}
}
template
voidLinkList:
:
DelTail()
{
if(count==0)cout<当前表已为空"<else
{
pTmp=tail->back;
deletetail;
tail=pTmp;
count--;
}
}
template
voidLinkList:
:
DelElem(intpositon)
{//删除在第cTmp个位置的结点
cTmp=positon;
if(cTmp>count)cTmp=cTmp%count;
if(count==0)cout<elseif(count==1||cTmp==1)DelHead();
elseif(cTmp==count)DelTail();
else
{
pTmp=GetPosP(cTmp-1);//获取指向第cTmp-1个结点的指针
DblNode*pNext=pTmp->next;//获取指向第cTmp个结点的指针
pTmp->next=pNext->next;//将第cTmp-1个结点的后继指向第cTmp个结点的后继
pNext->next->back=pTmp;//将第cTmp+1个结点的前驱指向第cTmp-1个结点
deletepNext;//将第cTmp个结点删除
count--;//表元素元素总数减一
}
}
template
voidLinkList:
:
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->data;//取出后继结点中的数据
TailInsert(dataTmp);//生成新结点
cTmp--;//计数元素总数减一
cop.pTmp=cop.pTmp->next;//向后继结点移动一位
}
}
}
template
voidLinkList:
:
SUB(LinkList&A,LinkList&B)
{
Clear();//对当前链表先清空
intcountA=1,countB;
ETelemA,elemB;
DblNode*posA=A.head,*posB;
while(countA<=A.count)//当表A中还有元素时
{
countB=1;
posB=B.head;//从B表表头开始比对
elemA=posA->data;//依次获取A表中元素的数据部分
posA=posA->next;
countA++;
while(countB<=B.count)//当表B中还有元素时
{
elemB=posB->data;
posB=posB->next;
if(elemA==elemB)break;//将A中的每一个元素分别与B中的每一个元素进行比较,若相同则中断本次循环
countB++;
}
if(countB>B.count)TailInsert(elemA);//若与B中所有元素均不相同时将该元素写入当前表中
}
}
template
voidLinkList:
:
ADD(LinkList&A,LinkList&B)
{
Clear();//对当前链表先清空
intcountA=1,countB=1;
DblNode*posA=A.head,*posB=B.head;
while(countA<=A.count)//当表A中还有元素时
{
TailInsert(posA->data);//依次获取A表中元素的数据部分,写入当前链表
posA=posA->next;
countA++;
}
while(countB<=B.count)//当表B中还有元素时
{
TailInsert(posB->data);//依次获取B表中元素的数据部分
posB=posB->next;
countB++;
}
}
template
voidLinkList:
:
Seprate()//奇偶分离函数,使得所有奇数均排列在偶数前
{
inti=0,jb=0,jc=0;
int*B=newint[count],*C=newint[count];//将链表中的元素按奇数、偶数分别存放到数组B、C中
DblNode*pos=head;
ETtmp;
while(i{
tmp=pos->data;
pos=pos->next;
if(tmp%2==1){B[jb]=tmp;jb++;}//jb用于计数奇数的个数
else{C[jc]=tmp;jc++;}//jc用于计数偶数的个数
i++;
}
i=0;
pos=head;
while(i{
pos->data=B[i];
pos=pos->next;
i++;
}
i=0;
while(i{
pos->data=C[i];
pos=pos->next;
i++;
}
}
template
voidLinkList:
:
Sort()//对链表中的元素进行排序
{
inti=1,j;
DblNode*posi=head,*posj;//初始时让posi指向第一个元素
ETtmp;
while(i<=count-1)//i循环至count-1
{
j=i+1;
posj=posi->next;//初始时让posj指向第二个元素
while(j<=count)//j循环至count
{
if(posi->data>posj->data)//若前面的元素大于后面的元素,则交换两元素的数据部分
{tmp=posi->data;posi->data=posj->data;posj->data=tmp;}
posj=posj->next;
j++;
}
posi=posi->next;
i++;
}
}
template
voidLinkList:
:
KillDouble()
{
Sort();//对链表中的元素进行排序
inti=1;
DblNode*pos=head;//初始时让pos指向第一个元素
while(i{
if(pos->data==pos->next->data){DelElem(i);}
//若第i个位置的元素和i+1个位置的元素数据部分相同时删除第i个元素
else{i++;pos=pos->next;}//否则指针指向下一个元素
}
}
template
voidLinkList:
:
CinHelp()
{
intchoice=1,tmp;
while(choice)
{
cout<"<";
cin>>choice;
switch(choice)
{
case1:
cout<";
cin>>tmp;
choice=count;//链表中原有的元素数不应在计数范围内
cout<"<while(count>dataTmp;TailInsert(dataTmp);}
Show();
break;
case