Я пытаюсь научить себя связным спискам, поэтому мне удалось собрать небольшой фрагмент кода, который должен создать три связанных узла, а затем распечатать их. За исключением того, что он печатает только первый элемент, и я не понимаю, почему не два других.
Кроме того, я почти уверен, что должен освобождать память, когда использую malloc? а я не знаю где?
В любом случае, что я делаю не так?? вот код...
Я знаю, что есть похожие ответы, но я проверил их и предпочел бы ответ на мою конкретную ситуацию, потому что иначе я бы его не получил...
#include<stdio.h>
#include <stdlib.h>
struct Node
{
int data;
struct Node *next;
};
void printList(struct Node *ptr);
int main(void)
{
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;
head = (struct Node*)malloc(sizeof(struct Node));
second = (struct Node*)malloc(sizeof(struct Node));
third = (struct Node*)malloc(sizeof(struct Node));
head->data = 10;
head->next = second;
second->data = 20;
head->next = third;
third->data = 30;
head->next = NULL;
printList(head);
}
void printList(struct Node *ptr)
{
struct Node *listPtr;
listPtr = ptr;
int count = 1;
if (listPtr == NULL)
{
printf("No elements in list.\n");
return;
}
while (listPtr!=NULL)
{
printf("element %d = %d\n",count,listPtr->data);
listPtr = listPtr->next;
count++;
}
}
Я просмотрел похожие примеры кода, и они (по крайней мере, пара из них) похожи на мои, поэтому я действительно не знаю, что я делаю неправильно...
ОТ: (struct Node*)malloc
-> malloc
, приведения бесполезны, в них нет цели.
напишите это вместо того, что вы сделали:
second->data = 20; //same
second->next = third;
third->data = 30; //same
third->next = NULL;
какие части моего кода я должен заменить этим? все в основном? достаточно глуп, чтобы попробовать это. Не сработало хаха
printList()
в порядке. Проблема в том, как вы инициализируете элементы в main()
. @ShlomiAgiv дал вам один ответ, а вот другой:
int main(void) {
struct Node nodes[] = {
{ 10, nodes + 1 },
{ 20, nodes + 2 },
{ 30, NULL }
};
printList(nodes);
}
который возвращает:
element 1 = 10
element 2 = 20
element 3 = 30
Вот appendList()
, который динамически выделяет каждый узел. Он возвращает первый созданный узел (который является корнем для
list, если это новый список), и обновляет указатель *tail
, чтобы он стал последним узлом:
struct Node *appendList(struct Node **tail, size_t len, int data[len]) {
struct Node *root = NULL;
for(size_t i = 0; i < len; i++) {
struct Node *n = malloc(sizeof *n);
if (!root)
root = n;
if (!n) {
// freeList(root);
return NULL;
}
n->data = data[i];
if (*tail) {
(*tail)->next = n;
}
*tail = n;
}
(*tail)->next = NULL;
return root;
}
int main(void) {
struct Node *tail = NULL;
struct Node *root = appendList(&tail, 3, (int []) {10, 20, 30});
appendList(&tail, 1, (int []) { 40 });
printList(root);
// freeList(root);
}
и он напечатает:
element 1 = 10
element 2 = 20
element 3 = 30
element 4 = 40
что делает «root = \»?
Это продолжение строки. Это просто способ написать root = tail = ...
, но позволяет всем tail =
выстроиться в линию, чтобы сообщить, что вызовы appendList() похожи.
@AllanWeind в main(), где вы объясняете функцию AppendList. По какой-то причине, если я это закомментирую, следующая строка станет ошибочной. Также закрывающая скобка main() красная, а инициализация nodes[] есть...
Я заменил обе версии на ту, которая удобна для вызывающего абонента, например createList()
, и может создавать список постепенно, как оригинал appendList()
.
Отвечает ли это на ваш вопрос? как напечатать все узлы в связанном списке в ( C )