一.引入
單鏈表是用一組任意的儲存單元存放線性表的元素,這組儲存單元可以連續也可以不連續,甚至可以零散分布在記憶體中的任意位置。
為了能正確表示元素之間的邏輯關係,每個儲存單元在儲存資料元素的同時,還必須儲存其後繼元素所在的位址資訊,這個位址資訊成為指標,這兩部分組成了資料元素的儲存映像,成為結點,其中,data 是資料域,用來存放資料元素;next 是指標域(也稱鏈域),用來存放該結點的後繼結點的位址。
單鏈表正是通過每個結點的指標域將線性表的資料元素按其邏輯次序鏈結在一起,由於每個結點只有乙個指標域,故稱為單鏈表。
二.演算法設計
singlinkedlist.h
#ifndef src_singlinkedlist_h_
#define src_singlinkedlist_h_
/* * 結點:
* data:資料域,儲存資料元素
*/template struct node;
template class singlinkedlist ;
#endif
三.詳細設計(c++)singlinkedlist.cpp
#include "singlinkedlist.h"
#include using namespace std;
/* * 無參構造器:
* 1.初始化頭結點:為頭結點新建乙個結點
* 2.把頭指標的 next 賦值為 null,即沒有後繼結點
* 3.當前長度為0
*/template singlinkedlist::singlinkedlist()
/* * 1.初始化頭結點:為頭結點新建乙個結點
* 2.把頭指標的 next 賦值為 null
* 3.迴圈,從傳入的陣列的最後乙個元素開始初始化(為了保證遍歷時按照傳入的陣列元素的原本順序輸出)
* ①.新建乙個結點 s
* ②.把元素的值賦給結點 s 的 data
* ③.把 first 的 next 賦給結點 s 的 next ,
* ④.把結點 s 的位址賦給 first 的 next
* 4.記錄當前長度
*/template singlinkedlist::singlinkedlist(t array,int length)
this->length = length;}/*
* 析構函式:
* 因為結點是 new 出來的,所以要進行 delete ,**空間
*/template singlinkedlist::~singlinkedlist()}/*
* 返回當前長度
*/template int singlinkedlist::getlength()
/* * 遍歷當前陣列:
* 1.定義乙個指標 p ,通過 first 的 next 找到與頭結點 first 相連的結點
* 2.若當前長度為1,輸出 p 的 data ,否則
* 3.迴圈,判斷 p 所在結點的 next 是否為 null ,即是否到達最後的結點
* >若否,則
* ①.輸出 p 所在結點的 data ,
* ②.根據 p 所在結點的 next 把 p 移到下乙個結點
* ③.判斷 p 所在結點的 next 是否為 null
* >若是,則跳出迴圈,此時 p 到達最後乙個結點,輸出最後乙個結點的 data
*/template void singlinkedlist::getall()else
p = p->next;
index++;
} cout
return p->data;}/*
* 通過值獲得該元素所在的位置:
* 1.定義乙個標記 flag,初始化為 false ,用來記錄是否找到該值
* 2.定義乙個指標 p ,通過 first 的 next 找到與頭結點 first 相連的結點
* 3.迴圈,遍歷所有結點的 data 是否與 value 相等,若是,輸出該元素的位置,並把 flag 賦值為 true
* 4.若找不到與 value 相等的,輸出「沒有此值!」
*/template void singlinkedlist::getbyvalue(t value)
if(!flag)
node*insertnode = new node;
insertnode->data = value;
insertnode->next = p->next;
p->next = insertnode;
length++;}/*
* 通過角標移除元素:
* 1.判斷角標是否合法,若不合法返回 ,否則
* 2.定義乙個指標 p ,其指向 first
* 3.迴圈,通過 index 把 p 移到對應的結點
* 如:陣列[0,1,2,3],要移除元素2,則此時的 index 為2,p 就移到元素1處,即 p 到達移除結點的前乙個結點處
* 4.定義乙個結點 removenode ,根據 p 所在結點的 next 給 removenode 初始化,即 removenode 的結構就是元素2所在結點的結構
* 5.把 removenode 的 next 賦給 p 的 next ,即此時儲存元素1的結點和儲存元素3的結點相連
* 6.刪除 removenode
* 7.當前長度減一
*/template void singlinkedlist::removebyindex(int index)
node*removenode = p->next;
p->next = removenode->next;
delete removenode;
length--;}/*
* 通過值移除元素:
* 1.定義乙個標記 flag,初始化為 false ,用來記錄是否找到該值
* 2.定義乙個指標 p ,通過 first 的 next 找到與頭結點 first 相連的結點
* 3.定義乙個角標 index ,初始化為 0 ,用來記錄遍歷到第幾個元素
* 4.迴圈,遍歷所有結點的 data 是否與 value 相等
* >若相等,則
* ①.呼叫 removebyindex(int index) 方法,傳入 index
* ②.把 flag 賦值為 true
* ③.跳出迴圈
* >否則
* ①.p 移到下乙個結點
* ②.index++,
* 5.若找不到與 value 相等的,輸出「沒有此值!」
*/template void singlinkedlist::removebyvalue(t value)
p = p->next;
index++;
} if(!flag)
p->data = value;}/*
* 通過值修改元素的值:
* 1.定義乙個標記 flag,初始化為 false ,用來記錄是否找到該值
* 2.定義乙個指標 p ,通過 first 的 next 找到與頭結點 first 相連的結點
* 3.迴圈,遍歷所有結點的 data 是否與 oldvalue 相等
* 若相等,則
* ①.則把該元素的值修改為 newvalue
* ②.把 flag 賦值為 true
* 把 p 移到下乙個結點
* 4.若找不到與 value 相等的,輸出「沒有此值!」
*/template void singlinkedlist::updatebyvalue(t oldvalue,t newvalue)
p = p->next;
} if(!flag);
cout<
cout<
五.執行結果
線性結構 單鏈表
鍊錶定義 使用結點來儲存資料元素。鍊錶優缺點 鍊錶中各資料元素的結點位址則不要求是連續的,因此必須同時儲存元素之間的邏輯關係 鍊錶的插入 刪除操作都比較方便,只需修改指標域的指向即可。單鏈表 include include using namespace std 建立結點 template clas...
1 資料結構 線性結構之單鏈表
一 定義 單向鍊錶 單鏈表 時鍊錶的一種,它由節點組成,每個節點都包含下乙個節點的指標。1 定義節點類 定義節點類 struct node 2 定義單鏈錶類class slist 二 實現 單鏈表的實現方式有很多種,常見的有 1 帶頭結點的單鏈表 2 不帶頭結點的單鏈表 3 帶頭節點和尾節點的單鏈表...
線性表 鏈式儲存結構之單鏈表
ifndef linklist h define linklist h include include include template class node node const elemtype data data data next null node const elemtype data,...