連結串列( Linked List )


#include <bits/stdc++.h>
using namespace std;

struct Node{
    int data;
    Node *next;
};

int main()
{
    Node *head,*tail,*ptr;

    head = new Node;
    head->data=20;
    tail = head;

    //cout<<tail->data<<endl;
    //cout<<head->data<<endl;

    ptr = new Node;
    ptr->data = 30;
    tail->next = ptr;
    tail = ptr;

    cout<<tail->data<<endl;

}

課程要點:從頭到尾帶學生完成一個可以新增刪除插入反轉的linked list

我這裡有一批上好的互動教材,不看看嗎?

Linked List 視覺化 https://visualgo.net/en/list

Linked List實作Queue https://www.cs.usfca.edu/~galles/visualization/QueueLL.html

Linked List實作Stack https://www.cs.usfca.edu/~galles/visualization/StackLL.html


Linked List 示意圖↓

Linked List V.S. Array

速度:

Array 抓資料速度快,只要給索引(index)就可以抓到想要的資料 像是a[4]代表從a陣列中抓第4個值(從0開始),而Linked List則必須從頭開始往後找。

空間方面(記憶體配置):

Array 空間固定 不易分配,分配太少怕不夠 分配太多怕浪費,Linked List動態分配,加資料就重新分配一個空間出來放,資料不要了就釋放掉

過去記憶體容量小 為了避免浪費,用Linked List可以節省空間,但現在記憶體容量越來越大也就比較不怕浪費了,而且STL也提供很多好用的function讓我們使用,也同樣像Linked List一樣可以有善管理空間,不過依然是資料結構必學的一個學問。


1.先建立一個Node吧!

建立linked list

head = tail = new Node;
head ->next=NULL;
head ->data=value;

試試看把Node加入建構子(Constructor)

#include<iostream>
using namespace std;

struct Node
{
    int data;
    Node * next;
    Node(int num){ //建構子 Constructor
        data=num;
    }
};

int main(){

    Node *a=new Node(2); //直接在宣告Node的時候給予data的值
    cout<<a->data; //輸出2
    return 0;
}

2.在尾巴加上新的Node

一個一個將Node給建立出來,看著教學影片,慢慢了解↓

How to Create a Linked List C++ Introduction to Linked Lists

在尾巴加上新的Node

ptr = new Node;   //創立一個全新的Node
ptr ->data=value; //並給予新Node值
ptr ->next=NULL;  //新Node要接在最後面,所以Node的next會是NULL
tail ->next=ptr;  //把尾巴接到新Node
tail = ptr;       //新Node成為了tail

3.列出每個Node的Data,並輸出Linked list長度

ptr = head;                    //從頭開始
while (ptr != NULL) {          //還沒到底的話
    cout << ptr ->data << " "; //輸出當前Node的資料
    ptr = ptr ->next;          //往下一個Node移動
}

4.搜尋Node

跟列出所有Node的程式碼很像,只是在每個Node都要判斷data等不等於key

cin >> key; // 要找的數字

ptr = head;
while (ptr != NULL)
{
    if (ptr ->data == key)
    {
        found = true;
        break;
    }
    ptr = ptr ->next;
}

if (found)
    cout << key << "is found" << endl;
else
    cout << key << "is not found" << endl;

5.刪除最後一個Node

if (head == tail) { //只剩一個Node,就直接刪掉自己
    ptr = head;
    head = NULL;
    delete ptr;
    cout << "清空linked list" << endl;
}
else{ //有兩個以上的Node

    ptr = head;
    while (ptr ->next != tail) {
        ptr = ptr ->next;
    }

    ptr ->next=NULL;
    delete tail;
    tail = ptr;

}

5-1. 在Head前插入Node


ptr = new Node;   //創立一個全新的Node
ptr->next=head;
head=ptr;

5-2. 刪除Head


ptr=head;
head=head->next;
delete ptr;

results matching ""

    No results matching ""