LV. 13
GP 57

【心得】c/c++程式教學入門 第4課 指標

樓主 月不升 as200188
51 -

你可能會問我 怎麼突然跳到指標 原因是心血來潮 因為要是講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
51
-
未登入的勇者,要加入討論嗎?
板務人員:

7589 筆精華,前天 更新
一個月內新增 9
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】