我有兩個單獨的鏈接列表,它們在某處連接在一起,我必須找到那個點。我想如果我可以添加一個名爲visited(flag)的新數據類型,以便可以使第一個鏈接的所有節點列表爲已訪問,然後找到從第二個鏈接列表遍歷的交點。我可以這樣做嗎?可以在定義它之後修改結構嗎?如果是,如何?提前致謝。可以修改一個結構嗎?
回答
不,您不能在運行時從結構中添加或刪除成員。
考慮兩個樣本列表A
和B
。你不知道他們在哪裏相交,但是你走過這兩個,你知道它們的長度:
A : A1 > A2 > A3 > A4 > NULL <-- length 4
B : B1 > B2 > B3 > B4 > B5 > B6 > NULL <-- length 6
如果有一個交叉點,的Ai
一些內存地址是要等於Bj
的內存地址1 <= i <= 4
和3 <= j <= 6
。
爲什麼?
如果A1
地址等於B1
或B2
的地址(如果任一這些節點的是交叉點),則鏈接列表A
真的會兩個節點或一個節點更長。但我們知道這不是事實,因爲我們遍歷了A
,我們已經知道它有多長。
因此,您可以做的是找到長度差異,並在兩個列表中較長的時間內遍歷差異 - 交叉點節點(如果存在)將位於較長列表的尾部。然後開始遍歷這兩個列表,當你去時測試指針是否相等:
# we know B is longer, but you would test this
# condition and set up different code to handle
# the two cases
unsigned int A_len = 4;
unsigned int B_len = 6;
unsigned int AB_diff = B_len - A_len;
struct foo *A_head = ...; # user-defined
struct foo *B_head = ...; # user-defined
struct foo *A_iter = NULL;
struct foo *B_iter = NULL;
# - start the A-iterator at the first node of A
# - start the B-iterator at the diff-th node of B
#
# - now test for pointer equality until we find a
# match, or we hit the end of either list
for (A_iter = A_head, B_iter = B_head + AB_diff;
(A_iter != B_iter) || (A_iter->nextNode != NULL);
++A_iter, ++B_iter) { }
# wherever A_iter and B_iter are now pointing will be
# either NULL (if they don't intersect) or some non-NULL
# value representing the intersection node
嗯,我不認爲他要求**如何找到交點...... **。 – 2014-08-29 04:21:34
我知道還有其他方法具有更容易和更簡單的邏輯。我沒有要求邏輯,我只是好奇,如果一個結構可以被修改的全部。現在我知道它不能。謝謝反正。 – avinash 2014-08-29 14:43:05
否你不能在定義它之後修改結構。爲什麼你只想使用數據類型,爲什麼不使用其他方法?
但是,您可以將鏈接列表1的每個節點的地址保存在數組中,然後使用它查找交叉點。這接近你想要的。
再次有很多更好的algorthims來找到不需要額外數據類型的交點。
如果結構在您的源代碼中定義,您可以簡單地添加一個額外的成員。如果你必須使用已經在某個庫中定義的結構(或者由你的教師)來工作,那麼不行,在事實之後你不能添加成員,但是下一個最好的做法是維護一個散列表來映射結構實例的地址到有關該結構的其他信息。在這種情況下,由於您需要的唯一信息是實例是否已被查看,只需將第一個列表的節點地址輸入散列表中,然後掃描第二個列表以查看其任何節點是否在散列表中。
另請參閱Alex Reynolds的回答,以避免需要任何其他信息。
- 1. Perl的「存在」可以修改數據結構值嗎?
- 2. 可以修改jQuery庫嗎?
- 3. 可以修改rt.jar嗎?
- 4. 可以修改TWTweetComposeViewController嗎?
- 5. 張量流程可以修改每個訓練步驟的圖形結構嗎?
- 6. 修改一個結構向量
- 7. 修改一個結構數組的值
- 8. 結構 - 表達式必須是一個可修改的值
- 9. 修改與結構
- 10. 修改URL結構
- 11. 我可以使用CSS來改變這個HTML結構嗎?
- 12. perl,使用File :: Find可以修改該函數之外的數據結構嗎?
- 13. 修改父級行爲的訪問者層次結構。 Liskov可以嗎?
- 14. 我可以修改另一個進程的UID嗎?
- 15. 我可以修改一個const成員變量嗎?
- 16. 我可以修改另一個片段嗎?
- 17. 我可以在C#中修改一個Word '97文檔嗎?
- 18. 在結構本身之前可以定義一個結構成員(函數)嗎?
- 19. 一個迅速計算的屬性getter可以改變結構嗎?
- 20. 您可以使用Ant來構建/修改XML文件嗎?
- 21. 您可以使用指向包含結構的指針來修改嵌套結構的值嗎?
- 22. 可以修改哪些foreach體系結構?
- 23. 是否可以修改Access加密後端的結構?
- 24. 我可以創建一個可以修改用戶界面的線程嗎?我可以放棄嗎?
- 25. 我可以在C中擴展一個結構嗎?
- 26. 我可以定義一個鍵是結構的地圖嗎?
- 27. 我可以使用WM_COPYDATA複製一個非結構體嗎?
- 28. 我們可以在類型上定義一個結構嗎?
- 29. 我可以使用TypeInfo_Struct創建一個結構嗎?
- 30. 你可以在ASP.NET中有一個插件體系結構嗎?
你能張貼一些代碼來說明你在想什麼嗎? – 2014-08-29 03:34:19
還有其他方法可以找出2個鏈接列表的交點。不要增加你的代碼複雜度。據我所知,你一旦定義就不能修改結構。 – 2014-08-29 03:34:36