ciao a tutti
grazie per poter aiutarmi a svolgere questo esercizio
esercisio:
Modificare il programma che mette nell'ordine una successione dei numeri di interi per poter mettere nell'ordine che ascende una “ linked list„ dove i dati di ogni nodo sia un intero. (Per generare e maneggiare la lista possiamo modificare e il utilizzare i function nel questo programma
/* questo file contiene alcune funzioni C per la gestione e manipolazione
di linked list. L' implementazione delle function di manipolazione qui
presentata e' solo una tra molte alternative. Viene fornita solo come
esempio, senza pretesa di costituire la migliore soluzione.
Non tutte le function sono effettivamente usate nel programma di prova. */
#define MAXLN 40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct nodo
{
char nome[MAXLN];
struct nodo *successivo;
} nodo;
nodo *crea_nodo( void )
/* alloca memoria per un nuovo elemento ritornando un puntatore a questo
spazio */
/* N.B. la creazione di un nuovo elemento NON lo inserisce nella lista:
* nessun elemento punta ancora al nuovo e questo non punta a nessuno
* p->successivo punta a NULL */
{
nodo *nuovo_nodo;
nuovo_nodo = malloc(sizeof(nodo) );
if ( nuovo_nodo == NULL )
{
printf( "crea_nodo: malloc failed \n");
exit(1);
}
nuovo_nodo->successivo = NULL;
return nuovo_nodo;
}
void aggiungi_nodo( nodo *nuovo_nodo , nodo **inizio)
/* questa function aggiunge un elemento del tipo nodo in fondo alla lista
* di primo elemento "inizio" */
{
nodo *nodo_corrente;
if ( *inizio == NULL)
{
*inizio = nuovo_nodo;
return;
}
for( nodo_corrente = *inizio ; nodo_corrente->successivo != NULL ;
nodo_corrente = nodo_corrente->successivo)
; // con questo for arriviamo all' ultimo nodo
nodo_corrente->successivo = nuovo_nodo;
return;
}
void inserisci_dopo(nodo *q, nodo *p)
/* inserisce il nodo p dopo il nodo q */
{
if ( p == NULL || q == NULL || p==q || q->successivo == p )
{
printf("inserisci_dopo : inserzione non valida\n");
return;
}
p->successivo = q->successivo;
q->successivo = p;
return;
}
void elimina(nodo *eliminando, nodo **inizio)
{
nodo *p;
if (eliminando == *inizio)
{
if((*inizio)->successivo != NULL)
*inizio = eliminando->successivo;
else
*inizio=NULL;
}
else
{
for(p=*inizio; (p!= NULL) && (p->successivo !=eliminando);p = p->successivo)
if ( p == NULL)
{
printf("elimina: Errrore: non c'e' l' elemento cercato nella lista \n");
return;
}
p->successivo = p->successivo->successivo;
}
free(eliminando);
eliminando=NULL;
}
void scrivi_lista(nodo *inizio)
{
nodo *p;
int count=0;
if(inizio == NULL) printf("lista vuota\n");
else {
p=inizio;
do{count++;
printf("%s\n",p->nome);
p= p->successivo;
}
while(p != NULL);
}
printf("%d elementi\n",count);
return;
}
nodo *trova_nome( char *nome , nodo *inizio)
{
nodo *p;
p=inizio;
do{
if(strcmp(nome,p->nome)==0) return p;
}while((p=p->successivo) != NULL);
return NULL;
}
int main(void)
{
char ans, buffer[80];
nodo *inizio=NULL; /* "inizio" e' il puntatore all' inizio della
lista inizializzato a NULL */
nodo *p;
int non_trovato;
p=inizio;
while(1)
{
printf(" new element ? (y/n) ");
fgets(buffer,80,stdin);
buffer[strlen(buffer)-1]='\0';
sscanf(buffer,"%c",&ans);
if(ans == 'n') break;
p=crea_nodo();
fgets(buffer,80,stdin);
buffer[strlen(buffer)-1]='\0';
sscanf(buffer,"%40s",p->nome);
aggiungi_nodo(p,&inizio);
}
do{
scrivi_lista(inizio);
printf(" quale vuoi eliminare ? ");
scanf("%79s",buffer);
if((p=trova_nome(buffer,inizio)) != NULL)
{
printf("Trovato ! : %s \n",p->nome);
non_trovato=0;
elimina(p,&inizio);
scrivi_lista(inizio);
}
else
{
printf("Elemento non trovato. Riprova\n");
non_trovato=1;
}
} while(non_trovato);
return 0;
}
grazie 1000.
Ciao
Non puoi chiederci di svolgere i compiti per te comunque vedo di darti una mano.
1) Dai un occhiata a questo interessante documento
http://www.die.supsi.ch/~bianchil/algoritmi_numerica/slides_leo/ordinamento.pdf
2) Una traccia di come risolvere il problema con un sort modello base che più base non si può.
Crei una lista vuota
Per ogni elemento della lista dati introdotta
Se lista vuota aggiungi elemento
Scandisci lista sortata
Se nella lista sortata trovi un elemento con valore superiore a quello da inserire lo aggiungi prima
Se raggiungi la fine della lista lo aggiungi dopo
devi scriverti la funzione aggiungi_prima o memorizzarti in un buffer i puntatori p e q della lettura precedente.
Di più non posso dire.
Ciao Ciao Moreno
Addio, e grazie per tutto il pesce.
Avatar by moonlight-dream.