單向鍊錶:
迴圈鍊錶:
鍊錶是一種常見的基礎資料結構,結構體指標在這裡得到了充分的利用。鍊錶可以動態的進行儲存分配,也就是說,鍊錶是乙個功能極為強大的陣列,他可以在節點中定義多種資料型別,還可以根據需要隨意增添,刪除,插入節點。儘管兩種結構都可以用來儲存一系列的資料,但又各有各的特點。
陣列的優勢,在於可以方便的遍歷查詢需要的資料。在查詢陣列指定位置(如查詢陣列中的第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...