Quote:
Originariamente inviato da Kenger
Ad ogni inserimento basterebbe confrontare il valore all'interno del nuovo nodo e il valore all'interno dell'ultimo nodo della lista o sbaglio?
Certo, senza un puntatore alla coda della lista te la devi scorrere tutta lo stesso, ma con il puntatore sarebbe un bel miglioramento ^^
|
Effettivamente, mantenendo un puntatore all'ultimo nodo, la procedura per l'inserimento è più efficiente:
Codice:
#include <stdio.h>
#include <malloc.h>
typedef struct nd
{
int val;
struct nd *next;
struct nd *max;
}TLISTA;
typedef struct tagLista
{
TLISTA *first;
TLISTA *last;
} Lista;
TLISTA* NewNode(int val)
{
TLISTA *n;
n = (TLISTA*)malloc(sizeof(TLISTA));
if( !n )
{
printf("Memoria insufficiente.\n");
return NULL;
}
n->val = val;
n->next = NULL;
n->max = NULL;
return n;
}
void insertlista(Lista *lista, int val)
{
TLISTA *nuovo;
if ( lista->first == NULL )
{
nuovo = NewNode(val);
nuovo->max = nuovo;
lista->first = lista->last = nuovo;
return;
}
nuovo = NewNode(val);
if ( val > lista->last->val )
nuovo->max = nuovo;
else
nuovo->max = lista->last->max;
lista->last->next = nuovo;
lista->last = nuovo;
}
void freelista(Lista* lista)
{
TLISTA *n1 = lista->first, *n2;
while ( n1 != NULL )
{
n2 = n1->next;
free(n1);
n1 = n2;
}
}
void printlista(Lista *lista)
{
TLISTA *n = lista->first;
while( n != NULL )
{
printf("val -> %d, max -> %d\n", n->val, n->max->val);
n = n->next;
}
}
int main()
{
Lista lint;
int vettInt[10] = {5,8,3,2,1,21,55,89,144,13};
int k;
for (k = 0; k < 10; k++)
{
insertlista(&lint, vettInt[k]);
}
printf("\n");
printlista(&lint);
printf("\n");
freelista(&lint);
return 0;
}