Объявление, изменение и добавление в массив списка структур в C

#c #list #struct #linked-list #malloc

#c #Список #структура #связанный список #malloc

Вопрос:

Я создал структуру, и в этой структуре есть метрика. Я генерирую серию этих структур и хочу отсортировать их в массив на основе этого показателя. В принципе, если метрика равна 0, я хочу, чтобы она была в списке в слоте [0] массива, если метрика равна 14, я хочу, чтобы она была в списке в слоте [14] массива. Привязка к метрике (размеру массива) является переменной, основанной на той же переменной, на основе которой генерируются структуры, поэтому мне нужно, чтобы массив объявлялся динамически с помощью malloc. Я экспериментировал с тем, как получить этот массив списков моей структуры. Я не могу в этом разобраться. Я погуглил проблему и не смог найти решение.

Кроме того, как только у меня будет массив, как мне добавить другой элемент в список конкретной ячейки массива? А затем вернитесь назад и сравните все элементы списка в i-й ячейке с элементами (n-i)-й ячейки?

Редактировать: Также может помочь то, что не все показатели будут иметь элементы.

Правка 2: Я пробовал это, и, похоже, возникли некоторые проблемы.

 list<s_pair> *pairs;
pairs = (list<s_pair>*) malloc(sizeof(list<s_pair>) * (N   1));

j = { a, b };
pairs[m].push_back(j);
  

где m — метрика для j, имеющая тип s_pair. Это позволяет мне компилировать, но оно застревает при попытке push_back(j).

Комментарии:

1. Существует ли когда-либо только одна структура с каждой метрикой и является ли ваш дистрибутив плотным (иначе говоря, имеет мало отверстий или вообще не имеет)? Пожалуйста, имейте в виду, что declaring это не имеет того значения, которое вы используете, вы хотите defining или allocating . Это особенно важно для C и Си , где все они являются отдельными и четко определенными понятиями. ( defining подразумевает declaring , но не наоборот)

2. Нет. Каждая метрика потенциально может не содержать структур или иметь набор структур. И я должен был бы сказать, что четверть показателей может не содержать никаких структур, но у остальных должна быть хотя бы одна. Также, отмечено. Что делает объявление, чего не делает определение?

3. Похоже, вы описываете хэш-таблицу с открытой цепочкой. (ваша метрика — это хэш-функция)

4. Взгляните на стандарт C, который определяет эти понятия. В свободном доступе есть черновики. В любом случае, вам нужна одна для всех ваших справочных потребностей.

5. В C это почти наверняка ошибка с malloc вашей list стороны, поскольку это резервирует пространство, но не создает никаких объектов. Я бы рекомендовал выбрать язык, поскольку ответ на каждом из них совершенно разный.

Ответ №1:

В C вы могли бы сделать:

 #include <vector>
#include <list>

size_t metric(s_pair const amp;);   

class MyTable
{
   std::vector< std::list<s_pair> > table;

public:
    void insert(s_pair s) 
    {
         size_t index = metric(s);
         if ( index   1 > table.size() )
              table.resize(index   1);
         table[index].push_back(s);
    }
};
  

(очевидно, у вас были бы другие функции для доступа к таблице и так далее).

В этой настройке это не будет работать очень хорошо, если metric может быть огромное число (скажем, 2 миллиарда). В этом случае вам нужен разреженный массив вместо вектора (в C нет стандартного разреженного массива, но вы можете найти его или создать).

Пример использования:

 int main()
{
    MyTable items; 
    items.insert( whatever );
}
  

В этом примере показатели без элемента представлены пустыми списками.

Комментарии:

1. Если вы раньше не часто использовали C , вы должны убедиться, что s_pair имеет надлежащую семантику значений (чтобы при копировании или перемещении они оставались действительными объектами). Самый простой способ сделать это — сделать так, чтобы в нем были только переменные-члены, которые сами имеют надлежащую семантику значений.