版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
自學(xué)數(shù)據(jù)結(jié)構(gòu)課件--線性表順序表定義:將線性表中的元素相繼存放在一個(gè)連續(xù)的存儲(chǔ)空間中。
存儲(chǔ)結(jié)構(gòu):數(shù)組。特點(diǎn):線性表的順序存儲(chǔ)方式。存取方式:順序存取、隨機(jī)存取順序存儲(chǔ)結(jié)構(gòu)示意圖458990674078
012345順序表的存儲(chǔ)方式:LOC(ai+1)=LOC(ai)+lLOC(ai)=LOC(a1)+(i-1)*l
a1
a2
…ai………an12…i………n
aa+l…a+(i-1)*l………a+(n-1)*l
idle順序表(SeqList)的類型定義
#defineListSize100//最大允許長(zhǎng)度
typedefintListData;
typedefstruct
{
ListData*data;//存儲(chǔ)空間基址
intlength; //當(dāng)前元素個(gè)數(shù)
}
SeqList;順序表基本運(yùn)算初始化
voidInitList(SeqList&L){L.data=(ListData*)malloc(ListSize*sizeof(ListData));if(L.data==NULL){printf(“存儲(chǔ)分配失敗!\n”);exit(1);}L.length=0;}按值查找:找x在表中的位置,若查找成功,返回表項(xiàng)的位置,否則返回-1
intFind(SeqList&L,ListDatax){inti=0;while(i<L.length&&L.data[i]!=x)i++;if(i<L.length)returni;elsereturn-1;}順序搜索圖示253457164809
012345data搜索
16i253457164809
i253457164809
i253457164809
i搜索成功2534571648
01234data搜索50i2534571648
i2534571648
i2534571648
i2534571648
i搜索失敗搜索成功的平均比較次數(shù)
若搜索概率相等,則
搜索不成功數(shù)據(jù)比較n
次按值查找:判斷x是否在表中
intIsIn(SeqList&L,ListDatax){ inti=0, found=0; while(i<L.length&&!found) if(L.data[i]!=x)i++; elsefound=1;returnfound;}求表的長(zhǎng)度
intLength(SeqList&L){returnL.length;}提取函數(shù):在表中提取第i個(gè)元素的值
ListDataGetData(SeqList&L,inti){if(i>=0&&i<L.length)returnL.data[i];elseprintf(“參數(shù)
i不合理!\n”); }
按值查找:尋找x的后繼
intNext(SeqList&L,ListDatax){inti=Find(x);if(i>0&&i<L.length)returni+1; elsereturn-1;}尋找x的前驅(qū)
intPrevious(SeqList&L,ListDatax){inti=Find(x);if(i>0&&i<L.length)returni-1; elsereturn-1;}插入25345716480963
0123456750插入x2534575016480963
0123456750i順序表插入時(shí),平均數(shù)據(jù)移動(dòng)次數(shù)AMN在各表項(xiàng)插入概率相等時(shí)順序表的插入
intInsert(SeqList&L,ListDatax,inti){
//在表中第i個(gè)位置插入新元素x
if(i<0||i>L.length||L.length==ListSize)return0;//插入不成功
else{ for(intj=L.length;j>i;j--) L.data[j]=L.data[j-1]; L.data[i]=x;L.length++; return1;//插入成功
}}刪除253457501648096316刪除
x2534575048096301234567順序表刪除平均數(shù)據(jù)移動(dòng)次數(shù)AMN在各表項(xiàng)刪除概率相等時(shí)順序表的刪除
intDelete(SeqList&L,ListDatax){
//在表中刪除已有元素x
inti=Find(L,x); //在表中查找xif(i>=0){ L.length--; for(intj=i;j<L.length;j++) L.data[j]=L.data[j+1];return1; //成功刪除
} return0;//表中沒有x}順序表的應(yīng)用:集合的“并”運(yùn)算voidUnion(SeqList&A,SeqList&B){intn=Length(A);intm=Length(B);for(inti=0;i<m;i++){ intx=GetData(B,i);//在B中取一元素
intk=Find(A,x);//在A中查找它
if(k==-1)//若未找到插入它
{Insert(A,x,n);n++;}}}集合的“交”運(yùn)算
voidIntersection(SeqList&A,SeqList&B){intn=Length(A);intm=Length(B);inti=0;while(i<n){intx=GetData(A,i);//在A中取一元素
intk=Find(B,x);//在B中查找它
if(k==-1){Delete(A,i);n--;} elsei++;//未找到在A中刪除它
}}順序表(SeqList)類的定義template<classType> classSeqList{Type*data;//順序表存儲(chǔ)數(shù)組
intMaxSize; //最大允許長(zhǎng)度
intlast; //當(dāng)前最后元素下標(biāo)public: SeqList(intMaxSize=defaultSize); ~SeqList(){delete[]data;}
intLength()const
{returnlast+1;
}C++描述
intFind(Type&x)const;//查找
intLocate(inti)const; //定位
intInsert(Type&x,inti);//插入
intRemove(Type
&x); //刪除
intNext(Type
&x); //后繼
intPrior(Type
&x);//前驅(qū)
intIsEmpty(){returnlast==-1;
} intIsFull(){returnlast==MaxSize-1;
}TypeGet(inti){//提取
returni<0||i>last?NULL:data[i];}}
C++描述順序表部分公共操作的實(shí)現(xiàn)
template<classType>
//構(gòu)造函數(shù)
SeqList<Type>::SeqList(intsz){if(sz>0){ MaxSize=sz;last=-1; data=newType[MaxSize];
if(data==NULL){MaxSize=0;last=-1;return;}
}}C++描述template<classType> intSeqList<Type>::Find(Type
&x)const{//搜索函數(shù):在順序表中從頭查找結(jié)點(diǎn)值等于//給定值x的結(jié)點(diǎn)
inti=0;
while(i<=last&&data[i]!=x)i++;
if(i>last)return-1;
elsereturni; }C++描述template<classType>intSeqList<Type>::Insert(Type&x,inti){//在表中第
i個(gè)位置插入新元素
x
if(i<0
||
i>last+1
||
last==MaxSize-1)
return0;//插入不成功
else{last++;
for(intj=last;j>i;j--)data[j]=data[j-1]; data[i]=x;return1;//插入成功
}}C++描述
template<classType>intSeqList<Type>::Remove(Type&x){
//在表中刪除已有元素
x
inti=Find(x); //在表中搜索
x
if(i>=0){ last--;
for(intj=i;j<=last;j++)data[j]=data[j+1];
return1; //成功刪除
} return0;//表中沒有
x}C++描述順序表的應(yīng)用:集合的“并”運(yùn)算
voidUnion(SeqList<int>
&A,SeqList<int>
&B){
intn=A.Length();
intm=B.Length();
for(inti=0;i<m;i++){ intx=B.Get(i);//在B中取一元素
intk=A.Find(x);//在A中搜索它
if(k==-1)//若未找到插入它
{A.Insert(n,x);n++;}}}C++描述順序表的應(yīng)用:集合的“交”運(yùn)算
voidIntersection(SeqList<int>
&A,SeqList<int>
&B){
intn=A.Length();
intm=B.Length();inti=0;
while(i<n){intx=A.Get(i);//在A中取一元素
intk=B.Find(x);//在B中搜索它
if(k==-1){A.Remove(i);n--;} elsei++;//未找到在A中刪除它
}}C++描述鏈表(LinkedList)鏈表是線性表的鏈接存儲(chǔ)表示單鏈表靜態(tài)鏈表循環(huán)鏈表雙向鏈表單鏈表(SinglyLinkedList)定義:用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。例如:線性表ZHOU,ZHAO,SUN,WU,WANG,ZHANG,LI數(shù)據(jù)域指針域ZHANG13WANG1LInullZHAO37WU7ZHOU19SUN25存儲(chǔ)地址17131925313731頭指針表中節(jié)點(diǎn)位置6572413每個(gè)元素由結(jié)點(diǎn)(Node)構(gòu)成, 它包括兩個(gè)域:數(shù)據(jù)域Data和指針域Linkdatalink存儲(chǔ)結(jié)構(gòu):鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)特點(diǎn):存儲(chǔ)單元可以不連續(xù)。存取方式:順序存取。Node單鏈表結(jié)構(gòu)單鏈表的類型定義typedefcharListData;typedefstructnode{//鏈表結(jié)點(diǎn)
ListDatadata; //結(jié)點(diǎn)數(shù)據(jù)域
structnode*link;//結(jié)點(diǎn)鏈域}ListNode;typedefListNode*LinkList;//鏈表頭指針LinkListfirst;//鏈表頭指針單鏈表的類定義多個(gè)類表達(dá)一個(gè)概念(單鏈表)。鏈表結(jié)點(diǎn)(ListNode)類鏈表(List)類鏈表游標(biāo)(Iterator)類定義方式復(fù)合方式嵌套方式
繼承方式
classList;
//鏈表類定義(復(fù)合方式)
classListNode{
//鏈表結(jié)點(diǎn)類
friendclassList;
//鏈表類為其友元類
private:
intdata;
//結(jié)點(diǎn)數(shù)據(jù),整型
ListNode*link;
//結(jié)點(diǎn)指針
};classList{
//鏈表類
private:ListNode*first,*last;
//表頭指針};classList{
//鏈表類定義(嵌套方式)private:
classListNode{
//嵌套鏈表結(jié)點(diǎn)類
public:
intdata;
ListNode*link;
};ListNode*first,*last;
//表頭指針public:
//鏈表操作………};鏈表類和鏈表結(jié)點(diǎn)類定義(繼承方式)classListNode{
//鏈表結(jié)點(diǎn)類
protected:
intdata;
ListNode*link;
};classList:public
classListNode{
//鏈表類,繼承鏈表結(jié)點(diǎn)類的數(shù)據(jù)和操作
private:ListNode*first,*last;
//表頭指針};單鏈表的基本運(yùn)算插入(三種情況)
第一種情況:在第一個(gè)結(jié)點(diǎn)前插入
newnode->link=first;first=newnode;(插入前)(插入后)
firstnewnodenewnodefirst第二種情況:在鏈表中間插入
newnode->link=p->link; p->link=newnode;(插入前)(插入后)newnodepnewnodep第三種情況:在鏈表末尾插入
newnode->link=p->link; p->link=newnode;p(插入前)(插入后)newnodenewnodep算法描述intList::Insert(intx,inti){//在鏈表第
i個(gè)結(jié)點(diǎn)處插入新元素
x
ListNode*p=first;for(
k=0;k<i-1;k++)
//找第i-1個(gè)結(jié)點(diǎn)
if(p==NULL)break;
elsep=p->link;
if(p==NULL&&first!=NULL){
cout<<“無效的插入位置!\n”;return0;}
ListNode*newnode=
//創(chuàng)建新結(jié)點(diǎn)
newListNode(x,NULL);
if(first==NULL||i==0){
//插在表前
newnode->link=first; if(first==NULL)last=newnode;
first=newnode;}else{
//插在表中或末尾
newnode->link=p->link;
if(p->link==NULL)last=newnode;
p->link=newnode;}
return1;
}刪除 在單鏈表中刪除ai結(jié)點(diǎn)
q=p->link; p->link=q->link;刪除前刪除后ai-1aiai+1pqpai-1ai+1aiintList::Remove(inti){//在鏈表中刪除第i個(gè)結(jié)點(diǎn)
ListNode*p,*q;if(i==0)
//刪除表中第
1個(gè)結(jié)點(diǎn)
{q=first;p=first=first->link;}else{
p=first; intk=0;
//找第i-1個(gè)結(jié)點(diǎn)
while(p!=NULL&&k<i-1)
{p=p->link;k++;}if(p==NULL||p->link==NULL){cout<<“無效的刪除位置!\n”;return0;
}
else{
//刪除表中或表尾元素
q=p->link;
//重新鏈接
p->link=q->link;} if(
q==last)last=p; //可能修改last
Typex=q->data;deleteq;
//刪除q
returnx;
//返回第i個(gè)結(jié)點(diǎn)的值
}帶表頭結(jié)點(diǎn)的單鏈表表頭結(jié)點(diǎn)位于表的最前端,本身不帶數(shù)據(jù),僅標(biāo)志表頭。設(shè)置表頭結(jié)點(diǎn)的目的:簡(jiǎn)化鏈表操作的實(shí)現(xiàn)。非空表空表^ana1firstfirst^插入
q->link=p->link; p->link=q;firstqfirstqfirstq^firstq^pppp插入前插入后表頭表尾qq插入pp表中intInsert(LinkListfirst,ListDatax,inti){//將新元素x插入在鏈表中第i號(hào)結(jié)點(diǎn)位置
ListNode*p=Locate(first,i-1);if(p==NULL)return0; //參數(shù)i值不合理返回0ListNode*newnode=//創(chuàng)建新結(jié)點(diǎn)
(ListNode*)malloc(sizeof(ListNode));newnode->data=x;newnode->link=p->link;//鏈入
p->link=newnode;return1; }刪除
q=p->link;p->link=q->link;deleteq;刪除前first(非空表)(空表)first^firstpq^pqfirst刪除后intdelete(LinkListfirst,inti){ //將鏈表第i號(hào)元素刪去
ListNode*p,*q p=Locate(first,i-1);//尋找第i-1個(gè)結(jié)點(diǎn)
if(p==NULL||p->link==NULL) return0;//i值不合理或空表
q=p->link; p->link=q->link;//刪除結(jié)點(diǎn)
free(q); //釋放
return1;}前插法建立單鏈表從一個(gè)空表開始,重復(fù)讀入數(shù)據(jù):生成新結(jié)點(diǎn)將讀入數(shù)據(jù)存放到新結(jié)點(diǎn)的數(shù)據(jù)域中將該新結(jié)點(diǎn)插入到鏈表的前端直到讀入結(jié)束符為止。firstqfirstq^^LinkListcreateListF(void){charch;ListNode*q;LinkListhead=//建立表頭結(jié)點(diǎn)(LinkList)malloc(sizeof(ListNode));head->link=NULL;while((ch=getchar())!=‘\n’){q=(ListNode*)malloc(sizeof(ListNode));q->data=ch;//建立新結(jié)點(diǎn)
q->link=head->link;//插入到表前端
head->link=q;}returnhead;}后插法建立單鏈表每次將新結(jié)點(diǎn)加在鏈表的表尾;尾指針r,總是指向表中最后一個(gè)結(jié)點(diǎn),新結(jié)點(diǎn)插在它的后面;^qfirst^r^first^rLinkListcreateListR(void){charch;LinkListhead=//建立表頭結(jié)點(diǎn)(LinkList)malloc(sizeof(ListNode));ListNode*q,*r=head; while((ch=getchar())!=‘\n’){q=(ListNode*)malloc(sizeof(ListNode));q->data=ch;//建立新結(jié)點(diǎn)
r->link=q;r=q;
//插入到表末端}
r->link=NULL;
returnhead;}單鏈表清空voidmakeEmpty(LinkListfirst){//刪去鏈表中除表頭結(jié)點(diǎn)外的所有其它結(jié)點(diǎn)
ListNode*q;while(first->link!=NULL){//當(dāng)鏈不空時(shí),循環(huán)逐個(gè)刪去所有結(jié)點(diǎn)
q=first->link;first->link=q->link; free(q);//釋放
} last=first;}計(jì)算單鏈表長(zhǎng)度intLength(LinkListfirst){ListNode*p=first->link;//指針p指示第一個(gè)結(jié)點(diǎn)
intcount=0;while(p!=NULL){//逐個(gè)結(jié)點(diǎn)檢測(cè)
p=p->link;count++;} returncount;}
按值查找ListNode*Find(LinkListfirst,ListDatavalue){ //在鏈表中從頭搜索其數(shù)據(jù)值為value的結(jié)點(diǎn)
ListNode*p=first->link;
//指針p指示第一個(gè)結(jié)點(diǎn)
while(p!=NULL&&p->data!=value)p=p->link;returnp;}按序號(hào)查找(定位)
ListNode*Locate(LinkListfirst,inti){//返回表中第i個(gè)元素的地址
if(i<0)returnNULL;ListNode*p=first;intk=0;while(p!=NULL&&k<i){p=p->link;k++;} //找第i個(gè)結(jié)點(diǎn)
if(k==i)returnp;//返回第i個(gè)結(jié)點(diǎn)地址
elsereturnNULL;}1ZHANG2WANG6LI5ZHAO5WU-1CHEN31ZHANG2WANG3LI4ZHAO5WU-101234560123456修改前(插入chen,刪除zhao)修改后用一維數(shù)組描述線性鏈表靜態(tài)鏈表定義constintMaxSize=100;//靜態(tài)鏈表大小typedefintListData;typedefstructnode{//靜態(tài)鏈表結(jié)點(diǎn)
ListDatadata;
intlink;}SNode;typedefstruct{//靜態(tài)鏈表
SNodeNodes[MaxSize];intnewptr; //當(dāng)前可分配空間首地址}SLinkList;鏈表空間初始化voidInitList(SLinkList*SL){SL->Nodes[0].link=1;SL->newptr=1;//當(dāng)前可分配空間從1開始
//建立帶表頭結(jié)點(diǎn)的空鏈表
for(inti=1;i<MaxSize-1;i++)SL->Nodes[i].link=i+1;//構(gòu)成空閑鏈接表
SL->Nodes[MaxSize-1].link=-1;
//鏈表收尾}在靜態(tài)鏈表中查找具有給定值的結(jié)點(diǎn)intFind(SLinkListSL,ListDatax){intp=SL.Nodes[0].link;//指針p指向鏈表第一個(gè)結(jié)點(diǎn)
while(p!=-1)//逐個(gè)查找有給定值的結(jié)點(diǎn)
if(SL.Nodes[p].data!=x)p=SL.Nodes[p].link;elsebreak; returnp;}在靜態(tài)鏈表中查找第i個(gè)結(jié)點(diǎn)intLocate(SLinkListSL,inti){if(i<0)return-1;//參數(shù)不合理
intj=0,p=SL.Nodes[0].link;while(p!=-1&&j<i){//循環(huán)查找第i號(hào)結(jié)點(diǎn)
p=SL.Nodes[p].link;j++;}if(i==0)return0;returnp;}在靜態(tài)鏈表第i個(gè)結(jié)點(diǎn)處插入一個(gè)新結(jié)點(diǎn)intInsert(SLinkList*SL,inti,ListDatax){intp=Locate(SL,i-1);if(p==-1)return0;//找不到結(jié)點(diǎn)
intq=SL->newptr;//分配結(jié)點(diǎn)
SL->newptr=SL->Nodes[SL->newptr].link;SL->Nodes[q].data=x;
SL->Nodes[q].link=SL.Nodes[p].link;SL->Nodes[p].link=q;
//插入
return1;}在靜態(tài)鏈表中釋放第i個(gè)結(jié)點(diǎn)intRemove(SLinkList*SL,inti){intp=Locate(SL,i-1);if(p==-1)return0;//找不到結(jié)點(diǎn)
intq=SL->Nodes[p].link;//第i號(hào)結(jié)點(diǎn)
SL->Nodes[p].link=SL->Nodes[q].link;SL->Nodes[q].link=SL->newptr;//釋放
SL->newptr=q;return1;}循環(huán)鏈表(CircularList)特點(diǎn):最后一個(gè)結(jié)點(diǎn)的link指針不為NULL,而是指向頭結(jié)點(diǎn)。只要已知表中某一結(jié)點(diǎn)的地址,就可搜尋所有結(jié)點(diǎn)的地址。存儲(chǔ)結(jié)構(gòu):鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
帶表頭結(jié)點(diǎn)的循環(huán)鏈表an-1firsta1a0first(空表)(非空表)循環(huán)鏈表的插入template<classType>classCircList;template<classType>classCircListNode{friendclassCircList<Type>;public:CircListNode(Typed=0,CircListNode<Type>*next=NULL)
:data(d),link(next){}//構(gòu)造函數(shù)private:
Typedata; //結(jié)點(diǎn)數(shù)據(jù)
CircListNode<Type>*link;//鏈接指針}
循環(huán)鏈表類的定義template<classType>classCircList{private:CircListNode<Type>*first,*current,*last;
//鏈表的表頭指針、當(dāng)前指針和表尾指針public:CircList(Typevalue); ~CircList();
intLength()const; BooleanIsEmpty()
{returnfirst->link==first;
}BooleanFind(constType&value);
TypegetData
()const;
voidFirster(){current=first;} BooleanFirst();
BooleanNext();BooleanPrior(); voidInsert(constType&value);
voidRemove();
};搜索成功搜索不成功循環(huán)鏈表的搜索算法firstfirst3131484815155757搜索15搜索25currentcurrentcurrentcurrentcurrentcurrentcurrentcurrent循環(huán)鏈表的搜索算法template<classType>CircListNode<Type>*CircList<Type>::
Find(Typevalue
){//在鏈表中從頭搜索其數(shù)據(jù)值為value的結(jié)點(diǎn)
CircListNode<Type>*p=first->link;
//檢測(cè)指針
p
指示第一個(gè)結(jié)點(diǎn)
while(p!=first&&p->data!=value)
p=p->link;
returnp;}if(first!=NULL){
CircListNode<Type>*second=first->link;first->link=av;av=second;
first=NULL;}利用可利用空間表回收循環(huán)鏈表firstavfirstav回收前回收后if(av==NULL)newnode=newCircListNode<Type>;else{newnode=av;av=av->link;
}從可利用空間表分配結(jié)點(diǎn)avnewnodeav分配前的可利用空間表分配后的可利用空間表和新結(jié)點(diǎn)約瑟夫問題用循環(huán)鏈表求解約瑟夫問題n個(gè)人圍成一個(gè)圓圈,首先第1個(gè)人從1開始一個(gè)人一個(gè)人順時(shí)針報(bào)數(shù),報(bào)到第m個(gè)人,令其出列。然后再?gòu)南乱粋€(gè)人開始,從1順時(shí)針報(bào)數(shù),報(bào)到第m個(gè)人,再令其出列,…,如此下去,直到圓圈中只剩一個(gè)人為止。此人即為優(yōu)勝者。例如n=8m=3約瑟夫問題的解法#include<iostream.h>#include“CircList.h”voidJosephus(intn,intm){for(inti=0;i<n-1;i++){//執(zhí)行n-1次
for(intj=0;j<m-1;j++)Next();
//數(shù)m-1個(gè)人
cout<<“Deleteperson”<<getData()<<endl;Remove();//刪去
}}voidmain(){CircList<int>clist; intn,m; cout<<“EntertheNumberofContestants?”;cin>>n>>m;for(inti=1;i<=n;i++)clist.insert(i);//形成約瑟夫環(huán)
clist.Josephus(n,m);//解決約瑟夫問題}多項(xiàng)式(Polynomial)n階多項(xiàng)式Pn(x)有n+1項(xiàng)。
系數(shù)a0,a1,a2,…,an
指數(shù)0,1,2,…,n。按升冪排列classPolynomial{public:Polynomial();//構(gòu)造函數(shù)
intoperator!();//判是否零多項(xiàng)式
floatCoef(inte);
intLeadExp();//返回最大指數(shù)
Polynomial
Add(Polynomial
poly);PolynomialMult(Polynomialpoly);
floatEval(floatx); //求值}多項(xiàng)式(Polynomial)的抽象數(shù)據(jù)類型
#include<iostream.h>classpower{
doublex;
inte;
doublemul;
public:
power(doubleval,intexp);
//構(gòu)造函數(shù)
doubleget_power(){returnmul;}
//取冪值
};創(chuàng)建power類,計(jì)算x的冪
power::power(doubleval,intexp){
//按val值計(jì)算乘冪
x=val;e=exp;mul=1.0;
if(exp==0)return;
for(;exp>0;exp--)mul=mul*x;
}main(){powerpwr(1.5,2);
cout<<pwr.get_power()<<“\n”;
}多項(xiàng)式的存儲(chǔ)表示第一種:
private:(靜態(tài)數(shù)
intdegree; 組表示)
floatcoef[maxDegree+1];
Pn(x)可以表示為:
pl.degree=n pl.coef[i]=ai,0ina0
a1
a2……an………012degreemaxDegree-1coefn第二種:private:
(動(dòng)態(tài)數(shù)
intdegree;組表示)
float*coef; Polynomial::Polynomial(intsz){ degree=sz; coef=newfloat[degree+1];
}
以上兩種存儲(chǔ)表示適用于指數(shù)連續(xù)排列的多項(xiàng)式。但對(duì)于指數(shù)不全的多項(xiàng)式如
P101(x)=3+5x50-14x101,不經(jīng)濟(jì)。第三種:
class
Polynomial; classterm{
//多項(xiàng)式的項(xiàng)定義
friendPolynomial;
private:
floatcoef;//系數(shù)
intexp; //指數(shù)
};a0
a1
a2……ai……ame0
e1
e2……ei
……emcoefexp012i
m
A(x)=2.0x1000+1.8
B(x)=1.2+51.3x50+3.7x101
兩個(gè)多項(xiàng)式存放在termArray中A.startA.finishB.startB.finishfreecoefexp1.82.01.251.33.7……01000050101……maxTerms多項(xiàng)式及其相加在多項(xiàng)式的鏈表表示中每個(gè)結(jié)點(diǎn)增加了一個(gè)數(shù)據(jù)成員link,作為鏈接指針。優(yōu)點(diǎn)是:多項(xiàng)式的項(xiàng)數(shù)可以動(dòng)態(tài)地增長(zhǎng),不存在存儲(chǔ)溢出問題。插入、刪除方便,不移動(dòng)元素。多項(xiàng)式(polynomial)類的鏈表定義structTerm{
//多項(xiàng)式結(jié)點(diǎn)定義
floatcoef;
//系數(shù)
intexp;
//指數(shù)
Term(floatc,
inte){coef=c;exp=e;
}};
classPolynomial {
//多項(xiàng)式類的定義
List<Term>poly;
//構(gòu)造函數(shù)
friendPolynomial&
operator+(Polynomial&,Polynomial&);
//加法};多項(xiàng)式鏈表的相加AH=1-10x6+2x8+7x14BH=-x4+10x6-3x10+8x14+4x18兩個(gè)多項(xiàng)式的相加算法掃描兩個(gè)多項(xiàng)式,若都未檢測(cè)完:
若當(dāng)前被檢測(cè)項(xiàng)指數(shù)相等,系數(shù)相加。若未變成0,則將結(jié)果加到結(jié)果多項(xiàng)式。若當(dāng)前被檢測(cè)項(xiàng)指數(shù)不等,將指數(shù)小者加到結(jié)果多項(xiàng)式。若一個(gè)多項(xiàng)式已檢測(cè)完,將另一個(gè)多項(xiàng)式剩余部分復(fù)制到結(jié)果多項(xiàng)式。AH.firstBH.firstCH.first1010-14-14-3636-910712712814814pappc-910pbAH.firstCH.first1010-14-14-3636-910712712814814papbpc-910AH.firstCH.first1010-14-14-3636-910712712814814papbpc-910AH.firstCH.first1010-14-14-3636-910712712814814pappc-910pb0AH.firstCH.first1010-14-1406-910712712814814pappc-910pbAH.firstCH.first1010-14-14-910712712814814papc-910pbAH.firstCH.first1010-14-14-910712712814814papc-910pbAH.firstCH.first1010-14-14-910712712814814pa==pc-910pbAH.firstCH.first1010-14-14-910712712814814pa==pc-910pbPolynomial&operator+(Polynomial&ah,Polynomial&bh){//兩個(gè)帶頭結(jié)點(diǎn)的按升冪排列的多項(xiàng)式相加,//返回結(jié)果多項(xiàng)式鏈表的表頭指針,結(jié)果不//另外占用存儲(chǔ),覆蓋ah和bh鏈表
ListNode<Term>*pa,*pb,*pc,*p;
Terma,b;pa=pc=ah.poly.First();
//結(jié)果存放指針
pb=p=bh.poly.First();pa=ah.poly.Next();
//多項(xiàng)式檢測(cè)指針
pb=bh.poly.Next();
//多項(xiàng)式檢測(cè)指針
deletep;
//刪去bh的表頭結(jié)點(diǎn)
while(pa!=NULL&&pb!=NULL){a=pa->data;b=pb->data;switch(compare(a.exp,b.exp)){case'==':
//pa->exp==pb->exp
a.coef=a.coef+b.coef;
//系數(shù)相加
p=pb;pb=pb->link;
deletep;
//刪去原pb所指結(jié)點(diǎn)
if(abs(a.coef)<0.0001){
p=pa;pa=pa->link;
deletep;
}
//相加為零,該項(xiàng)不要
else{
//相加不為零,加入ch鏈
pa->data=a;pc->link=pa;
pc=pa;pa=pa->link;
}break;case
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 吉安市農(nóng)業(yè)農(nóng)村發(fā)展集團(tuán)有限公司及下屬子公司2025年第二批面向社會(huì)公開招聘?jìng)淇碱}庫(kù)完整參考答案詳解
- 2025年勞務(wù)派遣人員招聘(派遣至浙江大學(xué)電氣工程學(xué)院孟萃教授團(tuán)隊(duì))備考題庫(kù)及答案詳解參考
- 2025年湖北省醫(yī)學(xué)會(huì)招聘?jìng)淇碱}庫(kù)含答案詳解
- 2025年江西機(jī)電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性考試題庫(kù)附答案
- 2025年泰州職業(yè)技術(shù)學(xué)院?jiǎn)握校ㄓ?jì)算機(jī))測(cè)試備考題庫(kù)及答案1套
- 2025年湖南國(guó)防工業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)附答案
- 2025至2030中國(guó)專用備份設(shè)備(PBBA)行業(yè)市場(chǎng)深度研究與戰(zhàn)略咨詢分析報(bào)告
- 2025年山東勞動(dòng)職業(yè)技術(shù)學(xué)院?jiǎn)握校ㄓ?jì)算機(jī))測(cè)試模擬題庫(kù)及答案1套
- 2025至2030間歇式瀝青攪拌站行業(yè)運(yùn)營(yíng)態(tài)勢(shì)與投資前景調(diào)查研究報(bào)告
- 池子土建合同范本
- 2025年安全總監(jiān)年終總結(jié)報(bào)告
- 安順市人民醫(yī)院招聘聘用專業(yè)技術(shù)人員筆試真題2024
- 廚師專業(yè)職業(yè)生涯規(guī)劃與管理
- 《恒X地產(chǎn)集團(tuán)地區(qū)公司管理辦法》(16年12月發(fā)文版)
- 2025年10月自考00688設(shè)計(jì)概論試題及答案
- 六西格瑪設(shè)計(jì)實(shí)例
- 海南檳榔承包協(xié)議書
- 工業(yè)交換機(jī)產(chǎn)品培訓(xùn)
- 2025浙江溫州市龍港市國(guó)有企業(yè)招聘產(chǎn)業(yè)基金人員3人筆試歷年備考題庫(kù)附帶答案詳解試卷3套
- 《十五五規(guī)劃》客觀測(cè)試題及答案解析(二十屆四中全會(huì))
- DB32-T 1086-2022 高速公路建設(shè)項(xiàng)目檔案管理規(guī)范
評(píng)論
0/150
提交評(píng)論