PDA

Visualizza la versione completa : Spiegazione esercizio, non capisco questo esercizio qualcuno può spiegarlo nei dettagli? Soprattutto il malloc


Abe++
28-01-2015, 02:12
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct elem{
char cod[5];
int imp;
struct elem *next;
};


struct elem *corrente;
struct elem *primo, * nuovo;
void inser(void);
void visual(void);
void sistema(void);




main()
{
int sc;
primo = NULL;

while (sc != 3)
{
printf("1-Inserimento struct alla catena\n2-Visualizzazione catena\n3-Uscita\n");
printf("Scegli un'operazione da eseguire\n");
scanf("%d", &sc);
switch (sc)
{
case 1:
inser();
system("cls");
break;

case 2:
visual();
getch();
system("cls");
break;

case 3:
system("cls");
printf("Uscita dal programma");
break;

default:
printf("Scelta errata\n");
getch();
system("cls");
}
}
}


void inser()
{
char mycod[5] = "\0";
int myimp = 0;

nuovo = malloc(sizeof (struct elem *));
if (nuovo != NULL)
{
printf("Inserisci un codice\n");
scanf("%s", mycod);
printf("Inserisci un importo\n");
scanf("%d", &myimp);

strcpy(nuovo->cod, mycod);
nuovo->imp = myimp;
nuovo->next = NULL;
sistema();
}
else
printf("Spazio in RAM insufficiente\n");
}


void sistema()
{
if (primo == NULL)
primo = nuovo;
else
{
corrente = primo;
while (corrente->next != NULL)
corrente = corrente->next;

corrente->next = nuovo;
}
}


void visual()
{
for (corrente = primo; corrente!= NULL; corrente = corrente->next)
printf("%s\t%d\n", corrente->cod, corrente->imp);
}

minomic
28-01-2015, 11:14
CROSSPOSTING (http://www.iprogrammatori.it/forum-programmazione/cplusplus/qualcuno-puo-spiegarmi-questo-esercizio-nei-dettagli-t23210.html)...

oregon
28-01-2015, 11:55
A parte che ti è giù stato risposto altrove, dovresti scrivere quello che vuoi nel testo del thread e non nel titolo ...

In tutti i casi, non è possibile una spiegazione linea per linea in dettaglio, non siamo a scuola ... ma se vuoi leggere qualcosa della malloc, ti ho dato già un link. Dicci cosa non ti è chiaro, dopo averlo letto e ne parliamo.

MItaly
28-01-2015, 14:44
Il cross-posting su altri forum non è vietato, ma comunque non è ben visto. Ma più che altro, come ha detto oregon, non ha senso venire a chiedere spiegazioni riga per riga di centinaia di righe di codice, individua il punto che non ti è chiaro e chiedi di quello. :fagiano:

infinitejustice
31-01-2015, 19:25
Questo esercizio e' sulle linked list. Una linked list e' una lista i cui elementi si linkano fra loro. Questo ti permette di avere una struttura molto piu efficiente di un banale array, visto che gli elementi per se posson esser locali ovunque in memoria e gli inserimenti/rimozioni son relativamente semplici (si tratta di cambiar un puntatore). Puoi trovar single o double linked lists. Nel tuo caso hai una single, ovvero un elemento punta all'elemento a lui successivo, ma non al precedente (struct elem *next).

Affinche' la linked lista sia integra, devi mantenere constantemente un puntatore al suo primo elemento. Nel codice si chiama appunto primo.

Quando viene inserito un nuovo elemento viene dapprima allocata la memoria per la struttura (malloc). I suoi elementi sono inizializzati. Dopodiche' avviene la magia: i puntatori a primo e nuovo vengon mossi in modo da inserire il nuovo elemente nella posizione corretta. Nota che l'ultimo elemento della lista avra' il puntatore a next = NULL. Questo ti permette di iterare la lista senza accedere ad aree di memoria che non ti appartengono.

Come esercizio potresti trasformarla in una double linked list, aggiungendo un puntatore a prev (che nella testa della coda punta a NULL).

Loading