我有两个单独的链接列表,它们在某处连接在一起,我必须找到那个点。我想如果我可以添加一个名为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