C++詳解如何實(shí)現(xiàn)單鏈表_第1頁
C++詳解如何實(shí)現(xiàn)單鏈表_第2頁
C++詳解如何實(shí)現(xiàn)單鏈表_第3頁
C++詳解如何實(shí)現(xiàn)單鏈表_第4頁
C++詳解如何實(shí)現(xiàn)單鏈表_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第C++詳解如何實(shí)現(xiàn)單鏈表目錄單鏈表單鏈表的基本操作1.初始化2.取值3.查找4.插入5.刪除示例代碼開發(fā)環(huán)境運(yùn)行結(jié)果

單鏈表

鏈表內(nèi)存空間不一定連續(xù),其擴(kuò)展性較好。多余的不多說了。該文主要記錄單鏈表的實(shí)現(xiàn),該單鏈表含有一個(gè)非空的頭節(jié)點(diǎn)。鏈表的操作實(shí)際上是對(duì)其指針域與數(shù)據(jù)域的操作。

線性表的鏈?zhǔn)酱鎯?chǔ)又稱為單鏈表,它是指通過一組任意的存儲(chǔ)單元來存儲(chǔ)線性表中的數(shù)據(jù)元素。為了建立數(shù)據(jù)元素之間的線性關(guān)系,對(duì)每個(gè)鏈表結(jié)點(diǎn),除存放元素自身的信息外,還需要存放一個(gè)指向其后繼的指針。

單鏈表中結(jié)點(diǎn)類型的描述如下:

typedefstructLNode{//定義單鏈表節(jié)點(diǎn)類型

ElemTypedata;//數(shù)據(jù)域

structLNode*next;//指針域

};LNode,*LinkList;

單鏈表的基本操作

1.初始化

單鏈表的初始化操作就是構(gòu)造一個(gè)空表。

具體代碼:

//初始化單鏈表

voidInitList(LinkListL)//構(gòu)造一個(gè)空的單鏈表L

L=newLNode;//生成新節(jié)點(diǎn)作為頭節(jié)點(diǎn),用頭指針L指向頭節(jié)點(diǎn)

L-next=NULL;//頭節(jié)點(diǎn)的指針域置空

2.取值

和順序表不同,在鏈表中并沒有存儲(chǔ)在物理相鄰的單元中。所以我們只能從鏈表的首節(jié)點(diǎn)出發(fā),順著鏈域next逐個(gè)節(jié)點(diǎn)向下訪問。

具體代碼:

//單鏈表的取值

boolGetElem(LinkListL,inti,ElemTypee)

LinkListp=L-next;intj=1;//初始化,p指向首元節(jié)點(diǎn),計(jì)數(shù)器j初值為1

while(pji)//順著鏈域向后查找,直到p為空或p指向第i個(gè)元素

p=p-next;//p指向下一個(gè)節(jié)點(diǎn)

++j;//計(jì)數(shù)器j相應(yīng)加1

if(!p||ji)returnfalse;//i值不合法

e=p-data;//取第i個(gè)節(jié)點(diǎn)的數(shù)據(jù)域

returntrue;

3.查找

從鏈表的首元節(jié)點(diǎn)出發(fā),依次將節(jié)點(diǎn)值和給定值e進(jìn)行比較,返回查找結(jié)果。

具體代碼:

//單鏈表的查找

boolLocateElem(LinkListL,LNode*p,ElemTypee)

//在單鏈表中查找第一個(gè)數(shù)據(jù)為e的結(jié)點(diǎn)

p=L-next;//p指向首元結(jié)點(diǎn)

while(pp-data!=e)

p=p-next;

if(p)

returntrue;

returnfalse;

}

4.插入

//單鏈表的插入

boolListInsert(LinkListL,inti,ElemTypee)

LinkListp=L;

LNode*s;

intj=0;

while(pji-1)//p指向第i-1個(gè)結(jié)點(diǎn)

p=p-next;

j++;

if(!p||i1)//i大于表長+1或小于1,插入位置不合法

returnfalse;

s=newLNode;

s-data=e;

s-next=p-next;

p-next=s;

returntrue;

5.刪除

//單鏈表的刪除

boolListDelete(LinkListL,inti,ElemTypee)

//將單鏈表的第i個(gè)結(jié)點(diǎn)刪除

LinkListp=L;

LNode*q;

intj=0;

while(p-nextji-1)//p指向第i-1個(gè)結(jié)點(diǎn)

p=p-next;

j++;

if(!(p-next)||i1)//i大于表長或小于1,刪除位置不合法

returnfalse;

q=p-next;//臨時(shí)保存被刪結(jié)點(diǎn)的地址以備釋放

p-next=q-next;

e=q-data;//保存被刪結(jié)點(diǎn)的數(shù)據(jù)

deleteq;//釋放被刪結(jié)點(diǎn)的空間

returntrue;

示例代碼

直接上代碼:

LinkList.h

#pragmaonce

typedefstructLINKLIST{

void*data;

structLINKLIST*pNext;

}LinkList;

typedefvoid(*PrintLinkList)(void*);

//無頭的鏈表

classLinkNode

public:

LinkNode();

~LinkNode();

voidinsertLinkList(intpos,void*data);

voidremoveByPosInLinkList(intpos);

intgetSizeLinkList();

intfindValueInLinkList(void*value);

LinkList*getFirstNodeLinkList();

voidprintLinkList(PrintLinkListprint);

private:

LinkList*m_pHead;

intm_size;

};

LinkList.cpp

//LinkList.cpp

#include"LinkList.h"

#includeiostream

usingnamespacestd;

LinkNode::LinkNode()

m_pHead=newLinkList;

m_pHead-data=nullptr;

m_pHead-pNext=nullptr;

m_size=0;

LinkNode::~LinkNode()

if(m_pHead!=nullptr)

while(m_pHead!=nullptr)

LinkList*pNext=m_pHead-pNext;

deletem_pHead;

m_pHead=nullptr;

m_pHead=pNext;

voidLinkNode::insertLinkList(intpos,void*data)

if(m_pHead==nullptr)

return;

if(data==nullptr)

return;

//插入位置矯正

if(pos0||posm_size)

pos=m_size;

LinkList*insertNode=newLinkList;

insertNode-data=data;

insertNode-pNext=nullptr;

//找到前一個(gè)位置(pos從0開始)

LinkList*pPre=m_pHead;

for(inti=0;ipos;++i)

pPre=pPre-pNext;

//有頭節(jié)點(diǎn)的鏈表

insertNode-pNext=pPre-pNext;

pPre-pNext=insertNode;

m_size++;

voidLinkNode::removeByPosInLinkList(intpos)

if(m_pHead==nullptr)

return;

if(pos0||pos=m_size)

return;

//找到前一個(gè)位置(pos從0開始)

LinkList*pPre=m_pHead;

for(inti=0;ipos;++i)

pPre=pPre-pNext;

LinkList*delNode=pPre-pNext;

pPre-pNext=delNode-pNext;

deletedelNode;

delNode=nullptr;

m_size--;

intLinkNode::getSizeLinkList()

returnm_size;

intLinkNode::findValueInLinkList(void*value)

intnPos=-1;

if(m_pHead==nullptr)

returnnPos;

if(value==nullptr)

returnnPos;

LinkList*pHead=m_pHead;

for(inti=0;im_size;++i)

//有空的頭節(jié)點(diǎn)

pHead=pHead-pNext;

if(pHead-data==value)

nPos=i;

break;

returnnPos;

LinkList*LinkNode::getFirstNodeLinkList()

if(m_pHead==nullptr)

returnnullptr;

returnm_pHead-pNext;//有空的頭節(jié)點(diǎn)

voidLinkNode::printLinkList(PrintLinkListprint)

if(m_pHead==nullptr)

return;

//不能直接移動(dòng)頭節(jié)點(diǎn),需要保留頭節(jié)點(diǎn)

LinkList*pTemp=m_pHead;

pTemp=pTemp-pNext;

while(pTemp!=nullptr)

print(pTemp-data);

pTemp=pTemp-pNext;

coutendl;

}

mian.cpp

#includeiostream

#include"LinkList.h"

usingnamespacestd;

typedefstructPERSON{

charname[64];

intage;

intscore;

}Person;

voidmyPrint(void*data)

Person*p=(Person*)data;

cout"name:"p-name"age:"p-age"score:"p-scoreendl;

voidtest()

LinkNode*plinkList=newLinkNode;

Personp1={"husdh",23,78};

Personp2={"hudfs",23,98};

Personp3={"術(shù)后",23,78};

Personp4={"喀什",23,67};

plinkList-insertLinkList(0,p1);

plinkList-insertLinkList(1,p2);

plinkList-insertLinkList(2,p3);

plinkList-insertLinkList(3,p4);

plinkList-printLinkList(myPrint);

cout"鏈表的節(jié)點(diǎn)數(shù):"plinkList-getSizeLinkList()endl;

plinkList-removeByPosInLinkList(1);

cout"remove"endl;

plinkList-printLinkList(myPrint);

cout"刪除后鏈表的節(jié)點(diǎn)數(shù):"plinkList-getSizeLinkList()end

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論