DOMANDA Liste in C

al7e91

Utente Attivo
227
5
CPU
i5 3570k cooled by MACHO Hr-02 Rev. A
Scheda Madre
Asrock z77 Extreme 4
HDD
SSD Samsung 840 250GB & HDD Samsung 1TB
RAM
Corsair Vengeance CL-9 8GB (4x2)
GPU
MSI R7870 HAWK
Monitor
LG Flatron M2362D
PSU
EVGA Supernova 750W B2
Case
NZXT Phantom 410
OS
Windows 7 64bit
Ciao ragazzi. Sono qui per chiedere aiuto riguardo al codice in C per creare una lista. Incollo qui di seguito il codice da me usato:

node *buildlis()
{
int x;
node *lis, *p, *last;
printf("nuovo numero da inserire in lista:\n");
scanf("%d", &x);
if (x<=0)
lis= NULL; /* caso di lista vuota */
else
{
/* inserzione del primo elemento in una lista */
last=newnode();
lis = last;
last->data = x;
last->next = NULL;

printf("nuovo numero da inserire in lista:\n");
scanf("%d", &x);
while (x>0)
/* Invariante: lis punta alla lista con tutti gli interi finora letti, tranne l'ultimo, e last punta all'ultimo nodo di tale lista */
{
p=newnode();
p->data = x;
p->next = NULL;
last->next = p;
last = p;

printf("nuovo numero da inserire in lista:\n");
scanf("%d", &x);
}
}
return(lis);
}

Non riesco proprio a capire la "logica" del codice. In particolare non riesco a capire le parti scritte in grassetto. Abbiate pietà, sono un novizio della programmazione. Grazie per l'aiuto!
 

Blutimauge

Nuovo Utente
4
2
CPU
Inter Core 2 Duo Processor P8700 2.53 GHz
Scheda Madre
Intel PM45
HDD
500 GB
RAM
4096 MB, DDR3 PC3-8500F, 2x2048MB
GPU
Nvidia Geforce GT 240M
Audio
Realtek ALC888
Monitor
15.6 pollici 16:9, 1366x768 pixel, Retroilluminazione LED
OS
Archlinux/Xubuntu/Windows 8
Codice:
[COLOR=#000000]node *buildlis()[/COLOR]
[COLOR=#000000]{[/COLOR]
[COLOR=#000000]int x;[/COLOR]
[COLOR=#000000]node *lis, *p, *last;
[/COLOR]
[COLOR=#000000]printf("nuovo numero da inserire in lista:\n");[/COLOR]
[COLOR=#000000]scanf("%d", &x);[/COLOR]
[COLOR=#000000]
if (x<=0)[/COLOR]
[COLOR=#000000]    lis= NULL; /* caso di lista vuota */[/COLOR]
[COLOR=#000000]else[/COLOR]
[COLOR=#000000]{[/COLOR]
[COLOR=#000000]   /* inserzione del primo elemento in una lista */[/COLOR]
[B]    last=newnode();
    lis = last;
    last->data = x;
    last->next = NULL;
    
    printf("nuovo numero da inserire in lista:\n");
    scanf("%d", &x);
    
    while (x>0)
    /* Invariante: lis punta alla lista con tutti gli interi finora letti, tranne l'ultimo, e last punta             all'ultimo nodo di tale lista */
    {
[B]        p=newnode();
        p->data = x;
        p->next = NULL;
        last->next = p;
        last = p;
        
        printf("nuovo numero da inserire in lista:\n");
        scanf("%d", &x);
    }
}
return(lis);
}[/B][/B]


La prossima volta metti il codice fra i tag di CODE che è più leggibile.

La logica del codice è questa: all'inizio prendi in ingresso un numero x, se negativo la lista è vuota (quindi la lista è piena solo di numeri positivi, 0 incluso).
Se il numero è positivo, crea un nodo last e lo assegna al puntatore list, quindi riempie il dato di last con la x, ovviamente mettendo il nodo successivo a NULL.
A questo punto hai un solo nodo, con il valore X il cui nodo successivo non esiste (punta a NULL).

last : X1-> NULL

Quando entri nel ciclo while (sempre e solo se la variabile x in ingresso è positiva), viene creato un nuovo nodo p, a cui viene assegnato quel valore, e NULL come successivo.

p: X2 -> NULL

Vai quindi a prendere il riferimento al nodo successivo di last, che era null, e ci attacchi p, il nuovo nodo.

X1 -> X2 - NULL

Con l'assegnamento "last=p" semplicemente dichiari che ora l'ultimo elemento non è più quello che era puntato prima da last, ma da quello che hai creato ora con p (attenzione che gli assegnamenti tra puntatori non modificano il contenuto del puntatore stesso, ma solo a cosa puntano!).

Ora quando si parla di last, ci si riferisce a : X2 -> NULL

Si chiede quindi un nuovo valore di X, se negativo si termina, altrimenti si ripete la procedura che ho scritto sopra.

Ricorda che all'inizio era stato fatto l'assegnamento "lis=last", quindi lis puntava all'unico elemento della lista presente. Arrivato alla fine del codice, lis contiene ancora il riferimento all'inizio della lista, che viene quindi restituito.
 
  • Like
Reactions: al7e91

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando

Hot: E3 2021, chi ti è piaciuto di più?

  • Ubisoft

    Voti: 13 15.5%
  • Gearbox

    Voti: 1 1.2%
  • Xbox & Bethesda

    Voti: 59 70.2%
  • Square Enix

    Voti: 3 3.6%
  • Capcom

    Voti: 5 6.0%
  • Nintendo

    Voti: 13 15.5%
  • Altro (Specificare)

    Voti: 6 7.1%

Discussioni Simili