線性表的鏈式儲存結構

2021-10-09 14:34:50 字數 3683 閱讀 3639

最近正在看《大話資料結構》,書中給出的線性表的鏈式儲存結構是以c語言的形式給出的,但是我最近正在學習c++,因此自己重新寫出了c++版本的線性表的資料結構。下面介紹實現的要點:

(1) 結點中通常分為資料域和指標域,因此在linklist類中定義了node結構體,並使用head和tail指標指向鍊錶的首部和尾部,並使用count記錄鍊錶中有多少結點。

(2) 建構函式中要初始化head,tail和count;

(3) 插入資料。插入資料主要分為兩種,預設是在尾部新增元素,另一種情況是在指定索引位置處進行元素的插入。插入資料的基本思想就是創造出乙個結點,然後在插入到相應的位置處。其中要注意,插入資料要首先判斷鍊錶是否為空這一中特別的情況。

(4) 刪除資料。刪除資料也分為來兩種,預設在首部刪除資料,另一種也是刪除指定位置的元素。刪除資料的主要思想就是先儲存該節點的指標,這是為了後面釋放該要刪除指標的記憶體空間;其次,讓該只指標的前乙個指標的next指向該指標的下乙個結點,完成指標指向的改變。

(5)鍊錶應當可以像陣列那樣進行索引,因此要過載索引運算子,實現鍊錶資料的索引。其基本思想就是迴圈整個鍊錶,直到第找到鍊錶中相應位置的資料。

(6)物件導向的基本思想就是建立資料然後重複使用資料,因此,我們往往需要將鍊錶作為乙個基本的資料型別進行使用,因此要顯示定義複製建構函式和賦值運算子。

主要**如下:

// linklist.h

#pragma once

#ifndef _linklist_h_

#define _linklist_h_

/*構建乙個線性表的鏈式儲存結構*/

typedef int item;

class linklist node;

node *head;

node *tail;

// 鍊錶元素的個數

int count;

private:

/*操作:開闢乙個空間,並將item對其賦值*/

/*前提條件:能夠進行賦值*/

node* makenode(const item item);

public:

// 建構函式和析構函式

linklist();

// 複製建構函式

linklist(const linklist & linklist);

~linklist();

// 成員函式

/*操作:判斷鍊錶是否為空*/

/*前提條件:鍊錶已經初始化*/

/*操作結果:如果鍊錶為空,返回true;否則,返回false*/

bool isempty();

/*操作:獲得當前鍊錶中有多少元素*/

/*前提條件:鍊錶已經初始化*/

/*操作結果:返回鍊錶中元素的個數*/

int size();

/*操作:向鍊錶中尾部插入資料*/

/*前提條件:鍊錶已經初始化*/

/*操作結果:如果成功插入,返回true;否則,返回false */

bool insertitem(const item item);

/*操作:向鍊錶中某個位置插入資料*/

/*前提條件:鍊錶已經初始化*/

/*操作結果:如果成功插入,返回true;否則,返回false*/

bool insertitem(const item item, const int index);

/*操作:刪除鍊錶首個的資料*/

/*前提條件:鍊錶已經初始化*/

/*操作結構:如果成功刪除尾部元素,返回true,並將刪除的元素儲存在item中;否則,返回false*/

bool deleteitem(item &item);

/*操作:刪除鍊錶中某個位置的元素*/

/*前提條件:鍊錶已經初始化*/

/*操作結果:如果成功刪除,並待刪除的元素儲存在item中,並返回true;否則,返回false*/

bool deleteitem(item &item, const int index);

/*操作:清空鍊錶*/

/*前提條件:鍊錶已經初始化*/

/*操作結果:如果成功清空,返回true;否則,返回false*/

bool clearlist();

/*操作:過載索引運算子*/

/*前提條件:索引index不能超過鍊錶可索引的大小*/

/*操作結果:鍊錶可以像陣列那樣通過索引獲得元素,返回item型別資料*/

item operator(const int index);

/*操作:過載賦值運算子*/

/*前提條件:鍊錶已經初始化*/

/*操作結果:能夠進行鍊錶物件之間的賦值*/

linklist & operator=(const linklist & linklist);

/*操作:顯示鍊錶中所有的元素*/

/*前提條件:鍊錶已經初始化*/

/*操作結構:列印鍊錶中所有的元素*/

void show();

};#endif // !_linklist_h_

#include "linklist.h"

#include // 建構函式和析構函式

linklist::linklist()

// 複製建構函式

linklist::linklist(const linklist & linklist)

delete ptemp;

}linklist::~linklist()

// 判斷鍊錶是否為空

bool linklist::isempty()

// 獲得鍊錶中元素的個數

int linklist::size()

// 建立乙個結點

linklist::node* linklist::makenode(const item item)

// 向鍊錶的尾部插入資料

bool linklist::insertitem(const item item)

// 向鍊錶中某個位置上插入資料

bool linklist::insertitem(const item item, const int index)

else

count++;

return true;

}// 刪除鍊錶首個元素

bool linklist::deleteitem(item &item)

// 刪除鍊錶中某個位置的元素

bool linklist::deleteitem(item & item, const int index)

// 清空鍊錶

bool linklist::clearlist()

return true;

}// 過載索引運算子

item linklist::operator(const int index)

// 過載賦值運算子

linklist & linklist::operator=(const linklist & linklist)

delete ptemp;

return *this;

}// 顯示鍊錶中所有的元素

void linklist::show() }}

線性表的鏈式儲存結構

線性表的鏈式儲存結構 順序儲存結構不足的解決辦法 缺點 最大的缺點就是插入和刪除時需要移動大量元素。為了表示每個資料元素 ai與其直接後續資料元素 ai 1 之間的邏輯關係,對資料元素 ai來說,除了儲存其本身的資訊之外,還需儲存乙個指示其直接後續的資訊。我們把儲存資料元素資訊的域稱為資料域,把儲存...

線性表的鏈式儲存結構

線性表的鏈式儲存結構,雙向鍊錶實現 package 線性表 public class dulinklist public node t data,node prev,node next 儲存該鍊錶的頭節點 private node header 儲存該鍊錶的尾節點 private node tail...

線性表的鏈式儲存結構

順序儲存結構的缺點 插入和刪除時需要移動大量元素 鏈式儲存結構的特點 用一組任意的儲存單元儲存線性表的資料元素 資料結構 儲存分配方式 時間效能 空間效能 順序儲存結構 用一段連續的儲存單元一次儲存線性表的資料元素 查詢 o 1 插入刪除 o n 需要預分配儲存空間,分大了浪費,分小了易發生上溢 單...