Re: [問題] 鍊結串列在記憶體配置時,如何分散配置?
※ 引述《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
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
08/10 10:11, 10F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):