从链接列表中删除字段(MatLab)

时间:2016-08-01 13:33:11

标签: matlab list data-structures structure

我有一个单向链接列表:

s=struct('field1', value1, 'field2', value2, 'field3', value3, 'next',[])
s=struct('field1', value3, 'field2', value5, 'field3', value6, 'next', s)

如何删除'next'字段,以便我的链表成为标准结构数组,如此?

s(1)=struct('field1', value1, 'field2', value2, 'field3', value3)
s(2)=struct('field1', value3, 'field2', value5, 'field3', value6)

我已经尝试过rmfield命令,但是我得到了一个1x1结构数组,但在这个例子中,我想要一个1x2结构数组。

1 个答案:

答案 0 :(得分:1)

您需要先将所有结构聚合在一起。您可以使用递归函数来执行此操作。然后你可以在结构数组上调用rmfield。你甚至可以同时将两者结合起来。

function S = flattenList(S)
    if isempty(S.next)
        S = rmfield(S, 'next');
    else
        S = cat(2, rmfield(S, 'next'), flattenList(S.next));
    end
end

正如评论中所指出的,由于我们不断将数据附加到输出,因此对于较大的列表来说可能会很慢。我们可以确定预期的输出大小,然后在循环中填充它。

这种方法可以让你预先分配输出。

function output = flattenList(S)

    % Determine how big to make the output
    tmp = S;
    count = 1;
    while ~isempty(tmp.next)
        count = count + 1;
        tmp = tmp.next;
    end     

    % Pre-allocate the output
    output = repmat(rmfield(S(1), 'next'), [1 count]);

    tmp = S;
    count = 1;
    while true
        output(count) = rmfield(tmp, 'next');
        if isempty(tmp.next)
            break;
        else
            tmp = S.next;
        end
    end
end