Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    richiesta aiuto liste concatenate

    Ciao a tutti sto studiando le liste concatenate in vista di un esame e ho alcuni problemi che non riesco a chiarire ;
    mi potreste aiutare???

    ho riscritto un software che inserisce caratteri in una sequenza , e vi posto alcune parti ;



    ================================================== ===================

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>


    struct listaNodi {
    char character;
    struct listaNodi *nextPtr;
    };
    typedef struct listaNodi ListaNodi;
    typedef ListaNodi *ListNodePtr;


    void inserisci( ListNodePtr *sTesta, char value );
    /* definisco un prototipo di funzione per inserire i caratteri */


    int main( )
    {
    ListaNodiPtr Testa = NULL ;
    char carattere;
    int risposta ;

    printf ("vuoi provare ?? digita 1 o 0 per uscire\n" ) ;
    scanf ("%d" , & risposta ) ;


    while ( risposta == 1 )
    {
    inserisci( &Testa, carattere );
    printf ("vuoi provare ancora ?? digita 1 o 0 per uscire\n" ) ;
    scanf ("%d" , & risposta ) ;
    }

    return 0;


    }

    void inserisci( ListNodePtr *sTesta, char value )
    {
    ListaNodiPtr Nuovo;
    ListaNodiPtrCorrente;
    Nuovo = malloc( sizeof( ListaNodi ) );

    if ( Nuovo != NULL ) {
    Nuovo->character = value;
    Nuovo->nextPtr = NULL;
    Precedente = NULL;
    Corrente = *sTesta;

    while (Corrente != NULL && value >Corrente->character ) {
    Precedente =Corrente;
    Corrente =Corrente->nextPtr;
    }

    if ( Precedente == NULL ) {
    Nuovo->nextPtr = *sTesta;
    *sTesta = Nuovo;
    }
    else {
    Precedente->nextPtr = Nuovo;
    Nuovo->nextPtr =Corrente;
    }
    }
    else {
    printf( "%c memoria non disponibile .\n", value );
    }

    }



    ho alcune domande ;
    1)non ho ho definito nessuna istanza della struttura "ListaNodi" , dove il compilatore trova i dati ?
    è un discorso analogo al dichiarare una stringa del tipo char *Ptr = " value" ; ??
    cioè da qualche parte nella memoria crea una stringa ?

    qualora dichiarassi un puntatore di stringhe del tipo char *xxx [2] = { "vvvv" , "nnn" } ;
    come si può accedere ad ogni carattere di ogni singola stringa?

    2)Corrente = *sTesta; che senso ha assegnare al puntatore corrente l'indirizzo di quello di testa ?

    3) while (Corrente != NULL && value >Corrente->character ) .. ma corrente->character quando è stato inizializzato ?

    4) che senso ha un espressione del tipo
    *testa =( *Testa ) -> carattere ; perchè le parentesi tonde?



    Grazie a tutti

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    E' obbligatorio indicare il linguaggio di programmazione nel titolo e formattare il codice sorgente usando il tag [CODE], come indicato nel Regolamento di quest'area del forum.

    Qui ho provveduto io a correggere il titolo. In futuro, provvedi tu a seguire le indicazioni.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    ciao , sorry ho scritto tutto di fretta, next time faccio come da regolamento!
    ho un esame in vista..nessuno può aiutarmi?

  4. #4
    ho alcune domande ;
    1)non ho ho definito nessuna istanza della struttura "ListaNodi" , dove il compilatore trova i dati ?
    è un discorso analogo al dichiarare una stringa del tipo char *Ptr = " value" ; ??
    cioè da qualche parte nella memoria crea una stringa ?
    No. Infatti hai solamente creato un puntatore. Lo devi inizializzare con malloc() prima di utilizzarlo.

    Quel char *Ptr = "value" non funziona in quanto così facendo tu assegni un valore al lvalue del puntatore (l'indirizzo in memoria). Quando crei un puntatore in memoria, non allochi i byte necessari per il suo contenuto, che vanno allocati o con new oppure con malloc()

    facendo
    codice:
    char *Ptr = 0; //pointer vuoto
    Ptr = (char*)malloc(10*sizeof(char));
    creerai una stringa di 10 char utilizzabile.

    qualora dichiarassi un puntatore di stringhe del tipo char *xxx [2] = { "vvvv" , "nnn" } ;
    come si può accedere ad ogni carattere di ogni singola stringa?
    facendo così crei una matrice di puntatori a char.
    Attenzione: tra char xxx[2][10] e char *xxx[2] c'è differenza

    la prima, è come se creassi una stringa di 20 char (char xxx[20]) solo che il compilatore lo vede come una matrice e quindi sa che accedendo con [1][1] lui deve leggere l'11 char della "stringa".
    Il problema è che facendo char *xxx[2] ogni riga della matrice contiene semplicemente char* (un puntatore di char) che dovrai provvedere ad inizializzare con malloc()

    2)Corrente = *sTesta; che senso ha assegnare al puntatore corrente l'indirizzo di quello di testa ?
    codice:
    Corrente = *sTesta;
    
    while (Corrente != NULL && value >Corrente->character ) { 
    Precedente =Corrente; 
    Corrente =Corrente->nextPtr; 
    }
    Intanto non gli assegna l'indirizzo ma il valore (*<puntatore> ricava il valore del puntatore)
    Lo fa perchè con il while lui scorre tutti i nodi e compara i caratteri contenuti in essi, se sono minori (quindi la lettera non è in ordine), allora non la inserisce.

    3) while (Corrente != NULL && value >Corrente->character ) .. ma corrente->character quando è stato inizializzato ?
    Una delle condizioni del while è di controllare se Corrente è NULL, se non è inizializzato non cicla

    4) che senso ha un espressione del tipo
    *testa =( *Testa ) -> carattere ; perchè le parentesi tonde?
    Questa espressione è sbagliata. Cmq si mettono le parentesi tonde per ricavare il valore del puntatore e quindi non vederlo più come puntatore ma come struttura statica, quindi poter accedere ai suoi valori con . e non con ->
    L'utilizzo corretto è

    codice:
    *testa =( *Testa ) . carattere ;
    Comunque le parentesi si mettono perchè altrimenti non avresti modo di ricavare il valore del puntatore in quella situazione:
    codice:
    *testa =*Testa . carattere ;
    senza parentesi ricaveresti il valore di carattere (se è un puntatore, sennò c'è un errore di compilazione)

  5. #5
    ciao sei stato gentilissimo grazie

    allora ricapitolando :

    1)l'operatore unario * restituisce il valore puntato dal puntatore
    quindi un espressione del tipo

    int *Testa ;
    int xxx ;
    Testa = NULL ;

    xxx = *Testa ;
    assegna alla variabile xxx il valore NULL


    2)un espressione del tipo :
    char a [] = "blue" ; creera un vettore di 5 caratteri , 4 più il carattere di terminazione

    Mentre

    char *a = "blue" ;

    creerà un puntatore di tipo char a una stringa immagazzinata da qualche parte nella memoria

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 © 2025 vBulletin Solutions, Inc. All rights reserved.