鍊錶基礎學習總結

2021-09-24 13:35:16 字數 4107 閱讀 9312

單向鍊錶:

迴圈鍊錶:

鍊錶是一種常見的基礎資料結構,結構體指標在這裡得到了充分的利用。鍊錶可以動態的進行儲存分配,也就是說,鍊錶是乙個功能極為強大的陣列,他可以在節點中定義多種資料型別,還可以根據需要隨意增添,刪除,插入節點。儘管兩種結構都可以用來儲存一系列的資料,但又各有各的特點。

陣列的優勢,在於可以方便的遍歷查詢需要的資料。在查詢陣列指定位置(如查詢陣列中的第4個資料)的操作中,只需要進行1次操作即可,時間複雜度為o(1)。但是,這種時間上的便利性,是因為陣列在記憶體中占用了連續的空間,在進行類似的查詢或者遍歷時,本質是指標在記憶體中的定向偏移。然而,當需要對數組成員進行新增和刪除的操作時,陣列內完成這類操作的時間複雜度則變成了o(n)。

鍊錶的特性,使其在某些操作上比陣列更加高效。例如當進行插入和刪除操作時,鍊錶操作的時間複雜度僅為o(1)。另外,因為鍊錶在記憶體中不是連續儲存的,所以可以充分利用記憶體中的碎片空間。除此之外,鍊錶還是很多演算法的基礎,最常見的雜湊表就是基於鍊錶來實現的。基於以上原因,我們可以看到,鍊錶在程式設計過程中是非常重要的。

鍊錶就像是一排掛鉤,a掛住b,b掛住c,c掛住d……最後形成乙個鍊錶。

鍊錶的插入就像是開啟a的掛鉤,鏈結上e,這個時候鍊子斷掉了,我們需要再用e掛住a後面的b,形成了乙個新的鍊錶。

刪除則反之,分別開啟a和e的掛鉤,把e取下來,這個時候鍊子斷掉了,我們需要再用a掛住e後面的b,形成了乙個新的鍊錶。

#ifndef cheatinglistdata_h__

#define cheatinglistdata_h__

#pragma once

templatestruct node

;template/*

使用環形鍊錶儲存表內訊息

多執行緒處理鍊錶內的資料(防止訪問記憶體衝突使用拷貝,處理時不呼叫原記憶體)

處理後自動刪除

*/class ccheatinglistdata

;#endif // cheatinglistdata_h__

#include "stdafx.h"

#include "cheatinglistdata.h"

templateccheatinglistdata::ccheatinglistdata() //初始化時,只有乙個頭結點,有head指向

templateccheatinglistdata::ccheatinglistdata(const ccheatinglistdata&otherlist)

if (otherlistcurrent->next == otherlist.head)

}}templateconst ccheatinglistdata& ccheatinglistdata::operator=(const ccheatinglistdata&otherlist)//賦值函式

while (otherlistcurrent != otherlist.head)

}return *this;//為了連續賦值

}templateccheatinglistdata::~ccheatinglistdata()

templatevoid ccheatinglistdata::createlistforward(type f_seat)//頭插法

templatevoid ccheatinglistdata::createbackward(type f_seat)//尾插法

node* newnode;

newnode = new node;

newnode->data = f_seat;

newnode->next = current->next;

current->next = newnode;

current = current->next;

}templatevoid ccheatinglistdata::initlist() //只剩下頭結點,和指標設定

templatebool ccheatinglistdata::isemptylist()

else }

templatevoid ccheatinglistdata::printlist()

}templateint ccheatinglistdata::length()

templatevoid ccheatinglistdata::destorylist()//銷毀包括頭結點

delete temp;

len = 0; }}

templatevoid ccheatinglistdata::getfirstdata(type& firstitem)

else }

templatevoid ccheatinglistdata::search(type searchitem)

else

if (current != head)

else

}}templatevoid ccheatinglistdata::insertfirst(const type newitem)

templatevoid ccheatinglistdata::insertlast(const type newitem)

//此時current指向結點的尾部,就是應該插入的位置

newnode->next = current->next;

current->next = newnode;

len++;

}templatevoid ccheatinglistdata::insertbefore(const int pos, const type newitem)

node* newnode = new node;

newnode->data = newitem;

if (1 == pos)

else

newnode->next = current->next;

current->next = newnode;

} len++;

}templatevoid ccheatinglistdata::insertafter(const int pos, const type newitem)

node* newnode = new node;

newnode->data = newitem;

while (i < pos)

newnode->next = current->next;

current->next = newnode;

len++;

}templatevoid ccheatinglistdata::deletenode(const type deleteitem)

else

if (current == null)

else

len--; }}

templatevoid ccheatinglistdata::deletenode(const int pos, type& deleteitem)

while (i < pos)

temp = current->next;

current->next = temp->next;

deleteitem = temp->data;

delete temp;

len--;

}template//逆轉鍊錶,依次取出煉表裡的元素對鍊錶進行頭插

void ccheatinglistdata::reverse()

else }

}//判斷是否有環

templatebool ccheatinglistdata::findloopnode()

return false;

}templatenode* ccheatinglistdata::findloopstart()

if (one == null || tow->next == null) return null; //沒有環,返回null值

node* ptr1 = head; //鍊錶開始點

node* ptr2 = one; //相遇點

while (ptr1 != ptr2)

return ptr1; //找到入口點

}

鍊錶 鍊錶環問題總結

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...

鍊錶學習 靜態鍊錶

struct linknode 鍊錶在指定位置插入與刪除元素不需要移動元素,只需要修改指標即可,而陣列刪除與加入元素則需要移動後面的元素,鍊錶相對於陣列來講,則多了指標域空間開銷,拿到鍊錶第乙個節點就相當於拿到整個鍊錶 鍊錶的分類 靜態鍊錶,動態鍊錶 單向鍊錶,雙向鍊錶,迴圈鍊錶,單向迴圈鍊錶,雙向...

雙向迴圈鍊錶的學習總結

雙向迴圈鍊錶有兩個指標節點,乙個指向前驅,乙個指向後繼,可以向前和向後訪問任何資料。實現建立 刪除 新增 輸出雙向迴圈鍊錶的資料的c語言 雙向鍊錶的建立及插入乙個資料及輸出所有的資料 include includestruct node t node int main int ar char arg...