Конечно, вы можете создать связанный список или любую другую структуру данных без динамического выделения памяти.Вы не можете, как бы вы ни старались, создать его без выделения памяти.
Альтернатива:
Создать глобальный или статический пул памяти, куда вы можете поместить свои объекты,имитируя кучу / malloc / free.FreeRTOS делает что-то вроде.В этой ситуации у вас будет большой фрагмент памяти, выделенный статически, так как начало вашей программы и будет отвечать за управление им, возвращая правильные указатели, когда нужен новый узел, и помечая эту память как использованную.
PS: Я не буду спрашивать, почему вы хотите избежать malloc.Я полагаю, у вас есть веская причина для этого.
В вашей программе, когда вы это делаете, в строке 20:
node newtemp,root,temp;
Вы выделяете узлы, один из них, "newtemp",Затем вы делаете в строке 28:
newtemp=getnode(i);
Это просто копирует содержимое возвращенного узла поверх вашего старого "нового узла" (противоречие, не так ли)
Так и сделайте, просто ниже:
temp.next=&newtemp;
Устанавливает указатель, который изначально идет от "root.next" на ваш "newnode".
if(root.next==NULL)
Будет "NULL"при первом прохождении, но затем заменить только одно и то же содержимое.
temp=*(temp.next);
{
root=temp;
}
Снова, копирование данных из одного выделенного объекта, "* (temp.next)",другой, "темп".Он не создает никакого нового узла.
Он будет работать, если вы сделаете так:
#include <stdio.h>
typedef struct node
{
int i;
struct node *next;
}
node;
#define MAX_NODES 10
node *create_node( int a )
{
// Memory space to put your nodes. Note that is is just a MAX_NODES * sizeof( node ) memory array.
static node node_pool[ MAX_NODES ];
static int next_node = 0;
printf( "[node *create_node( int a )]\r\tnext_node = %d; i = %d\n", next_node, a );
if ( next_node >= MAX_NODES )
{
printf( "Out of memory!\n" );
return ( node * )NULL;
}
node *n = &( node_pool[ next_node++ ] );
n->i = a;
n->next = NULL;
return n;
}
int main( )
{
int i;
node *newtemp, *root, *temp;
root = create_node( 0 );
temp = root;
for ( i = 1; ( newtemp = create_node( i ) ) && i < MAX_NODES; ++i )
{
temp->next = newtemp;
if ( newtemp )
{
printf( "temp->i = %d\n", temp->i );
printf( "temp->next->i = %d\n", temp->next->i );
temp = temp->next;
}
}
for ( temp = root; temp != NULL; temp = temp->next )
printf( " %d ", temp->i );
return 0;
}
Вывод:
$ gcc -Wall -o list_no_malloc list_no_malloc.c
$ ./list_no_malloc
[node next_node = 0; i = 0)]
[node next_node = 1; i = 1)]
temp->i = 0
temp->next->i = 1
[node next_node = 2; i = 2)]
temp->i = 1
temp->next->i = 2
[node next_node = 3; i = 3)]
temp->i = 2
temp->next->i = 3
[node next_node = 4; i = 4)]
temp->i = 3
temp->next->i = 4
[node next_node = 5; i = 5)]
temp->i = 4
temp->next->i = 5
[node next_node = 6; i = 6)]
temp->i = 5
temp->next->i = 6
[node next_node = 7; i = 7)]
temp->i = 6
temp->next->i = 7
[node next_node = 8; i = 8)]
temp->i = 7
temp->next->i = 8
[node next_node = 9; i = 9)]
temp->i = 8
temp->next->i = 9
[node next_node = 10; i = 10
Out of memory!
0 1 2 3 4 5 6 7 8 9