Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [C]Liste di nomi

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    24

    [C]Liste di nomi

    Salve a tutti e' da un po' che sto cominciando a smanettare con le liste,trovando abbastanza problemi.

    il programma che avevo scritto è abbastanza classico

    codice:
    #include <stdio.h>#include <stdlib.h>
    
    
    struct ListaNodo{
        char nodo;
        struct ListaNodo *nextPtr; //punta al prossimo nodo
    };
    
    
    typedef struct ListaNodo ListaNodo;
    typedef ListaNodo *ListaNodoPtr;
    
    
    void istruzioni(void);
    void inserisci(ListaNodoPtr *, char);
    int cancella(ListaNodoPtr *, char);
    void visualizza(ListaNodoPtr);
    
    
    int main(void)
    {
        ListaNodoPtr startPtr=NULL; //primo nodo della lista, che è sempre fittizio, come l'ultimo.
        int scl;
        char item;
        int risp;
    
    
        istruzioni();
        scanf("%d" ,&scl);
    
    
        while(scl != 4)
        {
            switch(scl)
            {
            case 1:
                printf("Inserisci una lettera:");
                scanf("\n%c" ,&item);
                inserisci(&startPtr, item);
                break;
            case 2:
                printf("\nInserisci l'elemento da cancellare:");
                scanf("\n%c" ,&item);
                risp=cancella(&startPtr, item);
                if(risp != 0)
                    printf("\nCancellazione avvenuta con successo\n");
                else
                    printf("\nNon hai trovato nessun elemento corrispondente\n");
                break;
            case 3:
                visualizza(startPtr);
                break;
            default:
                printf("\nScelta invalida\n");
                istruzioni();
                scanf("%d" ,&scl);
                break;
    
    
            }
            istruzioni();
        scanf("%d" ,&scl);
    
    
        }
    
    
    }
    
    
    void istruzioni(void)
    {
        printf("1)Inserisci un nuovo nodo nella lista\n");
        printf("2)Cancella un nodo dalla Lista\n");
        printf("3)Visualizza\n");
        printf("4)Esci\n");
    }
    
    
    void inserisci(ListaNodoPtr *sPtr, char witem)
    {
        ListaNodoPtr nuovo_ptr;
        ListaNodoPtr ptr_corrente;
        ListaNodoPtr ptr_precedente;
    
    
        nuovo_ptr=malloc(sizeof(ListaNodo));
    
    
        if(nuovo_ptr != NULL) //la memoria è ancora disponibile ?
        {
            nuovo_ptr->nodo= witem;
            nuovo_ptr->nextPtr = NULL;
    
    
            ptr_precedente= NULL;
            ptr_corrente= *sPtr;
    
    
            while(ptr_corrente != NULL && witem > ptr_corrente->nodo)
            {
                ptr_precedente=ptr_corrente;
                ptr_corrente=ptr_corrente->nextPtr;
            }
    
    
            if(ptr_precedente == NULL)
            {
                nuovo_ptr->nextPtr = *sPtr;
                *sPtr = nuovo_ptr;
            }
            else
            {
                ptr_precedente->nextPtr = nuovo_ptr;
                nuovo_ptr->nextPtr = ptr_corrente;
            }
        }
    }
    
    
    int cancella(ListaNodoPtr * sPtr, char item)
    {
        ListaNodoPtr ptr_precedente;
        ListaNodoPtr ptr_corrente;
        ListaNodoPtr tmp;
    
    
        if(item == (*sPtr)->nodo)
        {
            tmp= *sPtr;
            *sPtr = (*sPtr)->nextPtr;
            free(tmp);
            return 1;
        }
    
    
        else
        {
            ptr_precedente = *sPtr;
            ptr_corrente = (*sPtr)->nextPtr;
    
    
            while(ptr_corrente != NULL && item != ptr_corrente->nodo)
            {
                ptr_precedente=ptr_corrente;
                ptr_corrente=ptr_corrente->nextPtr;
            }
    
    
            if(ptr_corrente != NULL)
            {
                tmp=ptr_corrente;
                ptr_precedente->nextPtr=ptr_corrente->nextPtr;
                free(tmp);
                return 1;
            }
            return 0;
        }
    
    
    }
    
    
    void visualizza(ListaNodoPtr corrente)
    {
        if(corrente == NULL)
            printf("\nNessun elemento presente nella lista\n");
    
    
        else
        {
            printf("La lista e':\n");
            while(corrente != NULL)
            {
                printf("%c --> " ,corrente->nodo);
                corrente=corrente->nextPtr;
            }
            printf("NULL\n\n");
        }
    }
    quello che però mi blocca è la seguente domanda, io nella struct ho utilizzato un solo tipo di dato (il char ) ma se volessi utilizzare un dato più complesso ? come ad esempio un nome e un numero ?

    per intenderci, intenderei trattare questi nuovi tipi di dati come elementi della struct, per essere più chiaro:

    codice:
    struct Prova{
             char *nome;
             char *cognome;
             int ID;
    };
    Precisamente mi blocco nell'inserire questi nuovi dati nella lista, cioè non so come fare e\o cosa aggiungere al codice di sopra .

    Grazie per il tempo dedicatomi

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non ho controllato se il tuo codice funziona, comunque devi cambiare
    codice:
    struct ListaNodo{
      char nodo;
       struct ListaNodo *nextPtr; //punta al prossimo nodo
    };
    In qualcoda tipo
    codice:
    struct ListaNodo{  
      char *nome;
      char *cognome;
      int ID;
       struct ListaNodo *nextPtr; //punta al prossimo nodo
    };
    O se preferisci
    codice:
    typedef struct inf {    
      char *nome;
      char *cognome;
      int ID;
    } inf;
    
    struct ListaNodo{
      inf nodo
       struct ListaNodo *nextPtr; //punta al prossimo nodo
    };
    E ovviamente cambiare di conseguenza le funzioni di inserimento e rimozione a seconda della struttura scelta.
    Nota comunque che utilizzando char * dovrai allocare la memoria per contenere il dato.
    Ultima modifica di Scara95; 23-05-2014 a 16:07
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.