|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
[C] Errore in semplice programma 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);
}
Andrea |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2755
|
leggendo il codice sembra che tu non inserisca lo \0 nella lista, poi quando stampi lo usi come controllo.
prova a sostituire il controllo di \0 con NULL nel controllo di i->next
__________________
|
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
non và...sostituendo il \0 con NULL dà esattamente lo stesso problema...booo
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ecco le parti di codice corrette:
Codice:
struct lista *StringToList(char *s){
struct lista *head = NULL;
struct lista *o = NULL;
struct lista *a;
while (*s != '\0')
{
a = malloc(sizeof(struct lista));
a->carattere = *s++;
a->next = NULL;
if (head == NULL)
head = a;
if (o != NULL)
o->next = a;
o = a;
}
return head;
}
Codice:
while(i != NULL){
printf("%c", i->carattere);
counter ++;
i = i->next;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Quando scrivi: Codice:
for(i=1; s[i] != '\0'; i++){
a->next = malloc(sizeof(struct lista));
a->carattere = s[i];
a = a->next;
}
Sara' una mia fissazione: quando si usa la malloc() e' imperativo controllare il valore di ritorno. Non fidarti del fatto che sono pochi byte da allocare: la funzione puo' fallire comunque e ti ritrovi a perdere giorni per cercare un errore, probabilmente che si verifica in maniera casuale in parti diverse dell'applicazione High Flying Sottovento
__________________
In God we trust; all others bring data |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:44.



















