PDA

View Full Version : [c] linked list con array di char


gepeppe
12-11-2007, 12:59
salve, devo creare una linked list, in cui gli elementi sono stringhe, per cui ho deciso di salvarle in un array di char. Questa è la definizione della struttura list e della testa:

/*elemento della linked list*/
struct list{
char *parole[0]; /*array di char per inserire la stringa, ha un solo elemento perchè mi serve una sola stringa per elemento list*/
struct list *next;
};

/*testa della linked list*/
typedef struct stack_link{
int cnt; /*contiene il numero di elementi*/
struct list *top; /*puntatore a top*/
}stack_link;


ora vi posto le funzioni Reset (per inizializzare) e push
void Reset(stack_link *stk_l){
stk_l -> cnt = EMPTY; /*EMPTY = -1*/
stk_l -> top = NULL;
}

void Push(char *d, stack_link *stk_l){
struct list *p; /*crea un nuovo elemento*/

p = (struct list *)malloc(sizeof(struct list)); /*ne alloca lo spazio*/
p -> parole[0] = (char *)calloc(8,sizeof(char)); /*alloco lo spazio per una nuova parola*/

strcpy(p -> parole[0], d); /*gli assegna la parola*/

printf("%s\n", p -> parole[0]); /*la parola è stata copiata correttamente*/


p -> next = stk_l -> top; /*punta all'elemento precedente della lista*/
stk_l -> top = p; /*il top dello stack punterà a questo nuovo elemento*/

stk_l -> cnt++; /*incremento il contatore degli elementi*/
printf("controllo inserimento: %s\n", stk_l -> top -> parole[0]);
}

quando faccio il controllo, cioè printf("controllo inserimento: %s\n", stk_l -> top -> parole[0]); mi da un errore...ma non capisco perchè, visto che p-> parole[0] se controllate contiene in modo corretto la parola, mentre poi si perde!! che errore c'è nella funzione???

cmq se invece di implementarla con gli array di char la implemento con i char, funziona tranquillamente.

grazie

andbin
12-11-2007, 13:20
sorry

trallallero
12-11-2007, 15:31
char *parole[0];
perchè [0] ???

EDIT:
non ho mai visto una dichiarazione del genere ma temo che tu stia allocando un puntatore in un puntatore non inizializzato.

comunque se lo trasformi in
char *parole;
com'è giusto che sia, funziona il tutto ;)

gepeppe
12-11-2007, 17:34
fatto ti ringrazio...ora però ho un problema con pop, cioè sembra che il valore di ritorno di questa funzione è completamente sballato..fatto di simboli strani. Se in Pop provi a leggere il valore di p -> parole oppure stk_l -> top -> parole oppure il valore di d ti compare correttamente, ma chiamandola ad esempio dal main con printf("%s\n", Pop(&s)); stampa male!! A me sembra scritta bene la funzione....inoltre la memoria è liberata correttamente???

char *Pop(stack_link *stk_l){
char *d;
struct list *p;
strcpy(d, stk_l -> top -> parole);
p = stk_l -> top;
stk_l -> top = stk_l -> top -> next;
stk_l -> cnt--;
free(p -> parole);
free(p);
return d;
}

nel main la richiamo cosi:
stack_link s;
Reset(&s);
Push("a", &s);
Push("b", &s);
printf("%s\n", Pop(&s));
ps nella Push alloco la memoria per la stringa con malloc

trallallero
13-11-2007, 09:20
uhm ... vedo un puntatore ... anarchico :D


char *d;
...
strcpy(d, stk_l -> top -> parole);
...
return d;


hai dichiarato d senza neanche inizializzarlo a NULL
Poi ci scrivi dentro senza sapere a che indirizzo punta.
Poi ritorni un puntatore locale che non ha allocato la sua memoria.
3 righe 3 errori :D

Se vuoi ti spiego come risolvere ma se ci arrivi da solo te lo ricordi meglio poi.
Fammi sapere

gepeppe
13-11-2007, 13:11
capito...ho dichiarato d, alloco la memoria per d (con malloc....), ci copio dentro il valore, restituisco d....nella funzione chiamante poi faccio una bella free....è giusto?? :D

trallallero
13-11-2007, 13:22
capito...ho dichiarato d, alloco la memoria per d (con malloc....), ci copio dentro il valore, restituisco d....nella funzione chiamante poi faccio una bella free....è giusto?? :D

esatto ;)

ma non so se logicamente sia giusto