JumpNode递归和非递归访问

JumpNode的定义结构为如下所示:struct JumpNode {int data; //存储数据int order; // 记录访问次序,初始化均为0JumpNode *jump, *next; // next为线性下一节点,jump为跳跃到下一节点};

现在需要以递归和非递归的方式来访问到一个JumpNode *list。在访问的时候给各个节点的order属性记录上访问的次序。

递归访问 void recursive_traversal(JumpNode *node, int &order) {node) return;node;recursive_traversal(node->jump, order);recursive_traversal(node->next, order);}非递归访问 void iterative_traversal(JumpNode *node, int &order) {JumpNode *curr = node;stack<JumpNode *> s;while (!s.empty() || (curr && curr->order==-1)) {if (curr && curr->order == -1) {curr->order = order++;s.push(curr);curr = curr->jump;} else {curr = s.top();s.pop();curr = curr->next;}}}测试部分 测试时使用如下函数对链表进行打印: void print(JumpNode *node) {while (node) printf(“(%d,%d) “, node->data, node->order), node = node->next;printf(“\n”);}

链表结构为:

JumpNode *n1 = new JumpNode(1);JumpNode *n2 = new JumpNode(2);JumpNode *n3 = new JumpNode(3);JumpNode *n4 = new JumpNode(4);n1->jump = n3; n2->jump = n4; n3->jump = n2; n4->jump = n4;n1->next = n2; n2->next = n3; n3->next = n4;

最后打印结果均为:

[root@localhost cpp]# ./jumpnode (1,1) (2,3) (3,2) (4,4) 关于非递归访问

可见,针对递归访问改造的话,,将recursive_traversal内部的条件(node != NULL && node->order == -1) 设置为iterative_traversal 进行左支(if分支)访问的条件。 并且在左支(if分支)内可以执行前序遍历的特定语句; 至于中序访问特定语句则放置于非递归版本的else分支中即可。

于千万年之中,于千万人之中,在时间无涯的荒野中,

JumpNode递归和非递归访问

相关文章:

你感兴趣的文章:

标签云: