数据结构与算法-链表
在講述鏈表之前讓我們對數(shù)據(jù)結(jié)構(gòu)進行一個簡單的回顧:我們知道,數(shù)據(jù)結(jié)構(gòu)指的是描述實際問題中各個數(shù)據(jù)項節(jié)點之間的前后邏輯結(jié)構(gòu)關(guān)系,即要么是線性結(jié)構(gòu)(即某一數(shù)據(jù)項的前繼節(jié)點和后繼節(jié)點有且只有一個)要么是非線性結(jié)構(gòu)(即某一數(shù)據(jù)節(jié)點的前驅(qū)或者后繼節(jié)點不止一個)。在確定了實際數(shù)據(jù)項的數(shù)據(jù)結(jié)構(gòu)之后,我們要采用某種存儲方式對其進行存儲,常見的數(shù)據(jù)結(jié)構(gòu)的存儲方式有:順序存儲、鏈式存儲、散列存儲以及索引存儲。每一種存儲方式都有一個基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)與其對應(yīng),如數(shù)組是順序存儲的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),鏈表是鏈式存儲基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)等等。所以徹底理解了鏈表也即會非常容易的理解其他基于鏈式存儲的數(shù)據(jù)結(jié)構(gòu)。
鏈表:根據(jù)指針域的不同,鏈表分為單向鏈表、雙向鏈表、循環(huán)鏈表等等。
單向鏈表是鏈表中最簡單的,每個元素包含一個指針域和一個數(shù)值域,我們稱這樣的元素為一個節(jié)點,每個節(jié)點用來存儲實際數(shù)據(jù)中的一個數(shù)據(jù)項,每個節(jié)點的指針域指向下一個節(jié)點,最后一個指向一個空值。即一個單項鏈表的一個節(jié)點分為兩個部分,第一部分保存或者顯示關(guān)于節(jié)點的信息,第二部分存儲下一個節(jié)點的地址,單鏈表只能向一個方向進行遍歷。下面我們來具體實現(xiàn)一個單鏈表:
首先我們要定義一個節(jié)點,用于保存數(shù)據(jù)項的各項信息:
生成一個包含nCount個節(jié)點的鏈表:
linkNode* createLink(int nCount)//尾插法 {linkNode *pHeadNode = malloc(sizeof(linkNode));linkNode * p = null;for(int i = 0; i<nCount; i++){p = malloc(siezof(linkNode))p->data = i;pHeadNode->next = p;pHeadNode = p;}p->next = null;return pHeadNode }刪除鏈表某一個節(jié)點:
linkNode * deleteNode(linkNode * pHeadNode, int theData) {while(pHeadNode->data==theData)//判斷鏈表頭結(jié)點是否是需要刪除的節(jié)點{pHeadNode= pHeadNode->next;if(pHeadNode== null) return null;}while(pHeadNode->next!=null){if(pHeadNode->next->data==theData)pHeadNode->next = pHeadNode->next->next;elsepHeadNode = pHeadNode->next; }return pHeadNode; }查找鏈表中包含某一元素的節(jié)點
linkNode* searchNode(linkNode *pHeadNode, int theData) {while(pHeadNode->data==theData)return pHeadNode;while(pHeadNode->next!=null && pHeadNode->data!=theData)pHeadNdoe = pHeadNode->next;return pHeadNode; }在鏈表中,在pos位置增加一個元素:
linkNode* addNode(linkNode* pHeadNode, int pos, int number) {for(int i = 0; i<pos; i++){pHeadNode = pHeadNode->next;}linkNode* theAddNode = malloc(sizeof(linkNode));theAddNode->data = numbertheAddNode->next = pHeadNode->next;pHeadNode->next = theAddNode; }鏈表的遍歷
void printLink(linkNode* pHeadNode) {if(pHeadNode==null)return;while(pHeadNode->next!=nul)pHeadNode = pHeadNode->next; }到此我們完成了單向鏈表的一部分功能,當(dāng)然代碼不是特別完善,所以我會不定時更新完善這部分。當(dāng)然還有雙向鏈表和循環(huán)鏈表等,但在此就不一一介紹了,后面有需要的會補上來的。
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的数据结构与算法-链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 关联容器
- 下一篇: 数据结构与算法-队列