В push_node
вы создаете новый узел в стеке, после того как push_node
возвращает, что память больше не читается без вызова неопределенного поведения (включая бесконечные циклы).Вы можете использовать malloc
внутри push_node
, но, вероятно, не стоит, если вы не создадите огромный список.Вам также нужно будет отслеживать память и free
правильно позже.Если вы не создаете массивный список, вы можете просто создать вместо него узлы в main
, с минимальными изменениями в вашем коде:
#include<stdio.h>
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
void print_list(Node* head) {
Node* cursor = head;
while(cursor != NULL) {
printf("data: %d\n", cursor->data);
cursor = cursor->next;
}
}
void push_node(Node* head, Node* new) {
Node* cursor = head;
while(cursor->next != NULL) {
cursor = cursor->next;
}
cursor->next = new;
new->prev = cursor;
}
int main() {
Node root = {0,NULL,NULL};
push_node(&root, &(Node){ 1, NULL, NULL });
push_node(&root, &(Node){ 2, NULL, NULL });
print_list(&root);
return 0;
}
Если ваш список массивный, то вы все равно должны использовать malloc, ноВы не захотите вызывать его каждый раз, когда создаете новый узел, вместо этого вы можете выделить достаточно большой объем памяти для хранения большого списка за один вызов malloc, а затем перераспределить его в два раза больше, если ваш список увеличиваетсядо точки, где вам нужно больше памяти для этого.