【发布时间】:2019-12-17 17:07:09
【问题描述】:
试题图片:
所以问题要我们存储下一个节点和前一个节点的内存位置之间的差异。
struct sub_node{
float data;
int sub_value; //memory address of next node - previous node
};
这是我为每个节点制作的结构。这适用于除最终节点和起始节点之外的所有节点。我可以通过简单地计算下一个节点地址
struct node * next = node_current->sub_value + node_prev; //node_prev is
//memory address of the previous node(pointer)
在尝试向后遍历时也是如此。
&NEXT_NODE - 0 将其存储为整数值时给我一个错误。 (参见图片进行描述)同样,0 - &SECOND_LAST_NODE 也给了我这个错误。我想知道解决这个问题的最佳方法是什么。 (不强制转换的指针的整数)
【问题讨论】:
-
“给我一个错误” - 哪个错误,究竟是什么?
-
@ForceBru "警告:从 'struct sub_node *' 分配给 'int' 使得指针从没有强制转换的整数 [-Wint-conversion]" 和 "无效的操作数到二进制 - (有 'int'和 'struct sub_node *') d->sub_value = 0 - c;"当试图使 d 的减法值为 0-c 时
-
请注意,当从数组中分配元素时,这种链接列表效果最好,这在 Fortran 中经常发生。然后,增量可以是记录计数而不是原始指针值,并且增量大小可以限制为底层数组的大小。
-
这种数据结构在标准 C 中是不可能的,因为它未定义对指向不同对象的指针执行算术运算。这只有在所有节点都从单个数组中分配时才有效(这对于链表来说是非典型的)。
-
@GemTaylor 我明白了。鉴于 LinkedList 已经充满了节点并且考试是在纸上进行的(这是我正在尝试练习的去年的考试),这个问题只是想让我们实施方法。我只是想在机器上实现它,以及应该将增量存储在哪种原始类型中。如果它是增量,即。一个地址 - 另一个地址可以正常工作。当它是原始指针值(即第一个和最后一个元素)时就会出现问题