如何在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 // 遍历结束,停机
代码说明
- 节点结构:每个节点连续占用两个内存单元,第一个存数据,第二个存下一个节点的地址,符合静态链表的存储规则。
- 遍历流程:
- 加载当前节点地址,用临时变量PTR保存。
- 通过
LoadI间接寻址读取节点的数据并输出。 - 计算链接字段的地址(节点地址+1),读取下一个节点地址并更新HEAD。
- 判断下一个地址是否为0(空指针),若是则终止循环,否则继续遍历。
内容的提问来源于stack exchange,提问作者Drunk Monkey
相关产品推荐
相关产品推荐

