Newsgroup: it.comp.lang.c
Titolo: pila implementata come lista

Salve, qualcuno potrebbe gentilmente dirmi una possibile soluzione o
linkarmela?
Io l'ho fatta ma deve esserci stato qualche problema con i puntatori, fatto
sta che non funziona.
Praticamente si tratta di una pila di parole con inserimento e cancellazione
in testa, consta di una funzione push che dovrebbe inserire un'elemento in
testa alla lista, di una pop che dovrebbe cancellare il primo della lista e
una cha si chiama vuota che verifica se la pila č vuota  qualcuno puņ dirmi
dove sbaglio?
Grazie infinite a chiunque trovi l'inghippo.
struct frase {
              char * p;
              struct frase * next;
             };
int vuota (struct frase *f)
 {
  int v;
  if(f==NULL) v=1;
  else {v=0;printf("\nparola corrente:");printf("%s",f->p);scanf("%c*c");}
  return v;
 }
void push (struct frase *f,char * p)
 {
  printf("\npush");
  printf("\nparola:");
  printf("%s",p);
  printf("\ntemp:");
  //printf(f->p);
  struct frase * temp=(struct frase *) malloc (sizeof(struct frase));
  temp->p=p;
  printf("%s",temp->p);
  temp->next=f;
  f=temp;
  printf("%s",f->p);
  scanf("%c*c");
 }
 char * pop(struct frase * f)
  {
   char * temp=f->p;
   struct frase *t=f;
   f=f->next;
   free(t);
   return temp;
  }

[cut]
devi essere più preciso con gli errori.
il codice inserito non basta per capire che errori hai...
sicuramente è mancanza di allocazione di memoria per la var p.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 una cha si chiama vuota che verifica se la pila è vuota  qualcuno può


 una cha si chiama vuota che verifica se la pila è vuota  qualcuno può


 sicuramente è mancanza di allocazione di memoria per la var p.
non credo sia questa la 
cosa.la
 dividi_parole pensa ad allocare le parole e
passa il puntatore alla funzione push(questa è la parte di codice che
insieme a quello scritto precedentemente costituisce il programma che si
occupa di acquisire una frase da file, fino al punto e dividerla in parole):
int checkchar(char c)
 {
  int i=0;
  if ( (ispunct(c)) || (isspace(c)) ) i=1;
  if ((c=='.')||(c=='\n')) i=2;
  return i;
 }
void dividi_parole(struct frase *f,char *fr,int i)
 {
  int in=0;
  int pos=0;
  int j;
  char c;
  char *temp;
  do
   {
    pos=in;
    do
    {
     c=fr[in];
     in++;
    }while(checkchar(c)<1);
    if((in-pos)>1)
     {
      temp=(char *)calloc ((in-pos-1), sizeof(char));
      for(j=pos;j<in;j++)
       temp[j-pos]=fr[j];
      push(f,temp);
     }
   }while(in<=i);
int main (int argc, char * argv[])
 {
  char c;
  int cont,i=0,curf=0;
  char * temp;
  struct frase * f, *f1;
  struct frase *t;
  FILE * fp;
  f=NULL;
  f1=NULL;
  if(! (fp=fopen (argv[1] , "r")) )
   {
    printf("Impossibile aprire il file");
    exit(1);
   }
  while(!feof(fp))
  {
   curf = ftell (fp);
   do
    {
     c=getc(fp);
     i++;
    }while(checkchar(c)<2);
    if (i>1)
     {
      temp = (char *)calloc (i, sizeof(char));
      fseek (fp, curf, SEEK_SET);
      fgets (temp, i, fp);
      printf ("\n%s", temp);
      dividi_parole(f,temp,i);
      t=f;
      printf("\nstampo frase");
      while (!vuota(f))
       printf("\n%s",pop(t));
     }
   }
  fclose(fp);
  return 0;
 }
l'errore che mi da è quello che mi tiene solo l'ultima parola e al momento
dell'allocazione la variabile temp e anche quella parola mi viene
visualizzata con dei caratteri strani che non c'entrano niente (come il
simbolo di fiori e l'uguale).
L'altro problema ben + evidente è che non sempre stampa correttamente la
frase nel main.
In allegato c'è il file su cui faccio i test ma può essere qualsiasi altro
basta che abbia parole, punteggiatura.


  p->parola=testo;
non ho capito cosa intendi per testo, è una parola che devo allocare
dinamicamente, non un semplice carattere.


 questo qualcosa, devi avere come argomento un puntatore a puntatore(**)...
non me l'ha mai detto nessuno una cosa di simile anche perchè abbiamo avuto
un esercitatore disastroso.
cmq mi sembra una buonissima trovata, probabilmente mi hai dato la chiave
per risolvere tutto.
Grazie!

 Comunque un consiglio...
Chiedo scusa, non avevo notato che avevi già risposto...
Marcello
---
--
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.560 / Virus Database: 352 - Release Date: 08/01/2004

  char * pop(struct frase * f)
Per far si che una funzione modifichi un puntatore essa dovrà
necessariamente ricevere il suo indirizzo (un puntatore a puntatore).
void push (struct frase **f, char s[])
char *pop(struct frase **f)
Per evitare confusione ti consiglio di usare typedef "prima" dei prototipi:
-------------------------------------------------------------------------
Es.
/* INCLUDE e DEFINE */
struct frase
 {
   char *p;
   struct frase *next;
 };
typedef struct frase FRASE;
typedef FRASE *FRASEPTR; /* Invece di "struct frase **f" scriverai "FRASEPTR
*f". */
/* PROTOTIPI */
-------------------------------------------------------------------------
Se ci sono problemi facci sapere.
Buon lavoro.
