Newsgroup: it.comp.lang.c
Titolo: HELP!! ESAME SU LISTE DINAMICHE

Salve a tutti,
ho un grosso problema da sottoporvi e ho tempo fino a lunedi.
Ho un file di testo che contiene una serie di numeri.
Questi numeri devono essere inseriti in una lista dinamica semplice.
Avvio il programma, tutto ok!
Creo un file con una sequenza di numeri, ok!
MA nel momento in cui voglio inserire i valori in una lista e cerco
di stamparla, il risultato a video è questo:
(  ), una bella lista vuota! DOve ho sbagliato??? Non riesco a capire!
Chi mi da una mano?
Ps: I prototipi devono essere rigorosamente quelli dichiarati :(
#include <stdio.h>
#include <stdlib.h>
typedef struct lista
 {
 int dato;
 struct lista *next;
 }LISTA;
void creafile(char *filename);
int insert(char *filename, void *ptr);
void inseriscilista(LISTA **ptr, int n);
void stampalista(LISTA *ls);
main()
{
LISTA *ls = NULL;
int letti;
 creafile("leggi.txt");
letti = insert("leggi.txt", ls);
printf("I valori letti da file sono: %d\n", letti);
stampalista(ls);
int insert(char *filename, void *ptr)
{
FILE *f;
int n, err, count = 0;
if((f=fopen(filename, "r")) == NULL)
 return 0;
while((err = fscanf(f, "%d ", &n)) != EOF)
 {
 count++;
 inseriscilista(&ptr, n);
 }
fclose(f);
return count;
}
void inseriscilista(LISTA **ptr, int n)
{
LISTA *paus;
paus = (LISTA *) malloc(sizeof(LISTA));
paus->dato = n;
paus->next = *ptr;
*ptr = paus;
}
void stampalista(LISTA *ptr)
{
printf("(  ");
while(ptr != NULL)
 {
 printf("%d  ", ptr->dato);
 ptr = ptr->next;
 }
printf(")\n");
}
void creafile(char *filename)
{
int n, x, i;
FILE *f;
if((f=fopen(filename, "w")) == NULL)
 {
 printf("Errore in apertura file\n");
 return;
 }
printf("Quanti elementi vuoi inserire?\n");
scanf("%d", &x);
for(i=0; i < x; i++)
 {
 printf("Inserisci l'elemento %d: ", i+1);
 scanf("%d", &n);
 fprintf(f, "%d ", n);
 }
fclose(f);
}

 Chi mi da una mano?
Il codice da te postato conteneva alcuni piccoli errori che lo rendevano
inutile.
Io ho solo fatto 4--5 minuscole modifiche necessarie a farlo funzionare.
Ci tengo a dire che non e' cmq un programma fatto bene. Si potrebbe fare
molto meglio....
Ad ogni modo:
<CODE>
#include<stdio.h>
#include<stdlib.h>
typedef struct lista{
    int dato;
    struct lista *next;
}LISTA;
void creafile(char *filename);
int insert(char *filename, LISTA **ptr);
void inseriscilista(LISTA **ptr, int n);
void stampalista(LISTA *ls);
main()
{
    LISTA *ls = NULL;
    int letti;
    creafile("leggi.txt");
    letti = insert("leggi.txt", &ls);
    printf("I valori letti da file sono: %d\n", letti);
    stampalista(ls);
}
int insert(char *filename, LISTA **ptr)
{
    FILE *f;
    int n, err, count = 0;
    if((f=fopen(filename, "r")) == NULL)
        return 0;
    while((err = fscanf(f, "%d ", &n)) != EOF){
        count++;
        inseriscilista(ptr, n);
    }
    fclose(f);
    return count;
}



</CODE>
Alex
P.S. ah, non ho controllato che vada tutto bene, mi sono limitato a fare in
modo che funzioni. E' quindi probabile che oltre ad essere fatto un pochino
alla buona abbia anche dei bugs.

ho risolto il problema passando l'indirizzo della lista:
insert("leggi.txt", &ls);
Pero' non finisce qui... :)) Il compito inoltre richiedeva l'implementazione
di una funzione di ricerca di elementi e cancellazione delle occorrenze
uguali ad un valore key:
int extract(void *ptr, int key)
{
LISTA *tmp, *paus, *t;
int count = 0;
tmp = ptr;
while(tmp->next != NULL)
 {
 if(tmp->next->dato == key)
  count++;
  paus = tmp->next;
  tmp->next = tmp->next->next;
  free(paus);
  }
 else
  tmp = tmp->next;
 }
t = ptr;
if(t->dato == key)
    count ++;
    paus = t;
    t = t->next;
    free(paus);
    }
return count;
}
il tuttto funziona solo su alcune liste, ma quando provo con una lista che
alla fine ha il campo dato uguale a key, non viene cancellato (sotto linux)
pero' il numero delle occorrenze viene ugualmente incrementato. Ad esempio
una lista contenuta in un file contiene
12 23 34 54 56 la lista dovrebbero apparire al contrario e cioč 56 54 34 23
12. quindi se 56 = key il count viene incrementato ma il 12 non viene
eliminato.
Spero di essere stato chiaro,
Luca.

 eliminato.
Scusate la confusione, il num che viene cancellato non è 12 ma 56 (ovvero la
testa della lista).
Luca