Во-первых, предупреждение (которое следует рассматривать как ошибку, к вашему сведению), которое вы видите, не связано с вашей общей проблемой, но, тем не менее, важно.Это и неподходящее, и утечки памяти, и имеет смутный вид тестирующих спагетти.В случае, если вы никогда этого не делали, кухонная техника старой школы, чтобы увидеть, «готово» ли макароны, - это взять веточку из кастрюли и буквально бросить ее в стену, чтобы увидеть, прилипает ли она.Эта, казалось бы, посторонняя строка кода выглядит именно так;как будто вы бросили что-то в стену, чтобы увидеть, застряло ли оно:
Это:
tmp_node->data = malloc(sizeof(struct Node)); // DELETE THIS
даже не должно быть в вашем коде вообще ;последующая строка делает то, что должно быть сделано, а именно:
tmp_node->data = number_x; // KEEP THIS
Создание связного списка
Хотя предыдущий диатрибу касается, это не 't то, что обеспечивает вашу незавидную позицию неправильного составления списка.Это проблема сама по себе.Рассмотрим следующее:
struct Node *head; // indeterminate
struct Node *second; // indeterminate
struct Node *third; // indeterminate
В первых двух вызовах newNode
вы передаете неопределенные значения указателя тому, что в конечном итоге будет вновь выделенным указателем next
узла.Это важно.Изменив порядок сборки, вы можете получить поведение, которое вам нужно.
third = newNode(number_3, NULL); // third is set, next points to NULL
second = newNode(number_2, third); // second it set, next points to third
head = newNode(number_1, second); // head is set, next points to second
Очевидно, что делать это не идеально, но просто узнать, как все устроено, это один из способов сделать это.Другим было бы назначить следующих членов напрямую.Например:
head = newNode(number_1, NULL);
head->next = newNode(number_2, NULL);
head->next->next = newNode(number_3, NULL);
Это также работает, но, опять же, не идеально.Вы действительно хотите сделать это для построения связного списка из ста узлов?
Формирование цепочки связанного списка вперед
Там это оченькраткий способ построить восходящий связанный список без необходимости делать выше.Он называется forward-chaining и использует указатель на указатель, который изначально указывает на сам указатель головы (который изначально равен NULL):
struct Node *head = NULL;
struct Node **pp = &head; // points to a pointer, initially the head pointer
С учетом вышеизложенного мыможете связать воедино список из любого количества элементов, которые вы хотите.Сотня ?нет проблем:
for (int i=1; i<=100; ++i)
{
// allocate a new node, storing the address at whatever pointer
// is being addressed by the pointer-to-pointer pp. Initially it
// will be the `head` pointer variable.
*pp = malloc(sizeof **pp);
(*pp)->data = i;
// move pp to point to the next pointer of the node we just added
pp = &(*pp)->next;
}
*pp = NULL; // terminate the list
printNodes(head);
Это всего лишь один из способов создания связанных списков.Есть много других (например, делать это рекурсивно, нередко при изучении рекурсии в школе).Но это, наверное, самый простой, почти наверняка самый быстрый.
Во всяком случае, это было дольше, чем я хотел, но я надеюсь, что это помогло.