數(shù)據(jù)結(jié)構(gòu)與算法(C++版)課件第2章 線性表_第1頁
數(shù)據(jù)結(jié)構(gòu)與算法(C++版)課件第2章 線性表_第2頁
數(shù)據(jù)結(jié)構(gòu)與算法(C++版)課件第2章 線性表_第3頁
數(shù)據(jù)結(jié)構(gòu)與算法(C++版)課件第2章 線性表_第4頁
數(shù)據(jù)結(jié)構(gòu)與算法(C++版)課件第2章 線性表_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第2章線性表數(shù)據(jù)結(jié)構(gòu)與算法

(C++版)(第2版)2.1線性表的邏輯結(jié)構(gòu)一、線性表的定義和特點1.線性表的定義

n(

0)個數(shù)據(jù)元素的有限序列,記作:

(a1,a2,…,an)

ai

是線性表中數(shù)據(jù)元素,n是線性表長度,其中ai稱為ai+1的直接前驅(qū),簡稱為前驅(qū),ai+1稱為ai的直接后繼,簡稱為后繼。

2.線性表的特點除第一個元素外,其他每一個元素有一個且僅有一個直接前驅(qū)。除最后一個元素外,其他每一個元素有一個且僅有一個直接后繼。a1a2a3a4a5a6一、線性表基本操作(1)intLength()const

初始條件:線性表已存在。

操作結(jié)果:返回線性表元素個數(shù)。

(2)boolEmpty()const

初始條件:線性表已存在。

操作結(jié)果:如線性表為空,則返回true,否則返回false。(3)voidClear()

初始條件:線性表已存在。

操作結(jié)果:清空線性表。

(4)voidTraverse(void(*visit)(constElemType&)) const

初始條件:線性表已存在。

操作結(jié)果:依次對線性表的每個元素調(diào)用函數(shù)(*visit)。(5)boolGetElem(intposition,ElemType&e)const

初始條件:線性表已存在,1≤position≤Length()。

操作結(jié)果:用e返回第position個元素的值。

(6)boolSetElem(intposition,constElemType&e)

初始條件:線性表已存在,1≤position≤Length()。

操作結(jié)果:將線性表的第position個位置的元素賦值為e。(7)boolDelete(intposition,ElemType&e)

初始條件:線性表已存在,1≤position≤Length()。

操作結(jié)果:刪除線性表的第position個位置的元素,并用e返回其值,長度減1。(8)boolDelete(intposition)初始條件:線性表已存在,1≤position≤Length()。操作結(jié)果:刪除線性表的第position個元素,,長度減1。(9)boolInsert(intposition,constElemType&e)

初始條件:線性表已存在,1≤position≤Length()+1。

操作結(jié)果:在線性表的第position個位置前插入元素e,長度加1。2.2線性表的順序存儲結(jié)構(gòu)1.順序表的定義和特點定義:將線性表中的元素相繼存放在一個連續(xù)的存儲空間中。特點:可利用一維數(shù)組描述存儲結(jié)構(gòu),采用線性表的順序存儲方式253457164809

012345elemsa1

a2

a3

a4

a5

a6

2.順序表(SeqList)類模板的

定義//順序表類模板template<classElemType>classSqList{protected://順序表實現(xiàn)的數(shù)據(jù)成員: intcount; //元素個數(shù)

intmaxSize; //順序表最大元素個數(shù)

ElemType*elems; //元素存儲空間public://抽象數(shù)據(jù)類型方法聲明及重載編譯系統(tǒng)默認(rèn)方法聲明: SqList(intsize=DEFAULT_SIZE);

//構(gòu)造函數(shù)模板

virtual~SqList(); //析構(gòu)函數(shù)模板

intLength()const; //求線性表長度

boolEmpty()const; //判斷線性表是否為空

voidClear(); //將線性表清空 voidTraverse(void(*visit)(constElemType&)) const; //遍歷線性表

boolGetElem(intposition,ElemType&e)const; //求指定位置的元素

boolSetElem(intposition,constElemType&e);

//設(shè)置指定位置的元素值

boolDelete(intposition,ElemType&e);//刪除元素

boolDelete(intposition); //刪除元素

boolInsert(intposition,constElemType&e);

//插入元素

SqList(constSqList<elemType>&source);

//復(fù)制構(gòu)造函數(shù)模板

SqList<elemType>&operator=(const SqList<elemType>&source);

//重載賦值運算符};template<classElemType>SqList<ElemType>::SqList(intsize)//操作結(jié)果:構(gòu)造一個最大元素個數(shù)為size的空順序表{ maxSize=size; //最大元素個數(shù) elems=newElemType[maxSize];//分配存儲空間 count=0; //空線性表元素個數(shù)為0}template<classElemType>SqList<ElemType>::~SqList()//操作結(jié)果:銷毀線性表{ delete[]elems; //釋放存儲空間}3.順序表部分操作的實現(xiàn)(1)表項的插入25345716480963

a1

a2

a3

a4

a5

a6

a7

a8elems50插入e2534575016480963

a1

a2

a3

e

a4

a5

a6

a7elems50itemplate<classElemType>boolSqList<ElemType>::Insert(intposition,constElemType&e)//操作結(jié)果:在線性表的第position個元素前插入元素e,// position的的取值范圍為// 1≤position≤Length()+1,如線性表已滿,則返回// false,如position合法,則返回true,否則返回false{ if(count==maxSize) { //線性表已滿返回false returnfalse; } elseif(position<1||position>Length()+1) { //position范圍錯 returnfalse; //范圍錯 }

else { //成功 intlength=Length(); //暫存線性表長度

ElemTypetemElem; //臨時元素

count++; //插入后元素個數(shù)將自增1 for(inttemPos=length;temPos>=position; temPos--) { //插入位置之后的元素右移

GetElem(temPos,temElem);

SetElem(temPos+1,temElem); } SetElem(position,e); //將e賦值到position處 returntrue; //插入成功 }}(2)表項的刪除2534575016480963

a1

a2

a3

a4

a5

a6

a7

a8elems16刪除

e25345750480963

a1

a2

a3

a4

a6

a7

a8

a9elemstemplate<classElemType>boolSqList<ElemType>::Delete(intposition,ElemType&e)//操作結(jié)果:刪除線性表的第position個元素,并前用e返// 回其值,position的取值范圍為1≤position≤Length(),// position合法時返回true,否則返回false{ if(position<1||position>Length()) { //position范圍錯 returnfalse; //范圍錯 } else { //position合法 GetElem(position,e); //用e返回被刪除元素 ElemTypetemElem; //臨時元素 for(inttemPos=position+1; temPos<=Length();temPos++) { //被刪除元素之后的元素依次左移

GetElem(temPos,temElem);

SetElem(temPos-1,temElem);

} count--; //刪除后元素個數(shù)將自減1 returntrue; //刪除成功 }}4.順序表的應(yīng)用:集合的“差”運算//文件路徑名:s2_1\alg.htemplate<classElemType>voidDifference(constSqList<ElemType>&la, constSqList<ElemType>&lb, SqList<ElemType>&lc)//操作結(jié)果:用lc返回la和lb表示的集合的差集//方法:在la中取出元素,在lb中進行查找,如果未在lb中// 出現(xiàn)了,將其插入到lc{ ElemTypeaElem,bElem; lc.Clear(); //清空lc for(intaPos=1;aPos<=la.Length();aPos++) { la.GetElem(aPos,aElem);

//取出la的一個元素aElem boolisExist=false;

//表示aElem是否在lb中出現(xiàn)

for(intbPos=1;bPos<=lb.Length();bPos++) { lb.GetElem(bPos,bElem);

//取出lb的一個元素bElem if(aElem==bElem) { isExist=true; //aElem同時在la和lb中

//出現(xiàn),置isExist為true

break; //退出內(nèi)層循環(huán)

} } if(!isExist) { //aElem在la中出現(xiàn),而未在lb中未出現(xiàn), // 將其插入到lc中

lc.Insert(lc.Length()+1,aElem); } }}2.3線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)一、單鏈表

(SinglyLinkedList)

用一組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。以data(元素的值)

+next(后繼)=結(jié)點(表示數(shù)據(jù)元素)以“結(jié)點的序列”表示線性表稱作單鏈表1.單鏈表的概念

以線性表中第一個數(shù)據(jù)元素a1的存儲地址作為線性表的地址,稱作線性表的頭指針。頭結(jié)點

a1a2…...an^頭指針頭指針

有時為了操作方便,在第一個結(jié)點之前虛加一個“頭結(jié)點”,這時指向頭結(jié)點的指針稱為鏈表的頭指針??罩羔樉€性表為空表時,頭結(jié)點的指針成份為空

//結(jié)點類模板template<classElemType>structNode{//數(shù)據(jù)成員: ElemTypedata; //數(shù)據(jù)成分

Node<ElemType>*next; //指針成分//構(gòu)造函數(shù)模板: Node(); //無參數(shù)的構(gòu)造函數(shù)模板

Node(ElemTypee,Node<ElemType>*link= NULL);//已知數(shù)據(jù)成份和指針成份建立結(jié)構(gòu)};2.單鏈表的相關(guān)類模板//簡單線性鏈表類模板template<classElemType>classSimpleLinkList{protected://鏈表實現(xiàn)的數(shù)據(jù)成員:

Node<ElemType>*head; //頭結(jié)點指針//輔助函數(shù)模板: Node<ElemType>*GetElemPtr(intposition)const; //返回指向第position個結(jié)點的指針public://抽象數(shù)據(jù)類型方法聲明及重載編譯系統(tǒng)默認(rèn)方法聲明: SimpleLinkList(); //無參數(shù)構(gòu)造函數(shù)模板

virtual~SimpleLinkList(); //析構(gòu)函數(shù)模板

intLength()const; //求線性表長度

boolEmpty()const; //判斷線性表是否為空

voidClear(); //將線性表清空

voidTraverse(void(*visit)(constElemType&)) const; //遍歷線性表

boolGetElem(intposition,ElemType&e)const; //求指定位置的元素

boolSetElem(intposition,constElemType&e); //設(shè)置指定位置的元素值 boolDelete(intposition,ElemType&e);//刪除元素 boolDelete(intposition);//刪除元素

boolInsert(intposition,constElemType&e); //插入元素

SimpleLinkList(constSimpleLinkList<ElemType> &source); //復(fù)制構(gòu)造函數(shù)模板

SimpleLinkList<ElemType>&operator=(const SimpleLinkList<ElemType>&source); //重載賦值運算符};3.單鏈表中的插入與刪除插入newPtr=newNode<ElemType>(e,temPtr->next);temPtr->next=newPtr;

template<classElemType>boolSimpleLinkList<ElemType>::Insert( intposition,constElemType&e)//操作結(jié)果:在線性表的第position個位置前插入元素e// position的取值范圍為1≤position≤Length()+1// position合法時返回true,否則返回false{ if(position<1||position>Length()+1) { //position范圍錯

returnfalse; //位置不合法

} else { //position合法

Node<ElemType>*temPtr; temPtr=GetElemPtr(position-1); //取出指向第position-1個結(jié)點的指針

Node<ElemType>*newPtr; newPtr=newNode<ElemType>(e, temPtr->next); //生成新結(jié)點

temPtr->next=newPtr; //將temPtr插入到鏈表中

returntrue; }}刪除

nextPtr=temPtr->next; //nextPtr為temPtr的后繼

temPtr->next=nextPtr->next;//刪除結(jié)點

deletenextPtr; //釋放被刪結(jié)點在單鏈表中刪除含b的結(jié)點template<classElemType>BoolSimpleLinkList<ElemType>::Delete(intposition, ElemType&e)//操作結(jié)果:刪除線性表的第position個位置的元素,并用// e返回其值,position的取值范圍為// 1≤position≤Length(),position合法時返回// true,否則返回false{ if(position<1||position>Length()) { //position范圍錯

returnfalse; } else { //position合法

Node<ElemType>*temPtr; temPtr=GetElemPtr(position-1); //取出指向第position-1個結(jié)點的指針

Node<ElemType>*nextPtr=temPtr->next; //nextPtr為temPtr的后繼

temPtr->next=nextPtr->next;//刪除結(jié)點

e=nextPtr->data;//用e返回被刪結(jié)點元素值

deletenextPtr; //釋放被刪結(jié)點

returntrue; }}二、循環(huán)鏈表(CircularList)循環(huán)鏈表是單鏈表的變形。循環(huán)鏈表最后一個結(jié)點的next指針不為NULL,而是指向了表的前端。為簡化操作,在循環(huán)鏈表中往往加入表頭結(jié)點。循環(huán)鏈表的特點是:只要知道表中某一結(jié)點的地址,就可搜尋到所有其他結(jié)點的地址。1.循環(huán)鏈表的概念2.循環(huán)鏈表示例//簡單循環(huán)鏈表類模板template<classElemType>classSimpleCircLinkList{protected://循環(huán)鏈表實現(xiàn)的數(shù)據(jù)成員: Node<ElemType>*head; //頭結(jié)點指針//輔助函數(shù)模板: Node<ElemType>*GetElemPtr(intposition)const; //返回指向第position個結(jié)點的指針3.循環(huán)鏈表的相關(guān)類模板public://抽象數(shù)據(jù)類型方法聲明及重載編譯系統(tǒng)默認(rèn)方法聲明: SimpleCircLinkList(); //無參數(shù)的構(gòu)造函數(shù)模板

virtual~SimpleCircLinkList(); //析構(gòu)函數(shù)模板

intLength()const; //求線性表長度

boolEmpty()const; //判斷線性表是否為空

voidClear(); //將線性表清空

voidTraverse(void(*visit)(constElemType&)) const; //遍歷線性表

boolGetElem(intposition,ElemType&e) const; //求指定位置的元素

boolSetElem(intposition,constElemType&e); //設(shè)置指定位置的元素值 boolDelete(intposition,ElemType&e);//刪除元素 boolDelete(intposition); //刪除元素

boolInsert(intposition,constElemType&e); //插入元素

SimpleCircLinkList(const SimpleCircLinkList<ElemType>&source); //復(fù)制構(gòu)造函數(shù)模板

SimpleCircLinkList<ElemType>&operator=(const SimpleCircLinkList<ElemType>&source); //重載賦值運算符};4.循環(huán)鏈表的應(yīng)用——用循環(huán)鏈表求解約瑟夫問題約瑟夫問題的提法

n個人圍成一個圓圈,首先第1個人從1開始一個人一個人順時針報數(shù),報到第m個人,令其出列。然后再從下一個人開始,從1順時針報數(shù),報到第m個人,再令其出列,…,如此下去,直到圓圈中只剩一個人為止。此人即為優(yōu)勝者。例如n=8m=3//文件路徑名:s2_5\alg.hvoidJosephus(intn,intm)//操作結(jié)果:n個人圍成一個圓圈,首先第1個人從1開始一// 個人一個人順時針報數(shù),報到第m個人,令其出列。// 然后再從下一個人開始,從1順時針報數(shù)報到第m// 個人,再令其出列,…,如此下去,直到圓圈中只// 剩一個人為止。此人即為優(yōu)勝者{ SimpleCircLinkList<int>la; //定義空循環(huán)鏈表

intpos=0; //報數(shù)到的人在鏈表中序號

intout,winer; for(intk=1;k<=n;k++)la.Insert(k,k); //建立數(shù)據(jù)成份為1,2,..,n的循環(huán)鏈表 cout<<"出列者:"; for(inti=1;i<n;i++) { //循環(huán)n-1次,讓n-1個個出列

for(intj=1;j<=m;j++) { //從1報數(shù)到m pos++; if(pos>la.Length()) pos=1; } la.Delete(pos--,out);//報數(shù)到m的人出列

cout<<out<<""; } la.GetElem(1,winer); //剩下的一個人為優(yōu)勝者

cout<<endl<<"優(yōu)勝者:"<<winer<<endl;}三、雙向鏈表

(DoublyLinkedList)1.雙向鏈表的概念雙向鏈表是指在前驅(qū)和后繼方向都能游歷(遍歷)的線性鏈表。雙向鏈表每個結(jié)點結(jié)構(gòu):前驅(qū)方向后繼方向雙向鏈表通常

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論