PDA

Visualizza la versione completa : [C++] Esercizio su liste concatenate


toni00c
29-12-2010, 09:23
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

alka
29-12-2010, 10:11
E' obbligatorio indicare il linguaggio di programmazione nel titolo e formattare il codice sorgente usando il tag [CODE], come indicato nel Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887) di quest'area del forum.

Qui ho provveduto io a correggere il titolo. In futuro, provvedi tu a seguire le indicazioni.

toni00c
30-12-2010, 09:33
ciao , sorry ho scritto tutto di fretta, next time faccio come da regolamento!
ho un esame in vista..nessuno può aiutarmi? :(

lolide
30-12-2010, 11:19
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


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 ?




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 è



*testa =( *Testa ) . carattere ;


Comunque le parentesi si mettono perchè altrimenti non avresti modo di ricavare il valore del puntatore in quella situazione:


*testa =*Testa . carattere ;


senza parentesi ricaveresti il valore di carattere (se è un puntatore, sennò c'è un errore di compilazione)

toni00c
04-01-2011, 09:32
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

Loading