Re: [問題] Linked list和雙重指標

看板C_and_CPP (C/C++)作者 (熊貓)時間14年前 (2011/10/31 19:39), 編輯推噓3(306)
留言9則, 4人參與, 最新討論串2/2 (看更多)
: typedef struct listnode *listnodePtr; : typedef struct listnode : { : int num; : listnodePtr nextPtr; : }Listnode; : 第一個節點假設由 listnodePtr first指著 : 書上在討論刪除節點時用的函數叫 void delete(*listnodePtr startPtr,char value) : 事實上 不論插入或刪除 函數都會用到雙重指標 : 我不太懂為何如此 : 我寫出我的想法 請各位指出錯誤點 感謝 : 我想用單純一個的指標就好 : 如果要刪除第一個節點 : 可先在函數中宣告一個 listnodePtr temp 去記住要刪除的startPtr : 再將startPtr指向下個節點 也就是 : temp=startPtr 此時temp的內容 也就是他存的記憶體位置跟startPtr的內容一樣 : 然後 : startPtr=startPtr->nextPtr : 最後free(temp) : 如此 就不需用到雙重指標 只需要將first傳進函數中就可以了吧? : 也就是改寫成void delete(listnodePtr startPtr,char value) : 新手發言 如有可笑之處 還請大家多多包涵 感謝 == 你的想法 == first data ----- ------ | | ----> | | ----- ------ 然後呼叫 void delete(listnodePtr startPtr, ...) delete(first, ...); 事實上是... first data ----- ------ | | -----> | | ----- ------ ^ startPtr | ------- | | | ------ ------- 他只是first和startPtr指向同一個地方 然後startPtr = startPtr->nextPtr 也只是變動startPtr 你的first根本沒改到~ 這種時候你就得用雙重指標 void delete(listnode* startPtr, ...) 呼叫 delete(&first, ...); startPtr first data ----- ------ ------ | | -----> | | -----> | | ----- ------ ------ 這個時後 *startPtr 才真的是 first指標 這時後就可以 listnodePtr temp = *startPtr; *startPtr = temp->nextPtr; // 也就是 first = temp->nextPtr; free(temp); startPtr first data ----- ------ ------ | | -----> | | -----> | | ----- ------ ------ ^ temp | ------ | | | --------- ------ 圖有點醜...不過我盡力了XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.121.240 ※ 編輯: cholid 來自: 140.113.121.240 (10/31 19:40)

10/31 20:52, , 1F
推 :)
10/31 20:52, 1F

10/31 22:04, , 2F
感謝大大!!
10/31 22:04, 2F

10/31 22:06, , 3F
以前在學的時候教授都說用pointer傳入叫做傳址
10/31 22:06, 3F

10/31 22:07, , 4F
看了十三誡及這篇之後才知道其實C都是call by value
10/31 22:07, 4F

10/31 22:07, , 5F
所以一直誤會用pointer傳入函數就可以直接改寫內容
10/31 22:07, 5F

10/31 22:16, , 6F
pointer of pointer 才能改pointer...
10/31 22:16, 6F

10/31 22:25, , 7F
不用想得那麼複雜, pointer to pointer to pointer ...沒完
10/31 22:25, 7F

10/31 22:25, , 8F
沒了, 把思考侷限在 pointer to a ADT, 做適當的抽象化才是
10/31 22:25, 8F

10/31 22:25, , 9F
人類該做的事情
10/31 22:25, 9F
文章代碼(AID): #1EheZbPg (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EheZbPg (C_and_CPP)