Сохранение массива структур в связанном списке

#c #arrays #struct

#c #массивы #структура

Вопрос:

У меня есть массив struts, называемый arrayOfElements , каждый элемент является структурой, называемой Element

 typedef struct {
    void* data;
    } Element;
  

данные являются указателем void, поскольку я не знаю в advanced, какой тип переменной будет сохранен

Я настроил этот массив так, чтобы в нем было 4 элемента (это делается с помощью пользовательского ввода, но я жестко запрограммировал 4 для этого вопроса)

 Element* arrayOfElements;
arrayOfElements= malloc(4 * sizeof(Element));
  

Теперь к этому моменту я могу хранить строки и целые числа в arrayOfElements

Сохранить Int

 arrayOfElements[0].data = malloc( sizeof(int) );
int *ptr = arrayOfElements[0].data;
*ptr = 65;
  

Сохранить строку

 arrayOfElements[0].data = malloc( strlen(str)   1 );
strcpy( arrayOfElements[0].data, str );
  

И это все работает. Моя проблема в том, как мне создать связанный список и заставить каждый элемент хранить экземпляр arrayOfElements

пока мой связанный список

 typedef struct LinkedListNode {
    void** ElementArray;
    struct LinkedListNode* next;
} LinkedListNode;

typedef struct {
    LinkedListNode* head;
} LinkedList;
  

таким образом, void** ElementArray будет указывать на каждый arrayOfElements

 void insert(LinkedList* head, Element inArrayOfElements)
{ 
    LinkedListNode insertNode;

    /* Points ElementArray to inArrayOfElements */
    HOW DO I DO THIS AS ElementArray is a void**

    /* Points next to the head */
    (*insertNode).next = head;

    /* Re-points head to new head of Linked List */
    head = insertNode;
}
  

Моя цель — создать что-то вроде этого

 LINKEDLIST
     ---      --- --- ---- 
    |   | -> |   |   |    |  arrayofElements
     ---      --- --- ----      --- --- ---- 
    |   | -------------------> |   |   |    |
     ---      --- --- ----      --- --- ---- 
    |   | -> |   |   |    |
     ---      --- --- ----      --- --- ---- 
    |   | -------------------> |   |   |    |
     ---                        --- --- ---- 
  

Вопрос / TL;DR
Мой вопрос в том, как мне заставить void ** ElementArray (в связанном списке) указывать на arrayOfElements.

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

1. Также я должен использовать связанный список, иначе я бы просто создал массив указателей Большое спасибо

2. вам действительно нужен void ** указатель? и как вы будете различать различные вставленные типы, когда все void * ?

3. Если C не является жестким требованием, я думаю, что использование C для таких целей дало бы результаты быстрее. Принимая во внимание предстоящие часы, которые вы потратите на устранение утечек памяти и сбоев при доступе к неправильным типам.

4. У меня есть способ отслеживать, к каким типам относится все, поскольку тип переменной, которая будет сохранена элементом struct, неизвестен, но останется постоянным (я читаю из файла), поэтому, когда я открываю файл, у меня есть функция, чтобы увидеть, какой это тип переменной

5. @ BitTickler Я должен использовать C

Ответ №1:

Если я правильно понимаю ваш вопрос, двойные указатели не нужны. Просто сделайте:

 typedef struct LinkedListNode {
    Element* data;
    struct LinkedListNode* next;
} LinkedListNode;


LinkedListNode* insert(LinkedListNode* head, Element* inArrayOfElements)
{ 
    LinkedListNode* insertNode = malloc(sizeof(LinkedListNode));

    insertNode->next = head;
    insertNode->data = inArrayOfElements;
    return insertNode;
}
  

Используйте его как:

 head = insert(head, someArrayOfElements);
  

Примечание: реальный код должен проверять наличие нулевых указателей, но я опустил это для простоты.

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

1. Спасибо, я подумал, что мне нужен двойной указатель, поскольку, когда я malloc’d массив элементов, на него указывал указатель элемента с именем arrayOfElements (4-я строка)