concatenazione in C

Collapse
X
 
  • Filter
  • Ora
  • Show
Clear All
new posts
  • NL84
    Bodyweb Member
    • Jan 2002
    • 992
    • 2
    • 0
    • monte olimpo
    • Send PM

    concatenazione in C

    Salve ragazzi,
    sto programmando un pochino in C e devo concatenare alcuni oggetti. Il problema è che non so a priori quanti oggetti dovrò concatenare e quindi ho usato, nella mia ignoranza, una lista...ho visto, però, che in termini di efficienza (ripstto ad un altro porgramma) ci perdo. Sapete se c'è un modo più intelligente/efficiente per concatenare oggetti (nel mio caso o int o double)? Questo è il codice che uso per creare, riempire, visualizzare la lista

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>

    /* elemento della lista */
    struct elemento{
    int x;
    struct elemento *next;
    };

    void ins_lista(int n, struct elemento **lista);
    void stampa_lista(struct elemento *lista);
    void svuota(struct elemento **lista);

    #if 1
    int main(){
    struct elemento *lista=NULL; //puntatore nullo ad una lista
    int i,p;
    for(i=0;i<VAL;i++){
    printf("inserisci un numero: ");
    scanf("%d",&p);
    /* funzione di inserimento (si possono
    scegliere 3 tipi di inserimento) */
    ins_lista(p,&lista);
    }
    stampa_lista(lista);
    // svuota(&lista);
    // stampa_lista(lista);
    }
    #endif

    void stampa_lista(struct elemento *lista){
    struct elemento *tmp;
    int i=0;
    tmp=lista;
    while(tmp){ /* equivale a scrivere while(tmp!=NULL) */
    printf("elemento: %d\n",tmp->x);
    tmp=tmp->next;
    i++;
    }
    printf("in questa lista ci sono %d elementi\n",i);
    }

    /* funzione che cancella tutti gli elementi della lista */
    void svuota(struct elemento **lista){
    struct elemento *tmp;
    if(*lista==NULL)
    return;
    else{
    tmp=*lista;
    *lista=(*lista)->next;
    free(tmp);
    svuota(&(*lista));
    /* funzione ricorsiva che richiama se stessa ma con
    l’indirizzo del puntatore successivo */
    }
    }

    void ins_lista(int n, struct elemento **lista){
    struct elemento *new;
    if(*lista==NULL){
    //controllo per verificare se la lista e’ vuota
    new=(struct elemento *)malloc(sizeof(struct elemento));
    new->x=n;
    new->next=NULL;
    *lista=new;
    }
    else
    ins_lista(n, &(*lista)->next);
    /* viene richiamata la funzione ricorsivamente fino a quando non
    si raggiunge la fine della lista */
    }
    To failure
    sigpic

    Diario
    http://www.bodyweb.com/forums/blogs-...ml#post5990915

  • 600
    been there, done that
    • Mar 2009
    • 3861
    • 329
    • 239
    • Quel paese
    • Send PM

    #2
    Scusa ma con "concatenare" cosa intendi?

    Se il tuo scopo è quello generico di "collezionare" elementi allora esistono moltissime strutture dati e devi trovare quella che fa al caso tuo. Tutto dipende ovviamente dall'utilizzo che vuoi farne...
    Always the beautiful answer who asks a more beautiful question

    Commenta

    • NL84
      Bodyweb Member
      • Jan 2002
      • 992
      • 2
      • 0
      • monte olimpo
      • Send PM

      #3
      Originariamente Scritto da 600 Visualizza Messaggio
      Scusa ma con "concatenare" cosa intendi?

      Se il tuo scopo è quello generico di "collezionare" elementi allora esistono moltissime strutture dati e devi trovare quella che fa al caso tuo. Tutto dipende ovviamente dall'utilizzo che vuoi farne...
      voglio mettere uno dopo l'altro una serie di numeri, ma non so a priori quanti saranno.

      struct dati{
      double data[2];
      }
      potrebbe andare, solo che nel codice dovrei dichiarare
      struct dati prova[10], ma non so a prescindere se dovrò "infilare" 10 coppie di numeri
      To failure
      sigpic

      Diario
      http://www.bodyweb.com/forums/blogs-...ml#post5990915

      Commenta

      • 600
        been there, done that
        • Mar 2009
        • 3861
        • 329
        • 239
        • Quel paese
        • Send PM

        #4
        Originariamente Scritto da NL84 Visualizza Messaggio
        voglio mettere uno dopo l'altro una serie di numeri, ma non so a priori quanti saranno.

        struct dati{
        double data[2];
        }
        potrebbe andare, solo che nel codice dovrei dichiarare
        struct dati prova[10], ma non so a prescindere se dovrò "infilare" 10 coppie di numeri
        Scusa, non conosco la tua preparazione in materia e magari ti dico delle banalità.

        Se tu hai una conoscenza specifica di quello che ti serve davvero (un insieme o un multiinsieme, dati ordinati secondo una loro "chiave" o dati conservati nell'ordine di arrivo, ecc...) e del mondo in cui intendi poi usarli (aggiornamenti frequenti o rari, accesso ai dati sequenziale o randomico, dati conservati in maniera primaria o secondaria, ecc) puoi usare delle strutture dati adatte.

        Se hai deciso di utilizzare una struttura elementare come la lista concatenata (che è quello che hai implementato) senza avere fatto l'analisi descritta sopra, è probabile che il tuo programma abbia una bassa efficienza in maniera indipendente dalla qualità della tua implementazione (a meno di errori macroscopici...).

        Ricapitolando, se te vuoi fare un semplice esercizio di programmazione ed implementarti una successione di elementi il massimo che puoi fare è provare ad ottimizzare il tuo codice, se invece stai cercando di scrivere questo codice come pezzo di qualche altra applicazione (così mi pare di aver capito) è meglio che guardi il problema da un'altra prospettiva.
        Always the beautiful answer who asks a more beautiful question

        Commenta

        • NL84
          Bodyweb Member
          • Jan 2002
          • 992
          • 2
          • 0
          • monte olimpo
          • Send PM

          #5
          Originariamente Scritto da 600 Visualizza Messaggio
          Scusa, non conosco la tua preparazione in materia e magari ti dico delle banalità.

          Se tu hai una conoscenza specifica di quello che ti serve davvero (un insieme o un multiinsieme, dati ordinati secondo una loro "chiave" o dati conservati nell'ordine di arrivo, ecc...) e del mondo in cui intendi poi usarli (aggiornamenti frequenti o rari, accesso ai dati sequenziale o randomico, dati conservati in maniera primaria o secondaria, ecc) puoi usare delle strutture dati adatte.

          Se hai deciso di utilizzare una struttura elementare come la lista concatenata (che è quello che hai implementato) senza avere fatto l'analisi descritta sopra, è probabile che il tuo programma abbia una bassa efficienza in maniera indipendente dalla qualità della tua implementazione (a meno di errori macroscopici...).

          Ricapitolando, se te vuoi fare un semplice esercizio di programmazione ed implementarti una successione di elementi il massimo che puoi fare è provare ad ottimizzare il tuo codice, se invece stai cercando di scrivere questo codice come pezzo di qualche altra applicazione (così mi pare di aver capito) è meglio che guardi il problema da un'altra prospettiva.
          Tranquillo, sono uno statistico alla ricerca della velocità :-)
          Quello che vorrei fare sono delle funzioni che posso usare in C che rispecchino quel che facevo nel programma statistico R. Per esempio: voglio leggere dati da un file di testo e non so quanti elementi ci sono, so solo che è un lungo vettore. Per leggere posso usare semplici implementazioni come

          #define leggo "prova.txt"
          FILE *leggoilfile;
          leggoilfile = fopen(leggo,"r");
          char c[10];
          while (!feof(leggoilfile)){
          while (fgets(c, 5, leggoilfile)!=NULL){
          }}

          però, se ora quei dati li volessi memorizzare in una variabile, capisci che è un problema dato che non so a priori quanto è lungo il vettore. Per caso, senza che ti tedio oltremodo, conosci qualche guida pdf "piccante" sulle strutture/liste ecc in C?
          To failure
          sigpic

          Diario
          http://www.bodyweb.com/forums/blogs-...ml#post5990915

          Commenta

          • 600
            been there, done that
            • Mar 2009
            • 3861
            • 329
            • 239
            • Quel paese
            • Send PM

            #6
            Mmm no mi spiace...Ma con un codice così piccolo è difficile aumentare di molto l'efficienza.
            Il massimo che mi sento di consigliarti è di convertire tutte le funzioni da ricorsive a iterative ma anche così i guadagni sono sicuramente minimi...
            Always the beautiful answer who asks a more beautiful question

            Commenta

            • NL84
              Bodyweb Member
              • Jan 2002
              • 992
              • 2
              • 0
              • monte olimpo
              • Send PM

              #7
              Originariamente Scritto da 600 Visualizza Messaggio
              Mmm no mi spiace...Ma con un codice così piccolo è difficile aumentare di molto l'efficienza.
              Il massimo che mi sento di consigliarti è di convertire tutte le funzioni da ricorsive a iterative ma anche così i guadagni sono sicuramente minimi...
              dai tranquillo! grazie mille. ti chiedo solo un'altra cosa (poi basta): se non ho mal capito il funzionamento della lista (quindi il primo codice postato) posso fare una lista in cui gli elementi non siano degli int, ma più in generale delle strutture? se così fosse, poi voglio vedermi a fare il puntaore che punti all'elemento successivo
              To failure
              sigpic

              Diario
              http://www.bodyweb.com/forums/blogs-...ml#post5990915

              Commenta

              • 600
                been there, done that
                • Mar 2009
                • 3861
                • 329
                • 239
                • Quel paese
                • Send PM

                #8
                Originariamente Scritto da NL84 Visualizza Messaggio
                dai tranquillo! grazie mille. ti chiedo solo un'altra cosa (poi basta): se non ho mal capito il funzionamento della lista (quindi il primo codice postato) posso fare una lista in cui gli elementi non siano degli int, ma più in generale delle strutture? se così fosse, poi voglio vedermi a fare il puntaore che punti all'elemento successivo
                Beh si certo.
                Tu hai usato (impropriamente) il nome "elemento" per la struct di quello che è in realtà un nodo della lista, e non un elemento (che sarebbe invece, nel caso precedente, il semplice valore intero x all'interno del nodo).

                Se ora vuoi cambiare il tuo codice per renderlo in grado di ospitare un qualsiasi tipo di struttura il codice del nodo diventa qualcosa di simile a:

                struct elemento{
                struct miaStruct val;
                struct elemento *next;
                };

                dove ovviamente la struttura miaStruct te la sei definita te.

                Spero di esser stato chiaro..
                Always the beautiful answer who asks a more beautiful question

                Commenta

                • NL84
                  Bodyweb Member
                  • Jan 2002
                  • 992
                  • 2
                  • 0
                  • monte olimpo
                  • Send PM

                  #9
                  Originariamente Scritto da 600 Visualizza Messaggio
                  Beh si certo.
                  Tu hai usato (impropriamente) il nome "elemento" per la struct di quello che è in realtà un nodo della lista, e non un elemento (che sarebbe invece, nel caso precedente, il semplice valore intero x all'interno del nodo).

                  Se ora vuoi cambiare il tuo codice per renderlo in grado di ospitare un qualsiasi tipo di struttura il codice del nodo diventa qualcosa di simile a:

                  struct elemento{
                  struct miaStruct val;
                  struct elemento *next;
                  };

                  dove ovviamente la struttura miaStruct te la sei definita te.

                  Spero di esser stato chiaro..
                  ok, grazie mille...ora potrò sbizzarrirmi un bel po'!
                  To failure
                  sigpic

                  Diario
                  http://www.bodyweb.com/forums/blogs-...ml#post5990915

                  Commenta

                  Working...
                  X