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