3 線性表

1. 線性表概念:零個或多個數據元素的有限序列

2. 線性表的順序存儲結構
2.1 線性表順序存儲結構的概念:用一段地址連續的存儲單元一次存儲線性表的數據元素。
2.2 線性表順序存儲結構的優缺點
    優點:
        (1)無須爲表示表中元素之間的邏輯關係而增加額外的存儲空間
        (2)可以快速存取表中任意位置的元素
    缺點:
        (1)插入、刪除操作需要移動大量元素
        (2)當線性表長度變化較大,難以確定存儲空間的容量
        (3)造成存儲空間的“碎片”

3. 線性表的鏈式存儲結構
3.1 鏈式存儲結構的概念:n個節點鏈接成一個鏈表,即爲線性表的鏈式存儲結構
3.2 頭結點 頭指針
    頭指針:鏈表中第一個節點的存儲位置叫做頭指針。
        頭指針指向鏈表第一個節點的指針
        頭指針冠以鏈表的名字作爲鏈表的標示
        無論鏈表是否爲空,頭指針均不爲空
    頭結點:在鏈表中第一個節點前附設一個節點,稱爲頭結點。
        爲了操作的統一設立的,數據域一般沒有意義
        有了頭結點對鏈表第一個節點的操作和其他節點一致
        頭結點不是鏈表必要的

 3.3 單鏈表的插入
    流程: 
        1. 聲明一指針p指向鏈表頭結點,初始化j從1開始;
        2. 當j<i是,就遍歷鏈表,讓p的指針向後移動,不斷指向下一節點,j累加1;
        3. 若到鏈表末尾p爲空,則說明第i個節點不存在
        4. 查找成功,存在,將元素e的值賦給s
        5. s->next=p.next; p->next = s;
        6. 返回成功

 3.4 單鏈表的刪除
    流程:
        1. 聲明一指針p指向鏈表頭結點,初始化j從1開始;
        2. 當j<i是,就遍歷鏈表,讓p的指針向後移動,不斷指向下一節點,j累加1;
        3. 若到鏈表末尾p爲空,則說明第i個節點不存在
        4. 查找成功,存在,q=p->next;
        5. p.next=q.next;
        6. 將q節點中的數據賦值給e,作爲返回;
        7. 釋放q節點,Java:q=null; c:free(q);
        8. 返回成功

3.5 單鏈表的整表創建
    頭插法思路:
        1.聲明一個指針p和計數器i
        2.初始化一空鏈表L
        3.讓L的頭結點的指針指向NULL,即建立一個帶頭節點的單鏈表
        4.循環;{
            1. 生成一新節點賦值給p
            2. 隨機生成一數字賦給p的數據域p->data
            3. 將p插入到頭結點和第一個新節點之間
        }
    
    尾插法思路:
        1. 聲明一個指針p和計數器i
        2. 初始化空鏈表L和尾指針t
        3. 讓頭結點指針指向NULL,建立一個帶頭結點的單鏈表
        4. 循環{
            1. 生成一個新節點p
            2. t->next = p;
            3. t = t.next;
        }

3.6 單鏈表的整表刪除
    算法思路:
        1. 聲明一個節點p和q;
        2. 將第一個節點賦值給p;
        3. 循環{
            將下一個節點賦值給q
            釋放p
            將q賦值給p
        }
 
3.7 單鏈表和順序存儲結構的優缺點
    


順序存儲結構 單鏈表
存儲分配方式 連續存儲單元依次存儲 鏈式存儲結構,用任意存儲單元存放線性表
時間性能 查找 O(1) O(n)
插入和刪除 O(n) O(1)
空間性能 需要預分配,分大了浪費,分小了容易溢出 不受限制

3.8 靜態鏈表
概念:用數組描述的鏈表叫做靜態鏈表
數組每個元素有兩部分組成,數據data,指針cur
數組第一個元素的cur指向的是第一個空的數據位,最後一個元素cur指向第一個插入元素的下標

3.9 循環鏈表
    概念:將單鏈表中的終端節點指針端由空指針改爲指向頭節點,就使整個單鏈表形成一個環,這種頭尾相接的單鏈表成爲單循環鏈表,簡稱循環鏈表
    單鏈表判斷結尾的條件,p->next == 頭結點
    通常單鏈表由於訪問頭尾方便的需求,用尾指針來表示循環鏈表

    將兩個單鏈表合併成爲一個鏈表的操作思路:
    設有兩個單鏈表 rearA, rearB
    1. temp = rearA.next;    將A的頭指針暫存
    2. rearA.next = rearB.next.next;    將B的頭接到A的尾
    3. rearB.next = temp;    將隊尾指向頭指針

3.10 雙向鏈表
    概念:雙向鏈表是在單鏈表的每個節點中,再設置一個指向其前驅節點的指針
    要在p和p.next之間插入s,流程:
    1. s.prior = p;
    2. s.next = p.next;    // 先設置s的前驅後繼
    3. p.next.prior = s;    // 再設置下一個的前驅
    4. p.next = s;            // 最後設置p的後繼



























發佈了31 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章