PDA

View Full Version : [C] Errore in semplice programma sulle liste


D4rkAng3l
10-05-2006, 14:17
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?


#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

wisher
10-05-2006, 14:23
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

D4rkAng3l
10-05-2006, 14:41
non và...sostituendo il \0 con NULL dà esattamente lo stesso problema...booo

andbin
10-05-2006, 14:56
Ecco le parti di codice corrette:
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;
}
Nella stampalista():
while(i != NULL){
printf("%c", i->carattere);
counter ++;
i = i->next;
}

sottovento
10-05-2006, 16:58
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?


#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

A dirla tutta, sembrerebbe la prima funzione, invece, ad avere problemi.
Quando scrivi:

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


a->carattere e' il posto sbagliato. La funzione seguente (quella che pensavi fallisse) pertanto scrivera' dei valori sbagliati.

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