看板 NTUE-CS100 關於我們 聯絡資訊
※ 引述《yantchen (球童Yanting)》之銘言: : ※ 引述《gingkoginkgo (人中拉拉!)》之銘言: : : node本身就是像int一樣的資料型別(型態?)嗎? : : 還是說他還有其他的功用? : node 在標準的 C++ 裡面不存在喔 : 要用 class 自己定義 : : 那 所謂的heap(head?)是什麼呢? : : 今天上課看到老師似乎有宣告了出這個鬼O_O? : : 就我那一天只要一碗飯一瓢水的大腦 理解出來是這樣Orz : : 每個data被存放的記憶體位置不同 但是我們在讀取時必須要照順序 : : 所以需要利用指標來標記 : : 記 憶 體 位 置 非 連 續 : : heap(?) A1 B2 C3 D4 E5 : : ▔▔▔▔ ▔▔▔▔ ▔▔▔▔ ▔▔▔▔ ▔▔▔▔ ▔▔▔▔ : : 我是空的 data01 data02 data03 data04 null : : 沒資料 ↘ ↑ ↘ ↑ : : 指標L1 指標L2 : heap是一種父親一定比小孩大或小的complete binary tree : link list 裡面只向第一個項目的指標叫做 head : 用箭頭是我們示意的表示法 實際上電腦記憶體裡面長這個樣子 : instance | head a1 a2 a3 a4 : -------------------------------------------- : address | 0x12 0x18 0x23 0x11 0x56 : | : data | null 1 3 2 7 : | : link | 0x18 0x23 0x11 0x56 null : 只要有head指向第一個資料 就可以利用link找到下一個資料 : 另外語法的部份 : C++裡面 : int a; // a 是 int 型態的變數 : mystack b; // b 是 mystack 型態的變數 : int* c; : int *c; // c 是 指標變數 指向 int 型態的變數 *號兩個位置都OK : mystack* d;// d 是 指摽變數 指向 mystack 型態的變數 : 指標變數的用法: : c=&a; // &a代表a的位址(例如0x8793) c是指標 所以裡面存的是位址 : e=*c; // *c代表c這個位址裡面的資料 因為c指向a 所以 e 會得到 a 的數值 : 假設class mystack的定義如下 : class mystack{ : int data; : mystack* link; : } : b.data=10; : b.link=&e; : d->data=15; : d->link=&b; : class裡面定義的屬性 : 一般變數用.來存取 例如上面的b.data : 指標變數用->來存取 例如上面的d->data : : 就概念來講 電腦讀完data01後 接著找的是指標L1 而L1本身是紀錄data02的位置 : : 就可以讀取到data02 後面就一直跟著指標走到null : : 有錯請用力鞭<(_ _)> : : 不過 還是有不知道該怎麼打的問題 : : 問題(a).和-> 兩個差在那裡? 要用在哪裡?(因為像老師在黑板上用的是->而非.) : : (b)如果是三個data還好 不過如果是50個的話 我猜就會用迴圈來寫了 : : 不過要怎麼寫?(建立一個陣列去存指標嗎? ) : : 引申的問題有兩個(1)怎麼才能存那堆指標的? 用陣列? stack? : : (2)要怎樣才能輸出? : : 插入和刪除的部分我還要再研究(嘆) : 的確是用迴圈 : 假設你要找第50筆資料 : 就用迴圈從head的link往下找50次 前面就恕我不整理了 有關於 (b)如果是三個data還好 不過如果是50個的話 我猜就會用迴圈來寫了 不過要怎麼寫?(建立一個陣列去存指標嗎? ) 引申的問題有兩個(1)怎麼才能存那堆指標的? 用陣列? stack? (2)要怎樣才能輸出? 建立陣列去存指標會遇到一點問題 比如說 建立了一個50個指標的陣列 但是你還是只得到了50個指標而已 並沒有得到50個物件 如果未了產生這些物件而去建立一個50個物件的陣列 那就失去做這樣一個串鏈(?)的意義了 在下經過一些嘗試後寫出了以下的碗公 不嫌棄的話就加減看看吧 以下是我的物件寫法 先大概看一下有啥就好後面會在介紹哪裏用到什麼東西 class chain{ //因為覺得有點像鏈子的資料型態 所以用chain命名 public: void dti(int &i){data=i;} //輸入資料用函數 讀入一個整數參考 int dto(){return data;} //輸出資料用 回傳"data" void pti(chain *i){link=i;} //輸入連結對象用 讀入一個"chain的指標" /*(這裡雖然用"i"和上面的"dti(int &i)"相同 不過這個讀入部分取的名稱 只會作用在這個函數之內 所以只要讀入的名稱和含數裡用的名稱相呼應 和其他函數重複也沒有關係)*/ chain *pto(){return link;} //輸出連結對象 回傳"link" private: int data; //存放一個整數資料 //(如果要存放其他型態的資料或著更多其他資料也是在這邊宣告.命名) chain *link; //存放連結到下一個資料的指標 }; 要怎麼用這碗公 該include的那些 該using namespace那些 就掠過 灰字的部份是詳細解釋 main(){ int i=0,j=0,k=0,sum=0;//操作用 //(這些東西用來操縱迴圈 輸入資料 妙用無窮(?!)) chain *h = new chain;//標示串鏈起始位置的指標 /*(就是所謂的頭(head?) 用來標示資料串的起始位置 並確保資料串的起始位置不會在程式執行中遺失)*/ chain *ptct = new chain;//指定作業對象的指標 /*(就是讓程式記憶 "現在" 東西執行到哪裡(哪一個資料) 如果將資料比喻成很多台電腦 那麼這個指標就好像是我的"手" 將它放在哪一台電腦的鍵盤滑鼠上 就可以控制那一台電腦做事)*/ //製造chain ptct=h; //先將我的控制目標指向這串資料的頭 cin >> j; //指定要建造幾個資料 while(i<j){ //會執行j次(0,1,2...(j-1)) (/*我曾經試著用for 不過好像會失敗 編譯沒有問題 但是程式會作業無效)*/ ptct->pti(new chain); /*(都知道"new"這個指令是向程式要求一個資料(變數) "並且回傳他的位置" EX:int char ...當然包含用class定義過的chain 課本裡可以找到的用法如 int *a = new int; "建立一個新的指標"a" 然後將他的值 指定為"一個新的int資料的位置" 而ptct->pti(xxx)則是會將"xxx"輸入到ptct的"link" 也就是說 這句話的意思相當於 "用ptct->pti()這個函數存入一個位置到"指標ptct->link" 而這個位置是 來自於 new chain 這個指令(建立一個新的chain資料並回傳其位置) 所以 在這一行裡 我們同時執行了 1.建立新chain 2.將新chain的位置儲存到ptct->link(存放連結到下一個資料的指標))*/ ptct=ptct->pto();//將ptct->pto()的回傳值送回ptct /*(ptct->pto()這個函式是將ptct->link中的位置讀出來 當這個位置送入了ptct(指標)的時候 ptct也就指向了一個不同的資料 也就是我們剛剛將他的地址存入的 新chain資料 注意 在執行完這行指令之前 我們操縱的是"h" 執行完這行指令之後 我們操縱的就是一個新資料 我們姑且稱之為"h1" (因為使用new產生的資料並不具備程式中的名稱))*/ sum++;//這部份是為了將來輸出全部資料和掌握總資料數而設定的 i++;//這部份是為了控制迴圈 /*(要分開兩個變數是因為以後i在其他地方使用的時候還會改變 所以無法取代sum的功能 i在此只做為這個迴圈的控制變數而已)*/ } } 這樣就把資料建立好嚕 那要怎麼存東西進去咧 有一個方法是建立的時候同時輸入 也就是ptct->pti(new chain);的下面 直接加上 cin >> k; ptct->dti(k); 這樣就可以在建立資料的同時輸入資料值 另外的方法則是建立後利用for迴圈 ptct=h; //一樣 在進行操作前先將控制目標轉移到頭 for(i=0;i<sum;i++){ //這時候sum的功能就出來了 ptct=ptct->pto();//將控制目標轉到下一個資料 /*(也就是說 你一開始進來的時候指向"h"跑完這行就會指向"h1" 等到迴圈跑完又回到這裡 就會從指向"h1"變成指向"h2" 依此類推)*/ cin >> k; ptct->dti(k);//這邊就是將資料輸入到目前指向的資料 } ok 迴圈跑完也輸入完了 讀取 就將輸入那2行換成cout << ptct->dto(); //(排版的部份可以適當使用endl之類) 至於其他的 目前我想到的 像是 指定目標編輯/讀取.搜尋 等等 都是用類似的概念 至於怎麼"插入"新資料 之類的 我還沒研究 可能就以後再說 或著交給能人啦 XD~ 另外因為個人函數名稱變數名稱啥的都取的怪裡怪氣 造成各位閱讀困擾 在此致歉嚕 其實也不難看出涵義 EX:dto 就是 data out. ;pt則是連結的簡寫 ;ct是control之類 那...明天還要早起... 各位晚安~ 祝 遊戲愉快 (?!) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.221.141 ※ 編輯: cpfmarnbg 來自: 118.166.221.141 (03/28 23:55) ※ 編輯: cpfmarnbg 來自: 118.166.221.141 (03/28 23:57)