PDA

View Full Version : Implementare una lista circolare.LINK CORRETTO


cisoman
22-12-2003, 01:08
http://www-dft.ts.infn.it/%7Epastore/DIDA/info/appunti/linklist.c



dovrei risolvere queto problema:
devo modificare le funzioni di una lista concatenata in modo che la lista diventi circolare(in particolare che il successivo dell' ultimo elemento e' il primo). In particolare devo scrivere una function che scriva il contenuto della lista a partire da un elemento arbitrario.scrivetimi anche mail se volete vedere anche la lista da modificare
La lista da modificare si trova in questo sito...
Avrei bisogno che qualcuno modificasse la lista e mi spigasse brevemente cosa è stato fatto

fabiannit
20-01-2004, 22:12
EDITET. ERRORE:eek: :D

cionci
21-01-2004, 03:50
#define MAXLN 40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct listanomi{
char nome[MAXLN];
struct listanomi *successivo;
};

typedef struct listanomi Listanomi; /* definisce Listanomi come nuovo nome
* del tipo dati struct listanomi */


Listanomi *inizio=NULL; /* "inizio" e' il puntatore all' inizio della
lista inizializzato a NULL */



Listanomi *crea_elemento( 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 */
{
Listanomi *p;

p = malloc(sizeof(Listanomi) );
if ( p == NULL )
{
printf( "crea_elemento: malloc failed \n");
exit(1);
}
p->successivo = NULL;
return p;
}



void aggiungi_elemento( Listanomi *e )
/* questa function aggiunge un elemento del tipo Listanomi alla lista
* di primo elemento "inizio" */
{
Listanomi *p;
if ( inizio == NULL)
{
inizio = e;
/*inizio->successivo = inizio;*/
return;
}

for( p = inizio; p->successivo != NULL; p = p->successivo)
;
p->successivo = e;
/*e->successivo = inizio;*/
return;

}



void inserisci_dopo(Listanomi *q, Listanomi *p)
/* inserisce l' elemento p dopo q nella lista */
{
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(Listanomi *eliminando)
{
Listanomi *p;

if (eliminando == inizio)
{
/*
for(p = inizio; p->successivo != inizio; p = p->successivo)
;
*/
inizio = eliminando->successivo;
/*p->successivo = inizio;*/
}
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);
}



void scrivi_lista(Listanomi *elemento)
{
Listanomi *p;
int count=0;

/*for(p=inizio; (p!= NULL) && (p->successivo != elemento);p = p->successivo)
;
if(p == NULL)
{
printf("Elemtno non trovato \n");
return;
}*/

if(inizio == NULL) printf("lista vuota\n");
else {
p = inizio; /*questa riga va tolta*/
do{count++;
printf("%s\n",p->nome);
p= p->successivo;
}
while(p != NULL); /*va sostituito con while(p != elemento);*/
}
printf("%d elementi\n",count);

return;
}



Listanomi *trova_nome char *nome )
{
Listanomi *p;
p=inizio;

do{
if(strcmp(nome,p->nome)==0) return p;
}while((p=p->successivo) != NULL); /*va sostituito con }while((p=p->successivo) != inizio);*/

return NULL;
}

Fra i commenti ci sono le parti da sostituire...ovviamente non l'ho provato...

cionci
21-01-2004, 03:52
fabiannit: hai la firma irregolare, deve max 3 righe @800x600... La tua è 5 rughe...ti prego di correggere... Grazie ;)