Re: [問題] 鍊結串列在記憶體配置時,如何分散配置?

看板C_and_CPP作者 (void)時間12年前 (2012/08/04 17:58), 編輯推噓10(1000)
留言10則, 10人參與, 最新討論串2/2 (看更多)
※ 引述《frankhsu421 (問號)》之銘言: : 我想將鍊結串列在一開始配置進記憶體時,不是佔用連續空間, : 而是分散開的(沒有實際目的,純粹想實驗看看), : 所以我先寫了下面這些程式碼: : struct linked : { : int value; : linked* next; : }; : . : . : . : . : int main(){ : int size; : cout<<"Linked List的欄位數:"; : cin>>size; : linked* pl=new linked; : for(int i=0; i<size; i++){ : linked* ptmp=pl; : ptmp->value=2*i; : if(i==size-1) ptmp->next=NULL; : else {ptmp->next=new linked; ptmp=ptmp->next;} : } : . : . : . : } : 但是執行後會發生錯誤,我猜原因是因為寫在迴圈內的 : linked* ptmp=pl; 及 ptmp->next=new linked; : 只會執行一次,所以不會一直重複配置。 : 想請問:程式碼要怎麼寫才能達到我的目的? version 1: size = 10; linked *p1 = new linked; for (int i = 0; i < size; i++) { linked *ptmp = p1; ptmp->value = 2 * i; if (i == size - 1) { ptmp->next = NULL; } else { ptmp->next = new linked; ptmp = ptmp->next; } } linked *p1 = new linked; ┌───┐ │v: ???│ │next ?│ └───┘ p1 i == 0: linked *ptmp = p1; ptmp->value = 2 * i; ┌───┐ │v: 0 │ │next ?│ └───┘ p1 ptmp ptmp->next = new linked; ┌───┐ ┌───┐ │v: 0 │ │v: ???│ │next ─→│next ?│ └───┘ └───┘ p1 ptmp ptmp = ptmp->next; ┌───┐ ┌───┐ │v: 0 │ │v: ???│ │next ─→│next ?│ └───┘ └───┘ p1 ptmp i == 1: linked *ptmp = p1; ptmp->value = 2 * i; ┌───┐ ┌───┐ │v: 2 │ │v: ???│ │next ─→│next ?│ └───┘ └───┘ p1、ptmp ptmp->next = new linked; ┌───┐ˊ??? │v: ???│ │next ?│ └───┘ ┌───┐ ┌───┐ │v: 2 │ │v: ???│ │next ─→│next ?│ └───┘ └───┘ p1、ptmp ptmp = ptmp->next; ┌───┐ˊ??? │v: ???│ │next ?│ └───┘ ┌───┐ ┌───┐ │v: 2 │ │v: ???│ │next ─→│next ?│ └───┘ └───┘ p1 ptmp . . . i == 9: . . . ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │v: ???│ │v: ???│ │v: ???│ │v: ???│ │v: ???│ │next ?│ │next ?│ │next ?│ │next ?│ │next ?│ └───┘ └───┘ └───┘ └───┘ └───┘ ┌───┐ ┌───┐ ┌───┐ │v: ???│ │v: ???│ │v: ???│ │next ?│ │next ?│ │next ?│ └───┘ └───┘ └───┘ ┌───┐ ┌───┐ │v: 18 │ │v: ???│ │next ─→│next ─→ NULL └───┘ └───┘ p1 ptmp version 2: size = 10; linked *p1 = new linked; linked *ptmp = p1; for (int i = 0; i < size; i++) { ptmp->value = 2 * i; if (i == size - 1) { ptmp->next = NULL; } else { ptmp->next = new linked; ptmp = ptmp->next; } } linked *p1 = new linked; ┌───┐ │v: ???│ │next ?│ └───┘ p1 linked *ptmp = p1; ┌───┐ │v: ???│ │next ?│ └───┘ p1 ptmp i == 0: ptmp->value = 2 * i; ┌───┐ │v: 0 │ │next ?│ └───┘ p1 ptmp ptmp->next = new linked; ┌───┐ ┌───┐ │v: 0 │ │v: ???│ │next ─→│next ?│ └───┘ └───┘ p1 ptmp ptmp = ptmp->next; ┌───┐ ┌───┐ │v: 0 │ │v: ???│ │next ─→│next ?│ └───┘ └───┘ p1 ptmp i == 1: ptmp->value = 2 * i; ┌───┐ ┌───┐ │v: 0 │ │v: 2 │ │next ─→│next ?│ └───┘ └───┘ p1 ptmp ptmp->next = new linked; ┌───┐ ┌───┐ ┌───┐ │v: 0 │ │v: 2 │ │v: ???│ │next ─→│next ─→│next ?│ └───┘ └───┘ └───┘ p1 ptmp ptmp = ptmp->next; ┌───┐ ┌───┐ ┌───┐ │v: 0 │ │v: 2 │ │v: ???│ │next ─→│next ─→│next ?│ └───┘ └───┘ └───┘ p1 ptmp . . . i == 5: . . . ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │v: 0 │ │v: 2 │ │v: 4 │ │v: 6 │ │v: 8 │ │v: 10 │ │v: ???│ │next ─→│next ─→│next ─→│next ─→│next ─→│next ─→ │next ?│ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ p1 ptmp 結論: 1.畫圖就懂了 2.請做好縮排 3.每次 new 完,最後程式結束前請記得 delete ---- 第一次在 BBS 畫圖... 不知道會不會很難懂... @rz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.252.90.198

08/04 18:06, , 1F
不推不行
08/04 18:06, 1F
※ 編輯: maerdimer 來自: 111.252.90.198 (08/04 18:10)

08/04 20:14, , 2F
精美
08/04 20:14, 2F

08/04 20:59, , 3F
精美貼圖風~
08/04 20:59, 3F

08/04 21:41, , 4F
感謝精美製圖
08/04 21:41, 4F
※ 編輯: maerdimer 來自: 111.252.90.198 (08/04 21:44)

08/04 22:01, , 5F
推 雖然目前沒遇過....但學了一課
08/04 22:01, 5F

08/04 22:53, , 6F
哈哈 真淺顯易懂
08/04 22:53, 6F
※ 編輯: maerdimer 來自: 111.252.90.198 (08/05 00:25)

08/05 01:57, , 7F
推精美的圖XD
08/05 01:57, 7F

08/05 12:29, , 8F
這圖一定畫了很久
08/05 12:29, 8F

08/05 21:35, , 9F
偶爾來一下這樣精美的圖還不錯^^"
08/05 21:35, 9F

08/10 10:11, , 10F
意圖使人m文
08/10 10:11, 10F
文章代碼(AID): #1G7F9IqP (C_and_CPP)
文章代碼(AID): #1G7F9IqP (C_and_CPP)