Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    [C] Problema con semplice esercizio sulle liste

    Ciao,
    devo scrivere un programma che fà le seguenti cose:
    immessa una stringa con una funzione mette in una lista ogni carattere della stringa fino alla fine della stringa.

    Poi con un'altra funzione stampa i caratteri cntenuti nel membro apposito di ogni nodo e stampa di quanti nodi è formata la stringa....la prima funzione dovrebbe funzionare correttamente...la seconda sbrocca....come mai?

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct lista{
    	char carattere;
    	struct lista *next;
    };
    
    struct lista *StringToList(char *);
    void stampalista(struct lista *);
    
    int main(){
    
    	char stringa[100];
    	struct lista *head; 
    
    	printf("Inserire una stringa: ");
    	scanf("%s", stringa);
    	head = StringToList(stringa);
    	stampalista(head);
    	
    	return 0;
    }
    
    struct lista *StringToList(char *s){
    	
    	struct lista *head = NULL;     // Crea il puntatore al primo nodo e impostalo a NULL
    	struct lista *a;		     //	Puntatore a nodo generico
    	int i;
    	
    	if(s[0] != '\0'){	     // Se il primo carattere della stringa non è nullo
    		head = malloc(sizeof(struct lista));	// alloca memoria per il primo nodo della lista
    		head->carattere = s[0];
    		head->next = NULL;
    		a = head;
    	
    		for(i=1; s[i] != '\0'; i++){
    			a->next = malloc(sizeof(struct lista));
    			a->carattere = s[i];
    			a = a->next;
    		}
    	}
    		a->next = NULL;		
    		return(head);
    	
    }
    
    void stampalista(struct lista *i){
    
    		int counter = 0;
    		while(i->next != '\0'){
    			printf("%c", i->carattere);
    			counter ++;
    		}
    		printf("\nIl numero di nodi della lista corrisponde a: %d\n\n", counter);
    }
    Grazie
    Andrea

  2. #2
    Non ho fatto le liste e non posso aiutarti completamente...ma l'errore no è nella seconda funzione, ma nella prima.

    Perchè se tu inserisci un solo carattere, non una stringa, il risultato lo ottieni correttamente.
    Quindi è sbagliata la prima funzione che alloca.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    5
    ciao!

    hai provato

    codice:
    while(i->next != NULL)
    invece di:

    codice:
    while(i->next != '\0')

  4. #4
    2 errori, il while ha come condizione

    while(i->next != NULL)

    e

    quando stampi non mandi avanti la i

    dovresti fare i=i->next

    ciauz!!

  5. #5
    E' vero, erano quelli gli errori.
    Ma però stampa caratteri strani.

  6. #6
    altro errore:

    codice:
    		for(i=1; s[i] != '\0'; i++){
    			a->next = malloc(sizeof(struct lista));
    			a->carattere = s[i];
    			a = a->next;
    		}
    così non va bene, prima di modificare il carattere devi avanzare nella lista, modificavi anche il carettere di head così

    codice:
    		for(i=1; s[i] != '\0'; i++){
    			a->next = malloc(sizeof(struct lista));
                            a = a->next;
    			a->carattere = s[i];
    		}

  7. #7
    così a me va:

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <conio.h>
    #define MAX_LN  100
    
    struct lista{
    	char carattere;
    	struct lista *next;
    };
    
    struct lista *StringToList(char *);
    void stampalista(struct lista *);
    
    int main(void){
    
    	char stringa[MAX_LN];
    
    	printf("Inserire una stringa: ");
    	fgets(stringa,MAX_LN,stdin);
    	stampalista(StringToList(stringa));
    	getch();
    	return 0;
    }
    
    struct lista *StringToList(char *s){
    	
    	struct lista *head = NULL;     // Crea il puntatore al primo nodo e impostalo a NULL
    	struct lista *a;		     //	Puntatore a nodo generico
    	int i;
    	
    	if(s[0] != '\0'){	     // Se il primo carattere della stringa non è nullo
    		head = malloc(sizeof(struct lista));	// alloca memoria per il primo nodo della lista
    		head->carattere = s[0];
    		head->next = NULL;
    		a = head;
    	
    		for(i=1; s[i] != '\0'; i++){
    			a->next = malloc(sizeof(struct lista));
    			a = a->next;
                a->carattere = s[i];
    		}
    	}
    		a->next = NULL;		
    		return(head);
    	
    }
    
    void stampalista(struct lista *i){
    		int counter = 0;
    		while(i->next != NULL){
    			printf("%c", i->carattere);
    			i=i->next;
    			counter ++;
    		}//end while
    printf("\nIl numero di nodi della lista corrisponde a: %d\n\n", counter);
    }
    poi si potrebbe fare di meglio eliminando l'if... però l'imp è che vada

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.