You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Marie汇编器中实现静态链表遍历并输出指定节点值?

Marie汇编静态链表遍历问题修正

原代码的核心问题

  • 节点结构错误:静态链表的每个节点应包含「数据值 + 下一个节点地址」,原代码将数据和链接分开存储,不符合链表结构规范。
  • 指针初始化错误:HEAD应指向第一个节点的起始地址,而非错误的102。
  • 遍历逻辑错误:直接Load HEAD后输出的是节点地址而非数据,且未正确读取节点的链接字段来更新指针。
  • 终止条件逻辑混乱:未正确处理链表末尾的空指针(0)判断。

修正后的代码

ORG 100  
HEAD, DEC 101       // 头指针指向第一个节点的起始地址(101)
// 节点结构:每个节点占2个内存单元,[数据, 下一个节点地址]
NODE1, DEC 9        // 节点1的数据值
       DEC 103      // 节点1的链接:指向节点2的起始地址(103)
NODE2, DEC 4        // 节点2的数据值
       DEC 105      // 节点2的链接:指向节点3的起始地址(105)
NODE3, DEC 14       // 节点3的数据值
       DEC 0        // 节点3的链接:指向空(0,代表链表结束)
PTR, DEC 0          // 临时变量,存储当前节点的地址

// 链表遍历循环
LOOP, Load HEAD     // 将当前节点地址加载到AC
      Store PTR     // 保存当前节点地址到PTR
      LoadI PTR     // 间接寻址,读取当前节点的数据值到AC
      Output        // 输出数据
      Load PTR      // 重新加载当前节点地址
      Add 1         // 计算链接字段的地址(节点地址+1)
      LoadI AC      // 读取链接字段的值(下一个节点地址)
      Store HEAD    // 更新头指针为下一个节点地址
      SKIPCOND 400  // 如果AC=0(到达链表末尾),跳过JUMP指令
      JUMP LOOP     // 否则继续循环
      Halt          // 遍历结束,停机

代码说明

  1. 节点结构:每个节点连续占用两个内存单元,第一个存数据,第二个存下一个节点的地址,符合静态链表的存储规则。
  2. 遍历流程:
    • 加载当前节点地址,用临时变量PTR保存。
    • 通过LoadI间接寻址读取节点的数据并输出。
    • 计算链接字段的地址(节点地址+1),读取下一个节点地址并更新HEAD。
    • 判断下一个地址是否为0(空指针),若是则终止循环,否则继续遍历。

内容的提问来源于stack exchange,提问作者Drunk Monkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:22:42