線性表一般分為順序表和煉表,本篇是對鍊錶的回顧,以c++建立簡單(帶頭結點)遞增單鏈表,實現插入和逆置功能為例。
鍊錶的形式有很多種,其中最簡單、最基礎的是單鏈表。其他諸如迴圈鍊錶、雙向鍊錶、雙向迴圈鍊錶等,應該算是基於單鏈表的變形,個人認為其本質也還是單鏈表。
單鏈表用來表示線性表時,其定義是:乙個儲存節點分為資料域(data)和指標域(link)兩部分,資料域用於儲存線性表的乙個資料元素(其實也就是原本的資料),而指標域用於存放乙個指標,該指標指向下乙個儲存節點(即指標的值為下乙個儲存節點的開始儲存位址)。由此形成乙個鍊錶結構,最後乙個節點的指標指向空(null)。
1.單鏈表的類定義:
單鏈表的定義方法大致分為以下幾種:
(1)復合類方式
class list;
class linknode
class list
(2)巢狀類方式
class list
linknode * first; //鍊錶的頭結點
}
將節點類放入list類中,並且設為private使得外部無法直接訪問,而節點類的資料成員又設為public,使得list類的成員可以直接訪問它們。
(3)基類和派生類的方法
此種方法即將linknode類作為基類,將list類宣告為派生類,然後繼承基類的資料成員(有時也包括成員函式)。
(4)利用結構體來定義linknode
struct linknode
;class list
定義為struct使得節點失去了封裝性,但是可以簡化操作。且這種方法和第一種復合類的方法都很靈活,可以讓乙個節點類用於多個(型別)鍊錶。後面的示例**也是用的這種方法。
示例程式的類定義為:
struct number
;class list
~list() {}
void createlist();
void insertlist(int x);
void printlist();
void returnlist();
private:
number* seqlist;
};
2.各個函式的具體定義為:
void list::createlist()
nptempnode->next = null;
}void list::insertlist(int x)
number* nptempnodeinsert = new number;
nptempnodeinsert->elen = x;
if (nptempnode->next==null) //判斷是否因為到了鏈尾跳出迴圈
else }
void list::returnlist() //原理是頭結點不儲存資料,且頭結點的下乙個節點就是第乙個資料節點
}void list::printlist()
cout << endl;
}
3.對鍊錶的分析:
(1)由於單鏈表的每一項都只知道它的下一項,所以要在某一位置插入節點或刪除某一位置的節點資料,需要從頭節點開始,逐步追朔,才能到達特定位置。而要獲得某一項的值,也要從頭節點開始。
(2)而插入或者刪除本身是很方便的,且通過指標獲得下乙個節點,也比逐個移動節點資料要快很多。所以單鏈表是易於插入或者刪除,而相對難於獲得某個特定位置的節點資料的。
總的來說,當線性表需要有較多的插入或者刪除這樣的操作時,用鍊錶是比較好的。當線性表會有較少插入或者刪除,而較多的獲取資料操作時(尤其是某個特定節點),用順序表可能更好一點。
資料結構之線性表(2)
線性表的鏈式儲存特點使用一組任意的儲存單元儲存線性表的資料元素,這組儲存單元可以是連續的,也可以是不連續的。鍊錶中第乙個節點儲存的位置叫頭指標。單鏈表的第乙個節點前附設乙個節點叫頭結點。頭指標 頭指標是指鍊錶指向第乙個節點的指標,若煉表有頭結點,則是指向頭指標的結點。頭指標具有標識作用,所以常用頭指...
資料結構 線性表 2
package com.wjy.data structure.linearlist.common public inte ce nodepackage com.wjy.data structure.linearlist.common 單鏈表結點定義 public class slnode imple...
資料結構2 線性表
什麼是線性表 邏輯上具有線性結構的儲存結構 線性表的特點 線性表中每個元素型別相同 線性表分類 根據物理結構,分為順序儲存和鏈式儲存 順序儲存 順序表 順序表的特點 快速隨機訪問,查詢和修改效率高,增刪效率低 順序表的實現 1 定義順序表頭,2 順序表初始化,3 實現順序表的操作 順序表的操作 增加...