在資料結構的學習中,鍊錶可以說是我們最早接觸到的一種資料結構了(字串和陣列除外),在各大資料結構及演算法書中,如clrs,或者是清華大學版資料結構中,鍊錶也是最早介紹的一種資料結構。它實現起來比較簡單,同時能實現一些我們平時用陣列難以實現的功能,很適合我們入手資料結構。下面我們簡單來看看鍊錶中最簡單的一種,單鏈表的結構及其實現。
鍊錶是一種線性的資料結構,它由結點構成,每個結點由資料域和指標域組成。其中,除了頭結點外和尾結點外,每個結點都有乙個前驅及後繼。其中結點的資料域儲存資料,指標則指向後繼結點。如圖所示
鍊錶相對於陣列,它的有點在於能夠快速地增加或者刪除元素,只需要改變指標指向,無需移動元素。其增加元素刪除元素的時間複雜度是o(1),而陣列的時間複雜度為o(n)。另外,鍊錶相比之於陣列其劣勢在於無法隨機訪問元素,若要訪問鍊錶中的某一位置的元素,必須從表頭開始遍歷,時間複雜度為o(n),相比之下陣列可以通過下標直接索引,時間複雜度僅為o(n)。另外,由於每個鍊錶結點中,既儲存了資料,又儲存了指標,所以鍊錶的儲存密度小於1。(儲存密度 = (結點資料本身所佔的儲存量)/(結點結構所佔的儲存總量))
下面是簡單的單鏈表的c++源**實現:
首先是linklist.h的標頭檔案,其定義了鍊錶支援的方法。
using namespace std;
struct listnode
};class list
;
接下來是cpp檔案,是鍊錶方法的實現:
// list_1.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include "linklist.h"
#include
using
namespace
std;
//鍊錶建構函式
list::list()
//鍊錶的析構函式,遍歷鍊錶並且刪除每個結點
list::~list()
}}//返回鍊錶長度
int list::length()
//判斷鍊錶是否為空
bool list::empty()
//鍊錶末尾插入。
void list::push_back(int val)
++len;
}void list::display()
cout
<< endl;
delete p;
}//在第pos位插入乙個新的元素
void list::insert(int val, int pos)
//若在鍊錶頭部插入,則需要更改頭結點
else
if (pos == 1)
listnode *p = head;
for (int i = 0; i < pos - 2; ++i)
p = p->next;
listnode *s = new listnode(val);
s->next = p->next;
p->next = s;
++len;
}//判斷乙個元素是否在鍊錶內
bool list::search(int val)
delete p;
return
false;
}//刪除pos位的元素
void list::erase(int pos)
//若在頂端刪除,則需要更改頭結點
else
if (pos == 1)
//鍊錶中間刪除
listnode *p = head;
for (int i = 0; i < pos - 2; ++i)
p = p->next;
listnode *s = p->next;
p->next = s -> next;
delete s;
--len;
}int _tmain(int argc, _tchar* argv)
資料結構之單鏈表實現
用兩個月的時間好好把資料結構複習一遍,都算不上覆習了,最後的圖的方面完全是新學,希望能堅持下去。一 單鏈表 煉表相比較於陣列更為靈活,儲存方式是鏈式的,插入刪除操作優於陣列,但是查詢操作優於陣列。還是不多介紹了直接上 吧。參考資料結構與演算法分析 c語言版本 標頭檔案 ifndef list h d...
《資料結構》單鏈表基本操作實現
define ok 1 define error 1 typedef int elemtype typedef int status typedef struct node lnode,linklist 構造空表 status initlist linklist l void creatlist l...
單鏈表基本操作的實現(資料結構)
建立具有10個元素的單鏈表,並能對該錶進行查詢 插入 刪除等基本操作 cpp檔案字尾名 include include typedef int elemtype typedef struct lnode linknode 單鏈表結點型別linknode 尾插法建立單鏈表 從一空表開始依次讀取陣列a中...