全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2795
推到 Plurk!
推到 Facebook!

請問一下~雙向鏈結串列的問題。

答題得分者是:syntax
kawapa
一般會員


發表:3
回覆:3
積分:1
註冊:2007-04-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-08 20:48:03 IP:220.131.xxx.xxx 訂閱
<textarea class="cpp" rows="10" cols="60" name="code">struct Save_roadname //Save_roadname是一個鏈結串列結構,含有兩個欄位 { String roadname ; //存放路名 Save_roadname *pre;// 存放前一節點的位址 Save_roadname *next ; //存放下一節點的位址 }; Save_roadname *save_head, *save_tail, *find_ptr, *delete_road[ 6 ] ; typedef Save_roadname List; void ListInit() { save_head = NULL; save_tail = NULL; } List* ListAlloc() // 配置串列資料 { List* curr = NULL; if(!save_head) { curr = (List*)malloc(sizeof(List)); // 配置記憶體 save_head = curr; // LIST 開頭 save_head->pre = NULL; // 前一個 List save_head->next = NULL; // 下一個 List save_tail = save_head; // List 尾端 } else { curr = (List*)malloc(sizeof(List)); // 配置記憶體 save_tail->next = curr; // 下一個 List 加到尾端 curr->pre = save_tail; // 前一個 List curr->next = NULL; // 下一個 List save_tail = curr; // Save_roadname 尾端 } return curr; } void ListFree(List * curr) // 釋放串列資料 { if(curr == save_head) save_head = curr->next; // List 開頭, head指到下一個List else if(curr == save_tail) save_tail = curr->pre; // List 尾端, tail指到前一個List if(curr->pre == NULL && curr->next == NULL) // LIST curr 前後都沒有 LIST,LIST head、LIST tail 設成 NULL { save_head = NULL; save_tail = NULL; } else // List curr 前後的LIST重新串聯 { if(curr->pre) curr->pre->next = curr->next; if(curr->next) curr->next->pre = curr->pre; } free(curr); // 釋放記憶體 } void ListProc() // 串列處理 { List *curr, *next; curr = save_head; while(curr) { next = curr->next; // 處理LIST curr = next; } } </textarea> 上面是我想研究的雙向鏈結串列的程式… 只是我看不懂… 該怎麼新增新的節點?還有刪除舊節點?雖然有註解… 我還是看的一知半解… 麻煩各位老師指點一下
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-08 21:21:53 IP:211.22.xxx.xxx 未訂閱
你總有問題的針結點吧!?不然站裡面的前輩要如何說明呢?
kawapa
一般會員


發表:3
回覆:3
積分:1
註冊:2007-04-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-08 21:49:06 IP:220.131.xxx.xxx 訂閱
就是我該怎麼新增節點…和刪除,我想我還是多翻幾次書吧…功力太差
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-04-10 01:50:55 IP:61.64.xxx.xxx 訂閱
是的,你功力太差
不過我喜歡「多翻幾次書」這句
你就 多翻幾次書 吧
不過可以給你一點建議,就是腦筋放清楚,心情放輕鬆
事情就會變簡單
想像自己是一個呆子
然後用呆子的解決辦法,就最簡單,也最有效

雙向鏈結,不過是鏈結麼,不用想的那麼辛苦

你把它想成腳踏車練,沒看過的話去看一下,那就是雙向鍊

鏈結的基本資料結構
  1. struct Node //一個鏈結串列結構
  2. {
  3. struct Node *node_link_A;// 存放一節點的位址
  4. };
一個叫單鏈,是阿跟單戀?不也很像?你愛他,他不愛你
  1. struct Node //是一個結構,含有兩個地方可以讓你記東西
  2. {
  3. struct Node *pre;// 存放前一節點的位址
  4. struct Node *next ; //存放下一節點的位址
  5. };
兩個叫雙鏈?不見得,只是有兩個地方可以讓你記東西,如果一個記錄前一項,一個記錄後一項,才叫雙鏈,所以才會命名為 pre (前 Previous) 與 next (後 Next)

如果要加入,那就加入阿!想這個多

你想

一個排隊的隊伍,大家手牽手,如果中間要加一個人,那該怎麼辦?

簡單阿,不就叫那個人站到要加入的位置,然後

1. 遷前面的手,前面的人會記得在後面的人換了 ---> 前面的 Next 換成新的 node ,新的 node 的 pre 就記錄 前面的 node
2. 與遷後面的手,後面的人會記得在前面的人換了 ---> 後面的 Pre 換成新的 node ,新的 node 的 Next 就記錄 後面的 node

不就是這樣,會難嗎?放清你的腦袋

反過來,移除隊伍中的一個人

1.前面的人跨過後面的一個人,與後面的後面牽手 --> 前面的 Next 記錄直接填入後面的 Next
2.後面的人跨過前面的一個人,與前面的前面牽手 --> 後面的 pre 記錄直接填入前面的 pre

這樣那個中間人,就被幹掉拉,你看,要踢掉一個人是多麼簡單

再來就是要加入一個人,必需要如何?當然是生一個人出來,所以要 ---> 配置記憶體
幹掉一個人後,要如何?一定要毀屍滅跡的阿,不然會被抓的勒,所以要 -->
釋放記憶體


剩下來,就是一些細節,你自己舉一反三吧,就像如果在頭加入一個人,前面沒的遷,哪只抓自己的 XXX --> pre 設成 NULL

這樣了乎?










===================引 用 文 章===================
就是我該怎麼新增節點…和刪除,我想我還是多翻幾次書吧…功力太差
系統時間:2024-05-03 18:33:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!