文章目錄
- 1.鏈表的概念及結構
- 2.單鏈表的實現
1.鏈表的概念及結構
概念:鏈表是一種物理存儲結構上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表
中的指針鏈接次序實現的 。
鏈表的結構跟火車車廂相似,淡季時車次的車廂會相應減少,旺季時車次的車廂會額外增加幾節。只需要將火車里的某節車廂去掉/加上,不會影響其他車廂,每節車廂都是獨立存在的。
車廂是獨立存在的,且每節車廂都有車門。想象一下這樣的場景,假設每節車廂的車門都是鎖上的狀態,需要不同的鑰匙才能解鎖,每次只能攜帶一把鑰匙的情況下如何從車頭走到車尾?
最簡單的做法:每節車廂里都放一把下一節車廂的鑰匙。
在鏈表里,每節“車廂”是什么樣的呢?
與順序表不同的是,鏈表里的每節"車廂"都是獨立申請下來的空間,我們稱之為“結點/節點”
節點的組成主要有兩個部分:當前節點要保存的數據和保存下一個節點的地址(指針變量)。
圖中指針變量 plist保存的是第一個節點的地址,我們稱plist此時“指向”第一個節點,如果我們希
望plist“指向”第二個節點時,只需要修改plist保存的內容為0x0012FFA0。
為什么還需要指針變量來保存下一個節點的位置?
鏈表中每個節點都是獨立申請的(即需要插入數據時才去申請一塊節點的空間),我們需要通過指針變量來保存下一個節點位置才能從當前節點找到下一個節點。
結合前面學到的結構體知識,我們可以給出每個節點對應的結構體代碼:
假設當前保存的節點為整形:
struct SListNode
{int data; //節點數據struct SListNode* next; //指針變量用保存下一個節點的地址
};
2.單鏈表的實現
typedef int SLTDataType;
typedef struct SListNode
{ SLTDataType data; //節點數據 struct SListNode* next; //指針保存下一個節點的地址
}SLTNode;
void SLTPrint(SLTNode* phead);
//頭部插入刪除/尾部插入刪除
void SLTPushBack(SLTNode** pphead, SLTDataType x);
void SLTPushFront(SLTNode** pphead, SLTDataType x);
void SLTPopBack(SLTNode** pphead);
void SLTPopFront(SLTNode** pphead);
//查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);
//在指定位置之前插入數據
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//刪除pos節點
void SLTErase(SLTNode** pphead, SLTNode* pos);
//在指定位置之后插入數據
void SLTInsertAfter(SLTNode* pos, SLTDataType x);
//刪除pos之后的節點
void SLTEraseAfter(SLTNode* pos);
//銷毀鏈表
void SListDesTroy(SLTNode** pphead);