内存使用列表 - 家庭作业

时间:2012-02-03 22:16:54

标签: c list memory scheme

所以基本上我在这项任务中遇到问题5,http://www.student.cs.uwaterloo.ca/~cs136/assignments/a5/

我们基本上给出了类似于Scheme列表函数的函数。在问题5中,我应该创建一个名为iappend的函数,它附加两个列表。这是我的代码,似乎有效。

ilist iappend(ilist il1, ilist il2) {
    ilist acc = iempty();
    ilist acc1 = iempty();
    ilist a;
    while (!iempty_huh(il1)) {
        acc1 = icons(ifirst(il1), acc1);
        il1 = irest(il1);
    }
    while (!iempty_huh(il2)) {
        acc1 = icons(ifirst(il2), acc1);
        il2 = irest(il2);
    }
    a = acc1;
    while (!iempty_huh(acc1)) {
        acc = icons(ifirst(acc1), acc);
        acc1 = irest(acc1);
    }
    idelete(a);
    return acc;
}

新问题,有人可以帮助我编码,所以我不会制作临时列表吗?我需要以这样的方式对其进行编码,以至于我不会使用idelete ....任何建议都会有所帮助:)

3 个答案:

答案 0 :(得分:1)

基本上,您将通过使用辅助列表作为堆栈来模仿递归解决方案,并且您有这个想法。 但为了更有效率,试试这个。首先制作第一个列表的反向副本,只需一个简单的while-not-empty循环。然后继续使用第二个列表扩展该反向副本,再次使用简单的while-not-empty循环。现在你有一个附加在一起的两个列表的反向副本:(反向秒)||(反向第一个);用另一个非空的循环制作一个反转(即正确的顺序)副本。您应该能够在没有任何“if”测试的情况下执行此操作 - while循环应该正确处理空列表边角情况。

另外,不要删除参数 - 这就是要求麻烦。但是当然要删除前两个循环所做的反向复制并由第三个循环使用;它本质上是递归版本的堆栈。

答案 1 :(得分:1)

两个提示:(弹出,推送),一个循环

额外提示

如果iList是{item,next_iList_ptr}的结构,则可以复制您的值并指向列表上下一次迭代的下一个节点。在完成第一个之后切换到第二个。

答案 2 :(得分:0)

粗略地说:在第一个列表上搜索,制作副本,并记住副本的最后一个单元格;然后从中构建第二个列表的副本。