结构可以修改吗?

时间:2014-08-29 03:31:07

标签: c linked-list

我有两个单独的链接列表,它们在某个时刻连接在一起,我必须找到那一点。我在想是否可以添加一个名为visited(flag)的新数据类型,以便我可以创建第一个节点链接列表被访问,然后找到从第二个链接列表遍历的交叉点。我可以这样做吗?我可以在定义后修改结构吗?如果是,怎么做?提前感谢。

4 个答案:

答案 0 :(得分:4)

不,您无法在运行时添加或删除结构中的成员。

答案 1 :(得分:3)

考虑两个示例列表AB。你不知道它们相交的地方,但是你已经遍历了两者,你知道它们的长度:

A : A1 > A2 > A3 > A4 > NULL            <-- length 4
B : B1 > B2 > B3 > B4 > B5 > B6 > NULL  <-- length 6

如果有一个交叉点,Ai的某个内存地址将等于Bj1 <= i <= 4的{​​{1}}的内存地址。< / p>

为什么呢?

如果3 <= j <= 6的地址等于A1B1的地址(如果这些节点中的任何一个是交叉点),那么链接列表B2会真的是两个节点或一个节点更长。但我们知道这不是真的,因为我们遍历了A,我们已经知道它有多长。

所以你可以做的是找到长度的差异,并在两个列表的较长时间内走这个差异 - 交叉点节点(如果存在)将位于较长列表的尾部。然后开始遍历两个列表,测试指针相等性:

A

答案 2 :(得分:0)

在定义结构后,您无法修改结构。为什么你只想使用数据类型,为什么不使用任何其他方法?

但是,您可以做的是将链接列表1中每个节点的地址保存在一个数组中,然后使用它找到交叉点。这很接近你想要的。

同样,有许多更好的算法可以找到不需要额外数据类型的交叉点。

答案 3 :(得分:0)

如果在源中定义了结构,则只需添加其他成员即可。如果你必须使用已在某个库中(或由教师)定义的结构,那么不,你不能在事后添加成员,但是下一个最好的事情是维护一个映射地址的哈希表将实例转换为有关该结构的其他信息。在这种情况下,由于您需要的唯一信息是实例是否已被看到,只需将第一个列表的节点地址输入哈希表,然后扫描第二个列表以查看其任何节点是否在哈希表中。

另请参阅Alex Reynolds的答案,避免需要任何其他信息。