數據結構—鏈表詳解

淺談數據結構——鏈表

本篇隨筆就數據結構——鏈表進行講解。鏈表是一種特別實用的數據結構,我把它理解爲數組的升級版,也就是在數組的基礎上,它能作到在任意位置添加或者刪除元素,而不影響其餘元素。鏈表仍是咱們進行圖論學習時,圖的經常使用存儲方式——鄰接表(鏈式前向星)的實現基礎。學習鏈表須要讀者具備必定的語法基礎,最好會一點點指針。(不會也不要緊,咱們主要講解數組模擬鏈表)數組

什麼是鏈表

鏈表,顧名思義,就是帶鏈的表。我已經說過,鏈表屬於數組的增強版。那咱們能夠藉助數組來理解鏈表:若是說數組是一長排連在一塊兒的「方塊」的話,那麼鏈表就是把這些方塊「拉開「,每一個方塊還有兩個箭頭,分別指向這個方塊前面的方塊和後面的方塊。數據結構

這樣咱們就能夠理解,爲何鏈表能夠支持隨機插入和刪除了。從某種意義上來講,這裏的每個方塊都是離散的,咱們在某兩點插入的時候,只須要把要插入的元素,這個元素目標位置前面的元素、後面的元素的箭頭改一下,就作到了插入的操做。刪除同理。學習

鏈表的實現原理

根據剛纔的理解,咱們能夠發現,咱們能夠用一個結構體來模擬每個方塊,結構體中存一個元素和兩個指針,指針分別指向上一個元素的位置和下一個元素的位置。可是蒟蒻不會指針指針的實現比較麻煩,並且在調試的時候也不是很理想。因此咱們來想指針的本質就是告訴你一個位置,那麼針對於」增強數組「鏈表來說,這個位置能夠用什麼來表示呢?指針

對,數組下標。調試

因此咱們剛纔的結構體就能夠簡化,變成存一個元素和兩個int變量(存儲數組下標)。這樣,咱們就能夠用結構體數組模擬鏈表的實現。code

鏈表基本操做的代碼實現

鏈表實現的精髓就是更改指針,改掉了三個元素(前,中,後)的指針使鏈表合法,就完成了咱們須要作的操做,本部分再也不就每段代碼進行過多講解,請你們自行理解代碼含義,最好藉助紙筆推演,看的會更明白一些。rem

(1)初始化

咱們初始化鏈表的時候,要根據題目意思處理開頭的第一個元素,這很重要!而且,咱們把全部的指針都清成-1,這樣保證了鏈表初始絕對合法。it

void init()
{
    for(int i=1;i<=n;i++)
        a[i].pre=a[i].nxt=-1;
    a[1].nxt=-1;
    a[1].pre=0;
    a[0].nxt=1;
}

(2)插入操做

void insert_left(int pos,int k)//把元素k插入到pos元素以前
{
    a[a[pos].pre].nxt=k;
    a[k].pre=a[pos].pre;
    a[pos].pre=k;
    a[k].nxt=pos;
}
void insert_right(int pos,int k)//把元素k插入到pos元素以後
{
    a[a[pos].nxt].pre=k;
    a[k].nxt=a[pos].nxt;
    a[pos].nxt=k;
    a[k].pre=pos;
}

(3)刪除操做

void remove(int x)
{
    if(a[x].pre==-1)
        return;
    a[a[x].pre].nxt=a[x].nxt;
    a[a[x].nxt].pre=a[x].pre;
    a[x].pre=-1;
    a[x].nxt=-1;
}

(4)遍歷

void print()
{
    int start=a[0].nxt;
    while(1)
    {
        printf("%d ",start);
        if(a[start].nxt==-1)
            break;
        start=a[start].nxt;
    }
}
相關文章
相關標籤/搜索