Creazione lista di interi.

di il
6 risposte

Creazione lista di interi.

Salve a tutti. Sono nuovo del forum e questi sono i miei primi approcci in C,

Studiando informatica il professore mi ha richiesto la creazione di una lista di n elementi da decidere con un input da tastiera. Io ho scritto il codice ma al momento della compilazione (uso gcc da trerminale linuxMint) mi si presentano una serie di errori da fixare ma per quante ore io abbia perso nella ricerca della soluzione non sono riuscito a trovare niente. Sicché invoco il vostro aiuto

posto il codice intero e commentato. Per la teoria ho fatto riferimento ad una guida online http://www.html.it/pag/15419/gestione-di-una-lista-i

non ho trovato discussioni simili e mi sono permesso di aprirne una nuova. In caso mi sia sbagliato perdonatemi.
#include <stdio.h>
#include <malloc.h>

/* Creazione del tipo elemento */
struct elemento {
   int inf;
   struct elemento *pun;
}


/* prototipi delle funzioni */



struct elemento *crea_lista();  //Crea Lista
				//prima funzione adibita  al compito di 
				//CREARE la lista con dati in input da tastiera 




void visualizza_lista(struct elemento *);	//visualizza_lista 
						//seconda funzione. Restituisce VOID e 
						//prende in input la lista da stampare



/*main*/

int main()
{
   struct elemento *lista; // puntatore della lista
   lista = crea_lista(); // crea la lista
   visualizza_lista(lista); // stampa la lista
}


/*Definizione delle funzioni*/

struct elemento *crea_lista()
{
   struct elemento *p, *punt;   //i due puntatori scorrono la lista
   int i, n;			//i è l'indice del ciclo. 

   printf(“n Specificare il numero di elementi nella lista “);
   scanf(“%d”, & n);

   if(n==0) //caso lista vuota
   {
      p = NULL;

    } else {
      /* creazione primo elemento */

      p = (struct elemento *)malloc(sizeof(struct elemento)); //utilizzo di malloc() e sizeof per allocazione dinamica memoria
      printf(“nInserisci il primo valore: “);
      scanf(“%d”, & p->inf);
      punt = p;


      /* creazione elementi successivi */
      for(i=2; i<=n; i++)
      {
         punt->pun = (struct elemento *)malloc(sizeof(struct elemento));
         punt = punt->pun;
         printf(“nInserisci il %d elemento: “, i);
         scanf(“%d”, & punt->inf);
      } // chiudo il for
      punt->pun = NULL; // marcatore fine lista
   } // chiudo l’if-else
   return(p);
} // chiudo la funzione



void visualizza_lista(struct elemento *p)
{
   printf(“nlista —> “);

   /* ciclo di scansione */
   while(p != NULL)
   {
      printf(“%d”, p->inf); // visualizza l’informazione	
      printf(” —> “);
      p = p->pun; // scorre di un elemento
   }

   printf(“NULLnn”);
}

6 Risposte

  • Re: Creazione lista di interi.

    Ma che errore hai e in quale punto del codice? Malfunzionamenti? Tu cosa ne pensi?
  • Re: Creazione lista di interi.

    Le liste si differenziano dagli array proprio perchè non hanno una dimensione predefinita ma aumenta/diminuisce a seconda dell'utilizzo...mi sembra strano che ti abbia chiesto una lista di n elementi...un array di n elementi sarebbe più corretto da chiedere

    Detto questo potresti fare un ciclo for:
    struct lis *corr=lista;      //o come hai definito te la tua struct 
    for (i=0;i<n;i++){
    corr=malloc(sizeof(struct lis));
    cor=cor->next;
    }
    penso sia giusto ma inutile fare una cosa del genere...questo serve per allocare tutta la memoria necessaria per n elementi
  • Re: Creazione lista di interi.

    In realtà la richiesta è volutamente "sbagliata" dal professore. Utilizzare gli array sarebbe molto più facile ma credo che lui voglia vedere un'allocazione di memoria dinamica. Detto ciò il problema era una cavolata, semplicemente non riconosceva i caratteri delle virgolette nei printf.

    In compenso sto cercando di convertire il codice di modo che funzioni con caratteri di una data lunghezza. Funziona tutto bene solo che al momento della funzione visualizza_lista stampa solo il primo carattere.

    Idee?
    questa è la funzione:
    void visualizza_lista(struct elemento *p)
    {
       printf("\nlista: ");
    
       /* ciclo di scansione */
       while(p != NULL)
       {
          printf("%c", p->inf[100]); // visualizza l’informazione	
          printf(", ");
          p = p->pun; // scorre di un elemento
       }
    printf("\t\t\t\n\n\nFINE LISTA\n\n\n");
    }


    qui l'intero codice (magari ho sbagliato prima):
    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    
    /* Creazione del tipo elemento */
    struct elemento 
    
    {
       char inf[100];
       struct elemento *pun;
    }
    
    /* prototipi delle funzioni */
    
    ;
    
    struct elemento *crea_lista();  //Crea Lista
    				//prima funzione adibita  al compito di 
    				//CREARE la lista con dati in input da tastiera 
    
    
    
    
    void visualizza_lista(struct elemento *);	//visualizza_lista 
    						//seconda funzione. Restituisce VOID e 
    						//prende in input la lista da stampare
    
    
    
    /*main*/
    
    int main()
    {
       struct elemento *lista; // puntatore della lista
       lista = crea_lista(); // crea la lista
       visualizza_lista(lista); // stampa la lista
    }
    
    
    /*Definizione delle funzioni*/
    
    struct elemento *crea_lista()
    {
       struct elemento *p, *punt;   //i due puntatori scorrono la lista
       int i, n;			//i è l'indice del ciclo. 
    
       printf("\n\t\t\tSpecificare il numero\n\n\t\t\tdi elementi nella lista:\n\n\n\n\n");
       scanf("%d", & n);
    
       if(n==0) //caso lista vuota
       {
          p = NULL;
    
        } else {
          /* creazione primo elemento */
    
          p = (struct elemento *)malloc(sizeof(struct elemento)); //utilizzo di malloc e sizeof per allocazione dinamica memoria
          printf("Inserisci il primo valore:");
          scanf("%s", & p->inf[100]);
          punt = p;
    
    
          /* creazione elementi successivi */
          for(i=2; i<=n; i++)
          {
             punt->pun = (struct elemento *)malloc(sizeof(struct elemento));
             punt = punt->pun;
             printf("\nInserisci il %d elemento:", i);
             scanf("%s", & punt->inf[100]);
          } // chiudo il for
          punt->pun = NULL; // marcatore fine lista
       } // chiudo l’if-else
       return(p);
    } // chiudo la funzione
    
    
    
    void visualizza_lista(struct elemento *p)
    {
       printf("\nlista: ");
    
       /* ciclo di scansione */
       while(p != NULL)
       {
          printf("%c", p->inf[100]); // visualizza l’informazione	
          printf(", ");
          p = p->pun; // scorre di un elemento
       }
    printf("\t\t\t\n\n\nFINE LISTA\n\n\n");
    }
  • Re: Creazione lista di interi.

    L'errore puo' essere che nel printf devi usare %s (che stampa una stringa di caratteri) e non %c (che stampa solo un carattere)
  • Re: Creazione lista di interi.

    In effetti era %s ma se lo compilo mi dice:

    lista1.c:89:7: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
    printf("\t\t\t\t\t%s", p->inf[100]);
  • Re: Creazione lista di interi.

    Salti un posto quando crei la lista praticamente quando allochi la memoria del nuovo puntatore subito dopo devi inserire la stringa e dopo incrementi il puntatore a quello dopo...non so se mi sono spiegato ahahah
Devi accedere o registrarti per scrivere nel forum
6 risposte