[爆卦]鏈結串列例子是什麼?優點缺點精華區懶人包

為什麼這篇鏈結串列例子鄉民發文收入到精華區:因為在鏈結串列例子這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者dolphin7 (Dolphin)看板C_and_CPP標題[問題] Linked-List(...


各位晚安~

一、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)
shadow0326:問題一:有call init()就好,你可以逐步畫圖看看 04/28 21:22
shadow0326:我不太懂問題二你在問什麼 :Q 04/28 21:23

我的問題是:為什麼老師說(NODE*)的功用是將malloc挖出來的記憶體轉成指標,
而非我解釋的那樣?
謝謝:)
※ 編輯: dolphin7 來自: 120.105.217.17 (04/28 21:24)
james732:malloc回傳的是一個指標,型態是 void * 04/28 21:25
james732:它回傳並不是一塊記憶體,而是指向該記憶體的指標 04/28 21:25
james732:所以我覺得老師的說法也有點怪...XD 04/28 21:26

謝謝:)
我看書跟查網路,都是說malloc是回傳一個記憶體的位址,
因此才會有「(NODE*)是把malloc回傳的那一塊記憶體的位址,其型態定為NODE。」
的解釋法。

還是說其實我的解釋方式跟james大一樣,畢竟指標跟位址本來就是一體兩面?XD

to shadow0326大:
我有畫圖了,但就是覺得listHead裡沒有next,那要怎麼辦?@@?

※ 編輯: dolphin7 來自: 120.105.217.17 (04/28 21:34)
purpose:不是形態定為 NODE,是把該記憶體位址轉型成 NODE* 04/28 21:30
purpose:你跟你的老師合體就好了 04/28 21:31

謝謝:)
所以綜合james大大所言,
malloc回傳的是一個指標,型態是void *,
而(NODE*)則是把這塊新的記憶體轉型成NODE*,以供程式使用?~
※ 編輯: dolphin7 來自: 120.105.217.17 (04/28 21:38)
james732:在C裡面,指標通常就代表某個記憶體位址囉 04/28 21:38
james732:雖然嚴格說起來上面這句話好像會有問題...XD 04/28 21:38
firose:其實兩個說法沒什麼差別吧y 04/28 21:41
firose:指標只是某塊記憶體的起始位址值 04/28 21:44
firose:其型態是你如何解釋它,你一次的存取單位、寬度。 04/28 21:45
leiyan:假設NODE a;NODE *listHead=&a;假設啦 04/28 21:49

謝謝:)

james732:你的init所做的事,不就是這樣嗎 http://ppt.cc/dtsa 04/28 21:51

感謝james732大!
是我的init在畫圖的時候就畫錯了,把init的prev跟next畫到listHead去...XD"
感謝!!
※ 編輯: dolphin7 來自: 120.105.217.17 (04/28 21:56)
james732:其實我一直看不懂你畫的那張圖XD 04/28 21:56

我的圖是要表示做完init之後,接著要call add()新增一個節點,那張圖是指執行完
NODE *node = listHead->next;之後,整個串列應該要長成那樣。
但我的圖整個畫錯了XD"

應該要像這樣才對http://ppt.cc/kS;u
謝謝:)

※ 編輯: dolphin7 來自: 120.105.217.17 (04/28 22:10)

你可能也想看看

搜尋相關網站