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

    [C] Problema con programma sulle liste

    Salve ragazzi,
    vi leggo da un paio di anni (soprattutto per le guide, ben fatte) e adesso ho deciso di iscrivermi. L'ho fatto perchè vi reputo decisamente all'altezza nel campo, e sono sicuro di affidarmi a buone mani.

    Veniamo al dunque: ho un problema abbastanza strano con un programma(i) scritto in linguaggio C.
    E' un semplice codice che dovrebbe inserire elementi in una lista ordinata.
    Il fatto è che se i dati in input sono delle stringhe (e quindi creo una lista di "parole") il programma funziona, ma se i dati sono dei numeri interi, no.
    Ed il problema me lo dà non solo con questo programma, ma con tutti quelli che presuppongono una lista ordinata.

    Il codice sorgente è il seguente:

    codice:
    #include <stdio.h>
    #include <iostream>
    
    
    typedef int E;
    struct blocchetto;
    typedef blocchetto*L;
    typedef struct blocchetto{
    E elem;
    L next;};
    
    
    L insert(E e,L l){
    L q, tmp=l; 
    L prec; 
    q=(L)malloc(sizeof(blocchetto));
    q->elem=e; 
    if((tmp==NULL) || (e<tmp->elem)){
    q->next=tmp; 
    return(q);} 
    while(tmp!=NULL && tmp->elem<=e){  
    prec=tmp;
    tmp=tmp->next;
    }
    prec->next=q; 
    q->next=tmp;
    return(l);} 
    
    
    void stampa(L l){
    L temp=l;
    while(temp!=NULL){
    printf("Elemento: %d \n",temp->elem);
    temp=temp->next;}}
    
    
    
    
    int main(){
    E e; L l;
    l=NULL;
    char risp[2];
    while(strcmp(risp,"no")!=0){
    printf("Vuoi inserire un elemento?(si o no) \n");
    scanf("%s",&risp);
    if(strcmp(risp,"si")==0){
    printf("Inserisci elemento: \n");
    scanf("%d",&e);
    l=insert(e,l);}}
    
    stampa(l);
    
    
    free(l);
    
    system("PAUSE");
    return(0);}
    Potreste aiutarmi a capire qual è l'errore?
    Grazie mille in anticipo.

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Gli include dovrebbero essere
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    Nel leggere una stringa non va utilizzato l'& in quanto la variabile contiene già l'indirizzo all'area di memoria
    codice:
    scanf("%s",risp);
    Per rilasciare la memoria non dovresti usare una semplice free, in quanto in questo modo rilasci solo la memoria del primo nodo, invece dovresti usare una funzione tipo
    codice:
    void freeList(L l) {
    	if(l == NULL)
    		return;
    	freeList(l->next);
    	free(l);
    }
    in modo da de-allocare ogni singolo nodo.

    risp dovrebbe essere di lunghezza 3: due lettere più il NULL finale per la terminazione della stringa
    codice:
    char risp[3];
    ah, e per farlo funzionare dovresti cambiare i typedef in una cosa tipo
    codice:
    typedef int E;
    struct blocchetto;
    typedef struct blocchetto blocchetto;
    typedef blocchetto *L;
    
    struct blocchetto{
    E elem;
    L next;};
    o, più semplice,
    codice:
    typedef int E;
    typedef struct blocchetto{
    E elem;
    L next;} blocchetto;
    typedef blocchetto *L;
    Se si tratta di puro C, se poi metti in mezzo il C++ è un'altra storia.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Ho effettuato tutte le modifiche che mi hai suggerito ma sfortunatamente il programma ancora non funziona.
    Inoltre il "secondo" typedef consigliato (quello più semplice, per intenderci) non viene nemmeno compilato, in quanto nella struct c'è un "L next" che ovviamente il compilatore stesso non riesce ad interpretare essendo il tipo L dichiarato dopo.

    Altre indicazioni?
    Grazie!

    P.S. Il programma è in C puro.

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Scusa, errore di distrazione nel copiare ed editare
    codice:
    typedef int E;
    typedef struct blocchetto{
    E elem;
    struct blocchetto *next;} blocchetto;
    typedef blocchetto *L;
    Premesso che un po' di sana identazione non farebbe mai male, siccome non hai postato gli errori che ottieni, questo funziona, vedi le differenze nel tuo codice...
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef int E;
    typedef struct blocchetto{
    	E elem;
    	struct blocchetto *next;
    } blocchetto;
    typedef blocchetto *L;
    
    
    L insert(E e,L l){
    	L q, tmp = l; 
    	L prec; 
    	q = (L)malloc(sizeof(blocchetto));
    	q->elem = e; 
    	if((tmp == NULL) || (e < tmp->elem)){
    		q->next = tmp; 
    		return(q);
    	} 
    	while(tmp != NULL && tmp->elem <= e){  
    		prec = tmp;
    		tmp = tmp->next;
    	}
    	prec->next = q; 
    	q->next = tmp;
    	return(l);
    } 
    
    
    void stampa(L l){
    	while( l != NULL){
    		printf("Elemento: %d \n", l->elem);
    		l = l->next;
    	}
    }
    
    void freeList(L l) {
    	if(l == NULL)
    		return;
    	freeList(l->next);
    	free(l);
    }
    
    int main(){
    	E e;
    	L l;
    	l=NULL;
    	char risp[3] = "si";
    	
    	while(strcmp(risp, "no") != 0){
    		printf("Vuoi inserire un elemento?(si o no) \n");
    		scanf("%s", risp);
    		if(strcmp(risp, "si") == 0){
    			printf("Inserisci elemento: \n");
    			scanf("%d", &e);
    			l = insert(e, l);
    		}
    	}
    	
    	stampa(l);
    
    	freeList(l);
    
    	system("PAUSE");
    	return(0);
    }
    P.s. sempre assicurarsi che le variabili siano inizializzate!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Grazie mille, ho risolto.
    Praticamente l'errore era dichiarare la stringa "risp" lunga 3 unità anzichè 2.

    Non ho ancora ben capito perchè con le stringhe funzionava e con gli interi no ma l'importante è aver identificato il problema.

    Si può chiudere, ringraziando ancora per la pazienza.

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Ti sbagli di grosso se credi che quello sia un errore, nel mio codice ho sbagliato ad inizializzarla a si casomai...
    Doveva essere
    codice:
    char risp[3];
    strcpy(risp, "si");
    Ma la stringa DEVE essere di lunghezza 3 in quanto i carattere in successione sono s i \0 ...
    "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.