Traccia : Leggere n e costruire una lista di n numeri casuali compresi da 1 e 9.Stampare la lista.Costruire una seconda lista in cui ogni elemento x della prima lista sia ripetuto x volte,stampare la seconda lista.
Esempio.
Sia n = 5 e supponiamo che la prima lista sia la seguente:
4--->2--->1--->5--->NULL
Viene generata la seguente lista:
4--->4--->4--->4--->2--->2--->1--->5--->5--->5--->5--->5--->NULL
Importante:Organizzare il programma in funzioni(una per generare la prima lista,una per costruire la seconda lista,una per stampare.)Non utilizzare arrey o lista ausiliari,non introdurre variabili goblali.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct nodo *crealista();
struct nodo2 *crealista2();
void printlista(struct nodo *p);
void printlista2(struct nodo2 *p);
struct nodo {
int dato;
struct nodo *next;
};
struct nodo2 {
int dato;
struct nodo2 *next;
};
main()
{
struct nodo *start;
struct nodo2 *start2;
start = crealista();
printlista(start);
start2 = crealista2();
printlista2(start2);
system("pause");
return 0;
}
struct nodo *crealista()
{
struct nodo *p,*start,*last;
int n,i,x;
srand(time(NULL));
start = NULL;
printf("Quanti nodi ha la lista?");
scanf("%d",&n);
for(i=0;i<n;i++){
x = rand() % 9+1;
p = (struct nodo *)malloc(sizeof(struct nodo));
if (i==0)
start = p;
else
last->next = p;
p->dato = x;
p->next = NULL;
last = p;
}
return (start);
}
struct nodo2 *crealista2()
{
struct nodo2 *p2,*start2,*last2;
struct nodo *p;
int i,x2;
start2 = NULL;
while(p!==NULL){
x2=p->dato;
for(i=0;i<x2;i++){
p2=(struct nodo2*)malloc(sizeof(struct nodo2));
if(i==0)
start=p2;
else
last2->next=p2;
p2->dato = x2;
p2->next = NULL;
last2 = p2;
}
p = p->next;
}
return(start2);
}
void printlista(struct nodo *p)
{
while(p != NULL){
printf("%d ---> ",p->dato);
p = p->next;
}
printf("NULL");
return;
}

Io ho provato a farlo cosi ma quando crea la seconda lista mi si chiude il programma,sapete come risolverlo?