# Linked List ## 11/17社課 --- ## Linked List 鏈結串列 不常用的(?)指標結構 ---- ### Linked List是啥 一種struct 包含元素、連接下一個元素的指標 ---- ### 建立 Link List 的 struct ```cpp= struct exp{ int A; exp * next; } ``` exp1 >> next 指標 >> exp2... 這裡的int也能用其他型別替代 ---- ### 建置 head 結構起點 ```cpp= exp * head; head = new exp;//簡寫 exp * head = new exp; ``` 建立一個指向exp的指標 向記憶體要一個exp結構的空間 ---- ### 建置節點 ```cpp= head = new exp; exp * p1 = head; ``` 向記憶體要一塊結構後 用一個臨時指標p1指向head 表示目前p1節點的位置(head) ---- ### 建置下個節點 ```cpp= p1 -> next = new exp;// p1->next 可視為 p1指向next p1 = p1 -> next; p1 -> next = NULL;//如果不需要建置下個節點則指向NULL ``` 再和記憶體要一塊新的 exp 空間 讓 exp 空間中的 next 指向下一個 exp 的 head 最後讓 p1 指向 next(p1移動到新節點) ---- 利用迴圈建立Linked List ```cpp= exp * p1 = head; for( i = 1; i < n; i++ ){ cin >> a; p1 -> next = new exp(); p1 = p1 -> next; p1 -> A = a; p1 -> next = NULL; }; ``` --- ## 刪除節點 ---- ### 刪除首項 ```cpp= p2 = head;//將head紀錄位置存放到p2 head = head -> next; delete p2;//刪除原本head紀錄所占用空間 ``` ---- ### 刪除值在中間 ```cpp= int find; cin>>find; //要被刪掉的值 exp *p2, *follow; p2 = head; if ( head == NULL ){ //head為空的空鏈結 cout<<"Not Found"; //找不到 } if( head -> value == find ){ //第一個節點是要刪除的目標值 head = head -> next; //把head移到下一格去 delete p2; //刪掉存head值的p2 } //尋找要刪除的目標 while(( p2 != NULL ) && ( p2 -> value != find) ){ follow = p2; //把p2和follow往下移動 p2 = p2 -> next; } if( p2 == NULL ){ //找到最後一格還沒找到 cout<<"Not Found"; } else{ //刪除該節點 follow -> next = p2 -> next; delete p2; } ``` --- ### 優點 - 可快速刪除、新增元素 - 元素的類別不一定相同 - 不須先得知資料大小 - 不需要連續的記憶體空間 ---- ### 缺點 - 無法隨機存取(只知道首項) - 不知道值在第幾項的情況尋找很耗時 - 指標指來指去,很亂容易出錯 --- ## 練習 [b938](https://zerojudge.tw/ShowProblem?problemid=b938) 0u0 ...... ?
{"title":"Linked List","contributors":"[{\"id\":\"f73e3593-2b30-4cf8-89e6-dc544aaab97d\",\"add\":1775,\"del\":18}]"}
    139 views