2015-02-24 2 views
1

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

Код:

Node* lists = (Node*) malloc(100 * sizeof(lists)); 

printf("\n Enter the number of lists:"); 
scanf("%d", &nbrOfLists); 

if(nbrOfLists < 0) 
    return -1; 
if(nbrOfLists>100) 
    lists = realloc(lists, 100 * sizeof(lists)); 


lists[listNo] = NULL; // getting error here incompatible types assigning Node from type 'void*' 
lists[listNo]= insertValue(lists[listNo], val); 

Я имею в виду каждый элемент массива имеет первый элемент индивидуального связанного списка. Следующий элемент - это другой независимый первый узел другого связанного списка.

+2

Вы хотите массив узлов или массив указателей узлов? –

+0

Предлагаю дополнительно прочитать о указателях и массивах. – rullof

+0

массив указателей узлов. Каждый элемент массива представляет собой узел, указывающий на следующий узел в списке –

ответ

1

Для связанного списка вам не нужно выделять память для всех элементов. У вас должен быть один корневой элемент Node * root и связать все остальное с ним. Нет необходимости от malloc и realloc - вот идея «связанного списка». В вашем примере у вас есть динамический массив объектов.

+0

Я имею в виду, что каждый элемент массива имеет первый элемент отдельного связанного списка. –

0
  1. Вы должны изучить концепции указателей. Кодовые сигналы вы не очень хорошо понимаете. Просто дружеская долгосрочная нота.
  2. lists имеет тип pointer to Node, который является «адресом», в 32-битной ОС - 4 байта, в 64 бит - 8 байт. Но никакого отношения к фактическому размеру Node.
  3. Когда вы делаете `malloc (N * sizeof (lists)), вы на самом деле выделяете N элементов, каждый из которых является адресом (4 или 8 байт, опять же никакого отношения к фактически сохраненной информации).
  4. Когда вы ссылаетесь на lists[X], вы на самом деле говорите: «Возьмите этот адрес Node, а затем возьмите X-й Node под ним». Вы имеете в виду Node, а не «адрес Node», поэтому ваш компилятор говорит «Я не могу назначить Node с NULL».

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

Сказать «пожалуйста, выделить N элементов типа Node» вы должны написать что-то вроде:

Node *lists = realloc(lists, N * sizeof(*lists)); 

А вы бы лучше сказать Node *list чем Node* list (практически это приводит тот же код, но, пожалуйста, проверьте, что является разница - это основной принцип, и вы должны сами его изучить).

+0

Большое спасибо, сэр. Тем не менее, я могу добиться того, что хочу, используя списки Node * [100]; но не вышеупомянутый метод. В любом случае, я снова пересмотрю свои концепции. –

+0

@AbhishekSingh, вы понимаете, что если вы объявляете что-то вроде 'Node * lists [100]', у вас на самом деле есть только 100 указателей на узел? Это ваша настоящая цель? Насколько я понимаю, вам нужен указатель на структуры 100 'Node'. Правильно? –

0

Если вам нужен массив указателей на узлы, вам нужен указатель на первый указатель на узел массива указателей на узлы. Это будет двойной указатель для массива с переменным размером: node ** arrayofpoitnerstonode; , тогда arrayofpoitnerstonode [0] будет первым указателем на узел, arrayofpoitnerstonode [1] будет вторым указателем на узел, ....