Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - cosa non va con le liste
Forum - C/C++ - cosa non va con le liste

Avatar
ElCobra91 (Normal User)
Newbie


Messaggi: 18
Iscritto: 22/08/2010

Segnala al moderatore
Postato alle 19:19
Lunedì, 23/05/2011
ciao stavo facendo un esercizio che dice: si consideri la seguente struttura
Codice sorgente - presumibilmente C++

  1. typedef struct Nodo{
  2.                                char *str;
  3.                                struct Nodo* next;
  4.                                      }nodo;



si realizzi una funzione ch,ricevuta in ingresso una stringa contenente parole separate esattamente da uno spazio,crei una lista i cui nodi contengano le parole della stringa passata e ne restituisca la testa.
Il mio codice è questo
Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<unistd.h>
  5.  
  6. typedef struct Nodo{
  7.     char *str;
  8.     struct Nodo *next;
  9.    }nodo;
  10.  
  11. nodo *creaLista(char *);
  12. void stampaLista(nodo *);
  13.  
  14. int main(int argc, char *argv[])
  15. {
  16.   nodo *first;
  17.   char *string;
  18.   int dim;
  19.  
  20.   first = NULL;
  21.  
  22.   printf("Inserisci l dimensione della tua stringa\n");
  23.   scanf("%d",&dim);
  24.  
  25.   while(dim!=0){
  26.     string=(char *)malloc(sizeof(char)*dim + 1);
  27.     printf("Inserisci la stringa ");
  28.     gets(string);
  29.     first=creaLista(string);
  30.     printf("Inserisci la dimensione della tua stringa");
  31.     scanf("%d",&dim);
  32.   }
  33.  stampaLista(first);
  34.  return 0;
  35. }
  36.  
  37. nodo *creaLista(char *s)
  38. {
  39.   nodo *testa;
  40.   nodo *nuovo;
  41.   int i,j,k;
  42.   testa=NULL;
  43.  
  44.   for(i=0,j=0;s[i]!='\0';i++){
  45.     if(s[i]==' '){
  46.      nuovo=(nodo *)malloc(sizeof(nodo));
  47.      nuovo->str=malloc(sizeof(char)*(i-j));
  48.      for(k=0;j<i;j++,k++)
  49.        nuovo->str[k]=s[j];
  50.      nuovo->str[j]='\0';
  51.      nuovo->next=testa;
  52.      testa=nuovo;
  53.      }
  54.    
  55.   }
  56.  return testa;
  57. }
  58.  
  59. void stampaLista(nodo *testa)
  60. {
  61.   nodo *tmp;
  62.  
  63.   for(tmp=testa;tmp!=NULL;tmp=tmp->next)
  64.    printf("%s",tmp->str);
  65.   return;
  66. }



In pratica se inserisco una stringa di lunghezza 10 come "ciao mamma" dovrebbe creare due nodi uno con ciao e poi uno con mamma e poi dovrebbe stampare" mamma ciao" perchè inserisco in testa ogni nodo ma non succede nulla.Potete dirmi dove posso aver sbagliato?

PM Quote
Avatar
Ghost_M91W (Ex-Member)
Newbie


Messaggi: 5
Iscritto: 10/05/2011

Segnala al moderatore
Postato alle 2:04
Venerdì, 27/05/2011
potevi usare la funzione strtok per estrarre le parole dal testo, poi ad ogni chiamata alla funzione la testa veniva riazzerata per questo, credo, ti dava quel problema. Ho modificato un po' il tuo codice e sembra funzionare. Fammi sapere ;)
Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<unistd.h>
  5.  
  6. typedef struct Nodo{
  7.     char *str;
  8.     struct Nodo *next;
  9.    }nodo;
  10.  
  11. nodo *creaLista(char *, nodo *);
  12. void stampaLista(nodo *);
  13.  
  14. int main(int argc, char *argv[])
  15. {
  16.  nodo *first=calloc(1,sizeof(nodo));
  17.  char *string;
  18.  int dim;
  19.  
  20.  first = NULL;
  21.  
  22.  do{
  23.     printf("Inserisci la dimensione della tua stringa: ");
  24.     scanf("%d",&dim); fflush(stdin); dim++;
  25.    }while(dim==0);
  26.  
  27.  string=(char *)malloc(sizeof(char)*dim + 1);
  28.  printf("Inserisci la stringa: ");
  29.  gets(string);
  30.  first=creaLista(string,first);
  31.  
  32.  stampaLista(first);
  33.  return 0;
  34. }
  35.  
  36. nodo *creaLista(char *s, nodo *testa)
  37. {
  38.   nodo *nuovo; char *token; int len;
  39.   token=strtok(s," "); len=strlen(token);
  40.   nuovo=calloc(1,sizeof(nodo)); //aggiungo il primo nodo
  41.   nuovo->str=token;
  42.   testa=nuovo;
  43.   while((token=strtok(NULL," "))!=0){nuovo=calloc(1,sizeof(nodo)); //aggiungo in testa gli altri nodi
  44.                                      nuovo->str=token;
  45.                                      nuovo->next=testa;
  46.                                      testa=nuovo;
  47.                                     }
  48.  return testa; //restituisco la testa della lista
  49. }
  50.  
  51. void stampaLista(nodo *testa)
  52. {
  53.   nodo *tmp;
  54.  
  55.   for(tmp=testa;tmp!=NULL;tmp=tmp->next) printf("%s\n",tmp->str);
  56. }



PM Quote