2016-08-01 2 views
0

У меня есть один путь, связанный список, состоящий из:Удаление поля из связанного списка (MatLab)

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

Как удалить «рядом» поле так, что мой связанный список становится стандартный массив структуры, например, так ?

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

Я попытался rmfield команды, но я получаю массив структуры 1x1, но я хочу, в этом примере, массив структуры 1х2.

ответ

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 
+0

Примечание. Это может быть очень медленным для большого списка. Лучше иметь предварительно выделенное пространство и заполнять рекурсивно. – Floris

+0

не было бы более полезно сообщить, что это не действительно связанный список, и что правильный способ его создания - через подкласс дескриптора? –

+0

@TasosPapastylianou Это не вопрос. Теоретически пользователь хочет сгладить связанный список, который они уже создали. – Suever

Смежные вопросы