#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-я строка)