给出示例是双向链表的代码的一部分。 假设我有给定typedef的以下两个结构。
typedef struct dplist dplist_t;
typedef struct dplist_node dplist_node_t;
struct dplist_node {
dplist_node_t * prev, * next;
element_t element;
};
struct dplist {
dplist_node_t * head;
};
我的主要功能中有以下代码:
void main()
{
dplist_t * list;
dplist_node_t *node_one, *node_two;
//the arrow equivalent of the assignment
list->head = node_one;
list->head->next = node_two;
}
我知道node_one赋值的'point'等价于:
(*list).head = node_one;
但是当我试图找到与node_two赋值相当的'point'时,以下所有变化似乎都是错误的:
(*list).(*head).next = node_two;
(*list).*head.next = node_two;
(*list).head.next = node_two;
有谁知道写这个陈述的正确方法?
答案 0 :(得分:1)
list->head->next = node_two;
可以写成
(*(list->head)).next = node_two;
可以重写为
(*((*list).head)).next = node_two;
答案 1 :(得分:1)
应为“(*(* list).head).next = node_two;”。
。我假设你故意错过了为你的列表/节点(list = malloc(...))分配内存的行,以保持问题的简短。
。使用 ”。”表示编译器将数据成员作为与已知位置/偏移的偏移量和“ - >”到达表示在运行时(指针)需要取消引用。所以逻辑必须
a)“列表”(*列表)的解除引用地址,
b)计算成员“head”(* list).head,
的偏移量c)头部的解除引用地址*((* list).head),
d)计算成员“next”的偏移量*((* list).head).next。