Проблема здесь в том, что create()
выделяет новые узлы, но теряет указатели на них, это прекрасный пример утечки памяти.
Это происходит потому, что когда вы передаете указатель в функцию, вы передаете его значение, а локальный параметр - это просто что-то в стеке, у которого есть это значение - локальный параметр не совпадает с указателем, который вы передали в функцию, оно имеет только то же значение.
Таким образом, когда вы выделяете новый узел, вы указываете локальный указатель на новый узел, а не указатель, который вы передали функции, и когда функция выходит, этот локальный указатель больше не существует, и вы теряете ссылку на расположенную память - происходит утечка памяти.
Так как же изменить указатель, который вы передали в функцию изнутри функции? Это просто - просто передайте в функцию адрес указателя.
Когда вы хотите изменить какую-либо переменную, вы указываете указатель на ее адрес, а затем разыменовываете указатель. Здесь вы будете делать то же самое - взять адрес указателя и разыменовать двойной указатель, который указывает на него.
Нужны только небольшие изменения, такие как:
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *right;
}list;
void create(list **start){
int data;
printf("Input value : ");
scanf("%d",&data);
if(data==0){
start=NULL;
return;
}
else{
*start=(list*)malloc(sizeof(list));
(*start)->data=data;
create(&(*start)->right);
}
}
void display(list *start){
printf("%d",start->data);
if(start->right==NULL)return;
display(start->right);
}
int main(void){
list *LIST=NULL;
create(&LIST);
display(LIST);
return 0;
}