esercizio di linguaggio c

1 risposta [Ultimo messaggio]
Ritratto di JALLOUL
JALLOUL
(Newbie)
Offline
Newbie
Iscritto: 14/02/2007
Messaggi: 1

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.

Ritratto di Moreno
Moreno
(Guru)
Offline
Guru
Iscritto: 24/09/2004
Messaggi: 16862

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.