我有以下规则Yacc
,我想从中创建一个链表,但是当我尝试打印它时,我一直在获取列表中的最后一个节点:
node_list
: {$$=NULL;}
| node_list node {if ($1 != NULL) $1->next=$2; $$=$2; }
;
我的理解是,例如,如果这是列表
node1
node2
node3
Yacc
将其扩展为
node_list node3
node_list node2 node3
ndoe_list node1 node2 node3
NULL node1 node2 node3
但由于我得到了上面代码的最后一个节点,所以我的猜测是列表以崇高的顺序展开
node_list node1
node_list node2 node1
ndoe_list node3 node2 node1
NULL node3 node2 node1
那么我尝试使用以下代码:
node_list
: {$$=NULL;}
| node_list node {$2->next=$1; $$=$2 ; }
;
我知道在每种情况下我都会返回列表中的最后一个节点,这就是为什么我只得到一个节点。所以我尝试了这段代码:
node_list
: {$$=NULL;}
| node_list node {$$=linkXmlNode($1,$2);}
;
linkXmlNode
在哪里
XmlNode * linkXmlNode(XmlNode * first, XmlNode * second)
{
XmlNode * temp = second;
while (second->next != NULL)
second=second->next;
second->next=first;
return temp;
}
现在我让最后一个节点每次重复 3 次。我也尝试了另一个方向,但现在我得到了第一个节点:
XmlNode * linkXmlNode(XmlNode * first, XmlNode * second)
{
if (first == NULL) return second;
XmlNode * temp = first;
while (first->next != NULL)
first= first->next;
first->next = second;
return temp
}
如果有人知道如何Yacc
扩展列表,那就太好了。
编辑:回答 我的打印功能有误,上述功能有效。错误是我没有打印迭代器,而是打印参数,因此多次获得同一个节点。