Discussione: [C] liste
View Single Post
Old 28-12-2008, 16:11   #4
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da Kenger Guarda i messaggi
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;
}
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso