Newsgroup: it.comp.lang.c
Titolo: Struct

Sono qui per avere un guida.
Ho la seguente struttura
struct elelista {
   int cols;
   int rows;
   char tipo;
   char nome[3];
   int n_ele;
   double *matr;
   struct elelista *next;
};
Vorrei fare in modo di eliminare un elemento della struttura. Ma non so'
come fare.
Qualcuno potrebbe darmi qualche dritta?

 Qualcuno potrebbe darmi qualche dritta?
La tua domanda è campata in aria. Dove si trova questo elemento? Cosa
intendi per elemento? Un elemento di un array? Un elemento di una lista?
--- bye

Utilizzo questa funzione per aggiungere elementi nella lista
struct elelista * aggEleTesta( struct elelista * lista, int r, int c, char
tipo, char * nome ) {
   struct elelista *tmp=NULL;
   int rr,cc;
   tmp = (struct elelista *)malloc(sizeof(struct elelista));
   if (tmp) {
      tmp->matr = NULL;
      tmp->matr = (double *)malloc(c*r*sizeof(double));
      if (tmp->matr) {
         for(cc=0;cc<c*r;cc++)
               tmp->matr[cc]=0;
         tmp->cols=r;
         tmp->rows=c;
         tmp->tipo=tipo;
         strcpy(tmp->nome,nome);
         tmp->next= lista;
         return tmp;
      }
   }
   return lista;
}
 ti e' di aiuto?

> Utilizzo questa funzione per aggiungere elementi nella lista
Vedi che quindi la tua frase era sbagliata? La domanda giusta era: come
faccio ad eliminare un elemento di una lista concatenata?
void Elimina(struct elelista *prec, struct elelista *el)
{
    prec->next = el->next;
    free(el->matr);
    free(el);
}
Dove prec č l'elemento della lista che precede il tuo elemento, ed el č
l'elemento da eliminare.
--- bye

 wrote in message
news:DKvdc.33474$hc5.1...@news3.tin.it...


La funzione
void mat_canc(struct elelista *lista) {
   struct elelista * tmp = lista;
   if( lista ) {
      while ( tmp != NULL ) {
         lista=tmp;
         if( lista->next != NULL) {
            tmp=lista->next;
            free(lista->matr);
         }
         else tmp=NULL;
         free(lista);
      }
   }
   lista = NULL;
}

Certo se tu dicessi cosa dovrebbe fare questo accrocchio... A occhio e croce
dovrebbe eliminare TUTTI gli elementi della lista concatenata.

Prova cosě:
void mat_canc(struct elelista *lista) {
    struct elelista *tmp;
    while (lista != NULL) {
        tmp=lista->next;
        free(lista->matr);
        free(lista);
        lista = tmp;
    }
}
Occhio che perň c'č un problema: questa funzione NON PUO' mettere null nel
puntatore al primo elemento (lo devi fare esternamente)
--- bye

 wrote in message
news:wMxdc.34176$hc5.1...@news3.tin.it...


> Stesso, errore. Qualche idea
Non è che da qualche parte ti sei salvato qualche puntatore e lo stai usando
dopo averlo liberato?
--- bye

void mat_canc(struct elelista *lista) {
   struct elelista *tmp;
   while (lista != NULL) {
      tmp=lista->next;
      lista->next=NULL;
//    free(lista->matr);
      free(lista);
      lista = tmp;
      if( lista ) printf("OK %s\n",lista->nome);
   }
   lista=NULL;
}
Se tolgo il commento ho l'errore Segmentation fault al secondo ciclo. Sai
perche'?

 dopo averlo liberato?
Bella domanda
l'unica cosa che posso fare e' postare le funzioni che uso
struct elelista {
   int cols;
   int rows;
   char tipo;
   char nome[3];
   double *matr;
   struct elelista *next;
};
struct elelista * aggEleTesta( struct elelista * lista, int r, int c, char
tipo, char * nome ) {
   struct elelista *tmp=NULL;
   int rr,cc;
   tmp = (struct elelista *)malloc(sizeof(struct elelista));
   if (tmp) {
      tmp->matr = NULL;
      tmp->matr = (double *)malloc(c*r*sizeof(double));
      if (tmp->matr) {
         for(cc=0;cc<c*r;cc++)
               tmp->matr[cc]=0;
         tmp->cols=r;
         tmp->rows=c;
         tmp->tipo=tipo;
         strcpy(tmp->nome,nome);
         tmp->next= lista;
         return tmp;
      }
   }
   return lista;
}
void mat_load(struct elelista *lista,int r, int c, double valore, char *
nome) {
   struct elelista *tmp=NULL;
   tmp=cerca(lista,nome);
   if( tmp )
      if( tmp->cols >= r && tmp->rows >= c )
         tmp->matr[(--r)+((--c)*tmp->cols)]=valore;
      else printf("Error %d %d %d %d\n", tmp->cols, tmp->rows,r,c);
}
int mat_show(struct elelista *lista) {
struct elelista * tmp = lista;
int r,c;
   if( lista) {
      printf("\n ----> Matrices: <----\n");
      while ( tmp != NULL) {
         printf("\nMatrix %s dimension %d x
%d\n",tmp->nome,tmp->rows,tmp->cols);
         for(c=0;c<tmp->rows;c++) {
            for(r=0;r<tmp->cols;r++)
                 printf("%4.3g   ",tmp->matr[r+(c*tmp->cols)]);
            printf("\n");
         }
         tmp=tmp->next;
      }
   }
}

 wrote in message
news:vvydc.34400$hc5.1...@news3.tin.it...
