Pubblicato il

Come inserire un elemento in testa a una lista lineare in C

1 Cosa è una lista


Una lista è una collezione di elementi omogenei, cioè di elementi tra loro tutti uguali. A differenza dell’array, occupa in memoria una posizione qualsiasi, che tra l’altro può cambiare dinamicamente durante l’utilizzo della lista stessa.

2 Strumenti per creare una lista

Per questo tutorial andremmo a utilizzare strumenti come: malloc, puntatori e struct.

malloc è il nome di una funzione delle librerie standard del linguaggio C (ma anche del linguaggio C++) ed è l’abbreviazione di “memory allocation” (allocamento di memoria).

L’utilizzo di tale funzione avviene come di seguito:

void* malloc(size_t size);

 Tale funzione alloca in memoria un numero di bytes pari a size, restituendo un puntatore di tipo void che indica un generico indirizzo di memoria.

Le strutture, definibili con la parola chiave struct, permettono l’aggregazione di più variabili in un unico tipo.

Un puntatore è una variabile che contiene l’indirizzo di memoria di un’altra variabile.

3 Cosa contiene una lista

Una lista:

  • Può contenere uno o più campi di informazione che possono essere di ogni tipo (es. int, char, float, ecc.), e un campo “puntatore al nodo successivo (next)”;
  • Ha il primo elemento della lista che è un puntatore a nodo di tipo Nodo*, quando la lista è vuota, questo puntatore è settato a NULL.
  • Esempio di dichiarazione di una lista: Nodo *lista = NULL;
  • L’ultimo nodo della lista ha il campo “next” settato a NULL

Esempio grafico di una lista lineare

4 Struttura base di una lista lineare

Definizione della struttura Nodo:

Struct Nodo{        
int info; //variabile che contiene l’informazione, puo essere di qualsiasi tipo(int,float,double…)        
struct Nodo* next //Puntatore al prossimo elemento della lista 
}; 
typedef struct Nodo Nodo;

5 Esempio di inserimento in testa di un elemento in una lista lineare

Prototipo:

Nodo* aggiungiInTesta(Nodo* list, int val);

Esempio:

Nodo* aggiungiInTesta(Nodo* list, int val) {     
Nodo* nuovoElemento = NULL; // Puntatore       
nuovoElemento = (Nodo*) malloc(sizeof(Nodo)); // Allocazione   
if (nuovoElemento == NULL) { // Check dell’allocazione se è andata a buon fine         
printf("Errore in memoria.");        
 exit(-1);     
}     
// Assegnazione al next della nuova testa l'indirizzo della vecchia    
 nuovoElemento->next = list;     // Assegnazione all'info della nuova testa il valore passato      
 nuovoElemento->info = val;     // Restituisce l’indirizzo del primo elemento della lista   
  return nuovoElemento; 
} 
Pubblicato il

Soluzione esercizio n.67 pag. 697 (L’Amaldi per il licei scientifici.blu – Seconda edizione)

Testo

Due distribuzioni lineari di carica sono disposte parallelamente a distanza d=2.0m l’una dall’altra. Le due densità lineari di carica sono, rispettivamente, \lambda_1 = 4.0 \cdot 10^{-3} C/m e \lambda_2 = 1.0 \cdot 10^{-3} C/m

  • Calcola il modulo del campo elettrico nel punto P equidistante tra i due fili. Quali sono direzione e verso del campo elettrico?
  • In quali punti è nullo il campo elettrico totale?
Continua a leggere Soluzione esercizio n.67 pag. 697 (L’Amaldi per il licei scientifici.blu – Seconda edizione)
Pubblicato il

Come risolvere esercizio n°1 pag. 388 (Le traiettorie della fisica Azzurro, seconda edizione)

Testo

Un bottiglione di vetro da 2,0L  è pieno fino all’orlo di olio d’oliva alla temperatura di 10°C. Successivamente la temperatura aumenta fino a 30°C.

  • Quanto olio in \( cm^3  \)trabocca dalla bottiglia?
  • Calcola in percentuale la variazione della densità di olio d’oliva per la stessa variazione di temperatura.
oil dispenser bottle
Continua a leggere Come risolvere esercizio n°1 pag. 388 (Le traiettorie della fisica Azzurro, seconda edizione)