数据结构 矩阵操作.docx

上传人:b****3 文档编号:4932036 上传时间:2022-12-11 格式:DOCX 页数:33 大小:33.58KB
下载 相关 举报
数据结构 矩阵操作.docx_第1页
第1页 / 共33页
数据结构 矩阵操作.docx_第2页
第2页 / 共33页
数据结构 矩阵操作.docx_第3页
第3页 / 共33页
数据结构 矩阵操作.docx_第4页
第4页 / 共33页
数据结构 矩阵操作.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

数据结构 矩阵操作.docx

《数据结构 矩阵操作.docx》由会员分享,可在线阅读,更多相关《数据结构 矩阵操作.docx(33页珍藏版)》请在冰豆网上搜索。

数据结构 矩阵操作.docx

数据结构矩阵操作

运行时的显示界面,可选择相应操作

#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

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

当前位置:首页 > 法律文书 > 调解书

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

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