我有一个单向链接列表:
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结构数组。
答案 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