Newsgroup: it.comp.lang.c
Titolo: Inserire elemento in una lista ordinata.

Sto cercando di fare una funzione
struct lista
  {
    int dato;
    struct lista *next;
  };
e dati degli elementi in modo ordinato, chieda in input un elemento, e
lo metta nella lista in modo che essa sia ancora ordinata.
Es se la lista ha gli elementi 1-4-7-13-15 e do in input il valore 8,
la nuova lista sarà 1-4-7-8-13-15.
Qualcuno mi può dare qualche "Dritta"?

 Qualcuno mi può dare qualche "Dritta"?
Fallo in maniera iterativa.

il problema è che dovrei capire come si fa...

 il problema è che dovrei capire come si fa...
Ah, tu avevi chiesto qualche "dritta".
Credo che la lista ordinata sia un esempio onnipresente nei corsi di 
programmazione, chiaramente non c'è mai un solo modo di risolvere un 
problema, ecco come farei io:
scorro la lista (che è ordinata) partendo dal primo elemento e 
confrontando il valore da inserire con quello dell'elemento in lista. 
Se l'elemento in lista è minore di quello da inserire passo al 
successivo altrimenti (cioé l'elemento in lista è maggiore o uguale) 
sono arrivato al punto dell'inserimento.
A questo punto alloco un nuovo elemento di tipo struct list e collego 
bene i due elementi adiacenti preoccupandomi di modificare i relativi 
campi di collegamento a elemento successivo.
Lo scorrimento della lista lo puoi fare con un ciclo, ricordati di 
tenere conto della situazione in cui la lista finisce (quindi appenderai 
l'elemento in coda) o che sia vuota del tutto.

Nicoula ha scritto:

E' abbastanza semplice, quindi ti posso postare un esempio. Visto che 
siete in diversi ad avere questo esercizio (cosi' mi e' sembrato di 
capire), dubito che poi lo ricopierete pari pari :) Spero, quindi, che 
serva effettivamente SOLO come "dritta".
PS: per semplificare la lettura, nel main(), io ho usato il 'goto' per 
l'uscita su errore. E' *un caso* esemplare in cui - in 'C' - e' almeno 
consentito/tollerato... ma, di solito, NON dai docenti (ne capisco il 
perche' anche se non condivido): voi non usatelo negli esercizi.
Ciao
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <stdio.h>
#include <stdlib.h>
#define CREA_LISTA_INIZIALE
typedef struct tagMYLIST
{	struct tagMYLIST *pNext;
	int nDato;
} MYLIST, *PMYLIST;
void stampaLista(PMYLIST *ppRoot)
{	
	if(ppRoot)
	{	int i;
		PMYLIST pList;
		printf("La lista contiene:\n");
		for(i = 0, pList = *ppRoot; pList; pList = pList->pNext, i++)
			printf("%2d) %d\n", i+1, pList->nDato);
	}
}
int inserisciInOrdineCrescente(PMYLIST *ppRoot, int nDato)
{	
	PMYLIST pListNew = NULL;
	int	bRes = 0;
	if(ppRoot && (pListNew = calloc(1, sizeof(*pListNew))))
	{	PMYLIST pList, pListPrev;
		pListNew->pNext = NULL;
		pListNew->nDato = nDato;
		for(pListPrev = NULL, pList = *ppRoot; pList; pListPrev = pList, pList 
= pList->pNext)
			if(pList->nDato >= nDato)
				break;
		pListNew->pNext = pList;
		if(pListPrev)
			pListPrev->pNext = pListNew;
		else	*ppRoot = pListNew;
		bRes = 1;
	}
	return bRes;
}
void disallocaLista(PMYLIST *ppRoot)
{
	if(ppRoot)
	{	PMYLIST pList, pL;
		for(pList = *ppRoot; pList; )
		{	pL = pList;
			pList = pList->pNext;
			free(pL);
		}
		*ppRoot = NULL;
	}
}
int promptIntNum(int *pnRetNum, char *pPrompt)
{
	int  bRes = 0;
	if(pnRetNum)
	{	char bf[256];
		*pnRetNum = 0;
		/* gestione semplificata di controllo d'input */
		for(;;)
		{	int n = 0;
			if(pPrompt && *pPrompt)
			{	printf("%s", pPrompt); fflush(stdout);
			}
			/* EOF, 'q' o 'Q' (o un errore) terminano l'input */
			if(!fgets(bf, sizeof(bf), stdin))
				break;
			if(bf[0] == 'q' || bf[0] == 'Q')
				break;
			if(1 == sscanf(bf, "%d", &n))
			{	*pnRetNum = n;
				bRes = 1;
				break;
			}
			else	printf(">> Numero non valido, riprova...\n");
		}
	}
	return bRes;
}
int main(void)
{	
	PMYLIST pMyListRoot = NULL;
	int nRetVal = EXIT_FAILURE;
	int nNum;
#ifdef CREA_LISTA_INIZIALE /* ...se serve */
	int nInd;
	enum { SENTINEL = -1 };
	int anNumInizialiInLista[] = {1, 4, 7, 13, 15, /* fine lista: */ SENTINEL};
	for(nInd = 0; anNumInizialiInLista[nInd] != SENTINEL; nInd++)
	{	if(!inserisciInOrdineCrescente(&pMyListRoot, anNumInizialiInLista[nInd]))
		{	fprintf(stderr, "* Errore in inserimento...\n");
			goto uscita; /* non usate il goto ;) */
		}
	}
	stampaLista(&pMyListRoot);
#endif /* CREA_LISTA_INIZIALE */
	while(promptIntNum(&nNum, "Inserisci un numero (Q per terminare): "))
	{	if(!inserisciInOrdineCrescente(&pMyListRoot, nNum))
		{	fprintf(stderr, "* Errore in inserimento...\n");
			goto uscita; /* non usate il goto ;) */
		}
		stampaLista(&pMyListRoot);	
	}
	nRetVal = EXIT_SUCCESS;
uscita:
	disallocaLista(&pMyListRoot);
	return nRetVal;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

     stampaLista(&pMyListRoot);
...ma cosi':
	stampaLista(pMyListRoot);
(senza &) nelle 2 occorrenze in main().
Ciao
