RENDERE UNA LISTA CONCATENATA CIRCOLARE

di il
1 risposte

RENDERE UNA LISTA CONCATENATA CIRCOLARE

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...

...non so da dove partitere,qualcuno può aiutarmi?

1 Risposte

  • Re: RENDERE UNA LISTA CONCATENATA CIRCOLARE

    La lista è qui

    #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;
    return;
    }

    for( p = inizio; p->successivo != NULL; p = p->successivo)
    ;
    p->successivo = e;
    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)
    inizio = eliminando->successivo;
    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(void)
    {
    Listanomi *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;
    }



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

    do{
    if(strcmp(nome,p->nome)==0) return p;
    }while((p=p->successivo) != NULL);

    return NULL;
    }




    int main()
    {
    char ans, buffer[80];
    Listanomi *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_elemento();
    fgets(buffer,80,stdin);
    buffer[strlen(buffer)-1]='\0';
    sscanf(buffer,"%40s",p->nome);
    aggiungi_elemento(p);
    }

    do{
    scrivi_lista();
    printf(" quale vuoi eliminare ? ");
    scanf("%s",buffer);

    if((p=trova_nome(buffer)) != NULL)
    {
    printf("Trovato ! : %s \n",p->nome);
    non_trovato=0;
    elimina(p);
    scrivi_lista();
    }
    else
    {
    printf("Elemento non trovato. Riprova\n");
    non_trovato=1;
    }
    } while(non_trovato);


    return 0;

    }
Devi accedere o registrarti per scrivere nel forum
1 risposte