数据结构 矩阵操作.docx
- 文档编号:4932036
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:33
- 大小:33.58KB
数据结构 矩阵操作.docx
《数据结构 矩阵操作.docx》由会员分享,可在线阅读,更多相关《数据结构 矩阵操作.docx(33页珍藏版)》请在冰豆网上搜索。
数据结构矩阵操作
运行时的显示界面,可选择相应操作
#include
//多用链表结点
template
structDblNode
{
ETdata;//结点数据域,存储该结点的数据部分
DblNode
DblNode
DblNode(){next=NULL;back=NULL;}//无参数结点构造函数,用于未给定参数时结点的初始化
};
//====================================================================================================================================
//
//链表类部分
//
//====================================================================================================================================
template
classLinkList
{
protected:
ETdataTmp;//用于临时存取数据,供成员函数使用
intcount,cTmp;//count用于计数表元素个数,即表长;cTmp用于临时计数用
DblNode
public:
LinkList(){count=cTmp=0;head=tail=pTmp=NULL;}
//链表构造函数
~LinkList(){Clear();}//链表析构函数
//链表相关操作
intLength(){returncount;}//用于获取当前标的长度
voidClear(){while(count)DelHead();}//表清空
voidShow();//输出表中现有的所有元素
voidReShow();//逆序输出表中现有的所有元素
DblNode
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
voidSUB(LinkList
//实现链表相减,将仅存在于A中的元素写入当前链表
voidADD(LinkList
//实现链表相加,将表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 : 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 pTmp->next=newDblNode 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 pTmp->next=pNext->next;//将第cTmp-1个结点的后继指向第cTmp个结点的后继 pNext->next->back=pTmp;//将第cTmp+1个结点的前驱指向第cTmp-1个结点 deletepNext;//将第cTmp个结点删除 count--;//表元素元素总数减一 } } template voidLinkList : operator=(LinkList {//赋值符“=”重载 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 { Clear();//对当前链表先清空 intcountA=1,countB; ETelemA,elemB; DblNode 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 { Clear();//对当前链表先清空 intcountA=1,countB=1; DblNode 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 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 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 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 Show(); break; case
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 矩阵操作 矩阵 操作