[問題] Linked-List(雙向、環狀)、malloc

看板C_and_CPP (C/C++)作者 (Dolphin)時間14年前 (2012/04/28 21:16), 編輯推噓1(1014)
留言15則, 5人參與, 最新討論串1/1
各位晚安~ 一、Linked-List問題: 此程式執行上沒問題,只是有一個地方讓我有點疑惑~ 以下僅po出struct定義、初始化函數及新增結構的函數。 typedef struct node { struct node *next; struct node *prev; int key; } NODE; NODE *listHead; void init(void) { listHead = (NODE*)malloc(sizeof(NODE)); listHead ->next= listHead; listHead ->prev= listHead; listHead ->key= -1; } void add( int key) { NODE *node = listHead->next; while( node->next != listHead ) { node = node->next; } NODE *newNode; newNode = (NODE*)malloc(sizeof(NODE)); newNode->key = key; newNode->prev = node; newNode->next = listHead; node->next = newNode; } 我有問題的點在add()裡的while loop判斷式:node->next != listHead 以我寫成環狀的鏈結串列的這題來看,串列應該像是這樣: (初始化節點的位址0x1000是假設的) http://ppt.cc/Yu10 node裡面放的是listHead所指節點裡的next所指向的位址(如圖示), 但如果只有一個初始化的節點,node會指回listHead, 此時要新增一個節點,執行到node->next != listHead為什麼不會有問題? listHead只是一個指向NODE型態的指標,並沒有next成員啊@@? 還是我哪個地方弄錯了呢? 二、malloc問題 在程式中,有一行newNode = (NODE*)malloc(sizeof(NODE)); 根據老師的說法,(NODE*)是將malloc挖好的那塊記憶體,強迫轉成NODE的指標。 我疑惑為什麼不是這樣解釋: 「(NODE*)是把malloc回傳的那一塊記憶體的位址,其型態定為NODE。」 舉個簡單的例子: int a = 5; int *p_a; p_a = &a; 傳給p_a的不就是一個int的位址嗎?因此我個人認為我的解釋比較合理~ 當然,有可能是我搞錯了XD 以上,本版首po,感謝各位:) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 120.105.217.17 ※ 編輯: dolphin7 來自: 120.105.217.17 (04/28 21:19)

04/28 21:22, , 1F
問題一:有call init()就好,你可以逐步畫圖看看
04/28 21:22, 1F

04/28 21:23, , 2F
我不太懂問題二你在問什麼 :Q
04/28 21:23, 2F
我的問題是:為什麼老師說(NODE*)的功用是將malloc挖出來的記憶體轉成指標, 而非我解釋的那樣? 謝謝:) ※ 編輯: dolphin7 來自: 120.105.217.17 (04/28 21:24)

04/28 21:25, , 3F
malloc回傳的是一個指標,型態是 void *
04/28 21:25, 3F

04/28 21:25, , 4F
它回傳並不是一塊記憶體,而是指向該記憶體的指標
04/28 21:25, 4F

04/28 21:26, , 5F
所以我覺得老師的說法也有點怪...XD
04/28 21:26, 5F
謝謝:) 我看書跟查網路,都是說malloc是回傳一個記憶體的位址, 因此才會有「(NODE*)是把malloc回傳的那一塊記憶體的位址,其型態定為NODE。」 的解釋法。 還是說其實我的解釋方式跟james大一樣,畢竟指標跟位址本來就是一體兩面?XD to shadow0326大: 我有畫圖了,但就是覺得listHead裡沒有next,那要怎麼辦?@@? ※ 編輯: dolphin7 來自: 120.105.217.17 (04/28 21:34)

04/28 21:30, , 6F
不是形態定為 NODE,是把該記憶體位址轉型成 NODE*
04/28 21:30, 6F

04/28 21:31, , 7F
你跟你的老師合體就好了
04/28 21:31, 7F
謝謝:) 所以綜合james大大所言, malloc回傳的是一個指標,型態是void *, 而(NODE*)則是把這塊新的記憶體轉型成NODE*,以供程式使用?~ ※ 編輯: dolphin7 來自: 120.105.217.17 (04/28 21:38)

04/28 21:38, , 8F
在C裡面,指標通常就代表某個記憶體位址囉
04/28 21:38, 8F

04/28 21:38, , 9F
雖然嚴格說起來上面這句話好像會有問題...XD
04/28 21:38, 9F

04/28 21:41, , 10F
其實兩個說法沒什麼差別吧y
04/28 21:41, 10F

04/28 21:44, , 11F
指標只是某塊記憶體的起始位址值
04/28 21:44, 11F

04/28 21:45, , 12F
其型態是你如何解釋它,你一次的存取單位、寬度。
04/28 21:45, 12F

04/28 21:49, , 13F
假設NODE a;NODE *listHead=&a;假設啦
04/28 21:49, 13F
謝謝:)

04/28 21:51, , 14F
你的init所做的事,不就是這樣嗎 http://ppt.cc/dtsa
04/28 21:51, 14F
感謝james732大! 是我的init在畫圖的時候就畫錯了,把init的prev跟next畫到listHead去...XD" 感謝!! ※ 編輯: dolphin7 來自: 120.105.217.17 (04/28 21:56)

04/28 21:56, , 15F
其實我一直看不懂你畫的那張圖XD
04/28 21:56, 15F
我的圖是要表示做完init之後,接著要call add()新增一個節點,那張圖是指執行完 NODE *node = listHead->next;之後,整個串列應該要長成那樣。 但我的圖整個畫錯了XD" 應該要像這樣才對http://ppt.cc/kS;u 謝謝:) ※ 編輯: dolphin7 來自: 120.105.217.17 (04/28 22:10)
文章代碼(AID): #1Fc-spic (C_and_CPP)
文章代碼(AID): #1Fc-spic (C_and_CPP)