最近正在看《大話資料結構》,書中給出的線性表的鏈式儲存結構是以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 需要預分配儲存空間,分大了浪費,分小了易發生上溢 單...