Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tnode* node_create(Tinfo x)
{
Tnode *nuovo;
nuovo = (Tnode*)malloc(sizeof(Tnode));
if(nuovo == NULL)
return NULL;
nuovo -> info = x;
nuovo -> link = NULL;
return nuovo;
}
recursive
void list_print_Recursive(Tlist list)
{
if(list != NULL) {
print_info(list -> info);
list_print_recursive(list -> link); }
}
Tlist list_insert_Recursive(Tlist list, Tinfo x)
{
if (list == NULL || greater(list -> info, x))
{
Tnode *nuovo;
nuovo = node_create(x);
assert(nuovo != NULL);
nuovo -> link = list;
return nuovo;
} else {
Tlist L2 = list_insert_Recursive(list -> link, x);
list -> link = L2;
return list;
}
}
Tnode *node_create(Tinfo x)
{ Tnode *node;
node = (Tnode*)malloc(sizeof(Tnode));
assert(node != NULL);
node -> info = x;
node -> left = NULL;
node -> right = NULL;
return node; }
indirizzamento aperto
THashTable *hashtable_create (int buckets)
{ int i;
THashTable *ht = (THashTable *)malloc(sizeof(THashTable));
assert(ht != NULL);
assert(buckets > 0);
ht -> bucket_number = buckets;
ht -> bucket = (TBucket *)malloc(sizeof(Tbucket)*buckets);
assert(ht -> bucket != NULL);
for(i = 0; i < buckets; i++) typedef int TKey;
ht -> bucket[i].used = false; typedef int TValue;
ht -> used_buckets = 0;
return ht; } struct SInfo{ TKey key;
TValue value; };
typedef struct SInfo TInfo;
BUBBLESORT
void bubblesort(int vett[], int dim)
{ int flag = 1; //variabile che indica se è stato effettuato un cambio di valori, è inzializzata a 1 per permettere di entrare nel ciclo
int i, k, temp;
for(i = 0; i < dim && flag == 1; i++)
{ flag = 0; //è 0 se non vengono effettuati scambi. L'algoritmo quindi termina.
for(k = 0; k < dim-i-1; k++) //per la parte dl vettore non ancora ordinata.
if(vett[k] > vett[k+1]) //se l'elemento precedente è maggiore viene scambiato.
{ temp = vett[k];
vett[k] = vett[k+1];
vett[k+1] = temp;
flag = 1; //effettuato lo scambio, il flag vale 1, e il ciclo si ripete }
} }
MERGESORT
void mergesort(int vett[], int dim, int temp[]) //l'ordinamento non avviene sul posto, ma su un vettore esterno che viene passato
{ int i, pivot = dim/2; //variabile che indica la divisione del vettore in 2 parti: 1. da 0 a PIVOT, 2. da PIVOT+1 a DIM
if(dim < 2)
return;
mergesort(vett, pivot, temp); //RICORSIONE della funzione MERGESORT sulla prima parte del vettore
mergesort(vett+pivot, dim-pivot, temp); //RICORSIONE della funzione MERGESORT sulla seconda parte del vettore
. merge(vett, dim, vett+pivot, dim-pivot, temp); //FUSIONE della 2 parti: confrontando i valori si effettua l'ordinamento
for(i = 0; i < dim; i++) //si ricopia TEMP nel vettore originario, in modo da lavorare sulla stessa area di memoria
vett[i] = temp[i]; }
void merge(int vett1[], int dim1, int vett2[], int dim2, int temp[])
{ int pos1 = 0, pos2 = 0, k = 0;
while(pos1 < dim1 && pos2 < dim2)
{ if(vett2[pos2] < vett1[pos1]) //se l'elemento del secondo vettore è minore viene aggiunto al vettore TEMP e si incrementano K e POS2
temp[k++] = vett2[pos2++];
else //se l'elemento del primo vettore è minore viene aggiunto al vettore TEMP e si incrementano K e POS1
temp[k++] = vett1[pos1++]; }
while(pos1 < dim1) //se il secondo vettore è finito e il primo no, gli elementi del primo vettore vengono messi in coda al vettore TEMP.
temp[k++] = vett1[pos1++];
while(pos2 < dim2) //se il primo vettore è finito e il secondo no, gli elementi del secondo vettore vengono messi in coda al vettore TEMP.
temp[k++] = vett2[pos2++]; }
QUICKSORT
void quicksort(int vett[], int dim)
{ int k;
if(dim < 2) //se la dimensione della riga è minore di 2
return;
k = partition(vett, dim);
quicksort(vett, k);
quicksort(vett+k+1, dim-k-1); }