
你可能會問我 怎麼突然跳到指標 原因是心血來潮 因為要是講while之類的 太簡單 你可能會睡著
那麼直接講一下大部分人的噩夢 也曾經是我的噩夢 那就是 link-list 首先 link-list可以很簡單 也可以很複雜 為何簡單 簡單的link-list結構就像array只有一條"直線" 複雜的 link-list可以長出"四面八方的結構" link-list使用時機 當你要處裡的資料 array無法應付時 那就是他出場的時機了 當然搜索時間比起array時間較長 但是可以更靈活的存取資料 那麼介紹到這邊 我們開始吧!
為了讓大家更好懂 這裡我會用最簡單的link-list作為教學範本
//-------------------以下為程式碼---------
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
struct Test {
int num ;
Test *next ;
} ; // Test
/*
*
*/
int main() {
Test *testHead = new Test ;
Test *temp = new Test ;
Test *temp2 = new Test ;
testHead ->num = 0;
testHead ->next = temp ;
for ( int i = 1 ; i < 5 ; i++ ) {
temp -> num = i ;
temp ->next= new Test;
temp = temp ->next ;
temp ->next = NULL ;
} // for
temp2 = testHead ;
while ( temp2->next != NULL ) {
cout << temp2 ->num << endl ;
temp2 = temp2 -> next ;
} // while
//system("pause"); 請視自己編譯環境加上去 有些編譯軟體自動會+ 所以自己看情況
return 0;
}
//-------------------------------區隔線--------------------------------------------------
1.struct 這個可以幹嘛 它可以用來定義自己想創造的型態 例如int是存整數的數字型態 有了這個就可以創造一個型態 裡面可以宣告你想要存入的資料型態 用來放資料
例如 :
struct Test {
int num ; // 我想要給每個資料編號 所以我宣告了int 由於沒有給他初始值裡面是亂數
Test *next ; // 這個是指標 沒有給他初始記憶體位址 所以他會是某個亂數的記憶體位址 這個要小心 原因是這有可能會侵犯到你不能碰的記憶體位址 導致程式崩潰 可以先別理他 等等會解釋
} ; // Test
以下為想像圖 等等配合link-list使用
2.指標 當我們在宣告指標的時候 c的語法是這樣的
型態 *你想要的變數名稱 = new 型態 ;
指標裡只能存記憶體位址 例如: 指標1 = 指標2 ; // 這會讓指標1指向指標2 也就是說 指標1裡面
現在存放的是指標2的記憶體位址
Test *testHead = new Test ; //這裡我用自己定義的型態來宣告指標 這邊我會建議先要有一個"頭" 然後不要去更改他的記憶體位址 想像你住在一個高樓大廈的7F 你要是找不到1F你要怎麼上去你家 除非你會飛 那我沒話說== 這概念就是為何要有頭
Test *temp = new Test ; // 這是用來建立link-list的指標
Test *temp2 = new Test ; // 這是用來搜尋用得指標 可以先別理他
testHead ->num = 0; // 現在有一個叫做 testHead的指標 它裡面有num 和next
testHead ->next = temp ; // 將testHead裡面的指標next指向temp 最外框就是temp的記憶體位址喔!
3. 使用迴圈 開始建立link-list
for 是迴圈的一種和while類似 但又有點不同 這邊我順便介紹for的運作
for( 宣告變數or已宣告的變數給值只有第一次進迴圈才會run這, 條件, 你要做的事 通常都是放最左邊的變數 ) 流程看圖 藍色之後開始重複做藍色 直到i等於5時停止
for ( int i = 1 ; i < 5 ; i++ ) {
temp -> num = i ; // 將temp裡的num改為i現在的數字
temp ->next= new Test; // 此temp裡的next會指向新的struct 請看圖1
temp = temp ->next ; // 先看右邊 temp裡的next 的記憶體位置 放到temp 然而目前temp裡
的next指向的是新的struct 現在看左邊的temp 此temp被放入新struct的記憶體位址所以
現在的temp會指向新的struct 請看圖2
temp ->next = NULL ; // 把temp裡的next設NULL值 就是啥都沒有
} // for
看文字你可能沒看懂 所以來看圖 可能比較好理解
圖1 :
圖2 :
所以現在的temp是
接下來就是把現在的temp裡的next設成NULL
開始做重複的事 直到迴圈停止
最後的想像圖
到這邊 link-list已經建立完成
現在要開始搜索link-list 還記得我們的1F嗎 你肯定忘記了 沒關係電腦也忘記了 這就是"頭"存在的意義 testHead 所以我才說不要去動他 他是負責記得我們的link-list的"頭"
temp2 = testHead ; // 將我們的頭存放的記憶體位址 放到temp2裡面 此時temp2就相當於"頭"
接下來這是另外一種迴圈 運作方式很簡單 條件符合就進入 直到條件不符合時停止
while ( temp2->next != NULL ) {
cout << temp2 ->num << endl ; // 印編號給自己看
temp2 = temp2 -> next ; // 先看圖3是等號右邊的temp2 -> next 再看圖4是最後的結果 也就
// 是 temp2 = temp2 -> next ;
} // while
圖3 :
圖4 最後的結果 :
所以temp2現在是 :
接下來是跑搜尋迴圈 以此類推 直到next為NULL時停止迴圈
結果想像圖 :
如果有問題 可以私信 我有看到會回答 之後應該都會懶得看這串的回覆==
請到薯條控的那串 問都問 去那串問問題 那邊很多大神會幫忙解決問題 我有看到也會幫忙
可能講解有地方有誤 請在留言裡告知 我會盡快修正 下一次應該會講遞迴吧 那麼這次的教學到此結束 感謝各位觀看!
我是富間明年見(x