Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C]Chiarimenti typedef nelle liste

    Raga mi sapete dire gli errori presenti nelle funzioni inseriscitesta e inseriscicoda? Vorrei imparare ad utilizzare il typedef (prima questo programma l'avevo scritto con i puntatori e funzionava alla perfezione) ma mi sfugge qualcosa... grazie in anticipo.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef struct numeri *nodo;
    struct numeri{
           int elemento;
           nodo succ;
           };
    
    void inseriscitesta(nodo il);
    void stampalista (nodo il); 
    void inseriscicoda(nodo il); 
    void distruggilista(nodo il);
    void ricerca(nodo il, int z);
    void cancellanodo(nodo il, int l);
    void inserimentoordinato(nodo il);
         
    int main(int argc, char *argv[])
    {
      int y;
      nodo il=NULL;
      il= malloc (sizeof (struct numeri));
      il->succ=NULL;
      printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
      scanf ("%d", &y);
      if (y==1)
      {printf ("Inserisci il nuemero:\n");
      scanf ("%d", &il->elemento);}
       
         inseriscitesta(il);
         stampalista (il);
         distruggilista (il);
         
         inserimentoordinato(il);
         stampalista(il);
         distruggilista (il);
         inseriscicoda (il);
         stampalista (il);
         
         int l;
         printf ("Inserisci il numero da cancellare\n");
         scanf ("%d", &l);
         cancellanodo (il, l);
         stampalista (il);
         inseriscicoda (il);
             
         int z;
         printf ("Inserisci il numero da cercare\n");
         scanf ("%d", &z);
         ricerca (il, z);
         
         
      
      system("PAUSE");	
      return 0;
    }
    
    void inseriscitesta(nodo il){
         int y;
         printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
         scanf ("%d",&y);
         while (y==1)
         {
         
         nodo p2 = NULL;
         p2= malloc (sizeof(struct numeri));
         p2->succ=NULL;
         printf ("Digita il numero da inserire:\n");
         scanf ("%d", &p2->elemento);
         p2->succ = il;
         il = p2;
         printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
         scanf ("%d",&y);}}
    
    void stampalista (nodo il){
         while ( il!=NULL)
      {
        printf ("%d ---->", il->elemento);
        il=il->succ;}}
        
    void inseriscicoda(nodo il){
         int m;
         printf ("\nDigita 1 per inserire un numero, altrimenti digita 0\n");
         scanf ("%d",&m);
         while (m==1)
         {
         if (il==NULL){
         nodo p2 = NULL;
         p2= malloc (sizeof(struct numeri));
         p2->succ=NULL;
         printf ("Digita il numero da inserire:\n");
         scanf ("%d", &p2->elemento);
         p2->succ = il;
         il = p2;}
               else
               {
                     nodo tm= il;
                     while (tm->succ!=NULL)
                           tm = tm->succ;
                           
                   nodo nuovo= malloc(sizeof(struct numeri));
                   printf("Digita il numero\n");
                   scanf("%d", &nuovo->elemento);
                   nuovo->succ=NULL;
                   tm->succ=nuovo;}
                   printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
         scanf ("%d",&m);}}
         
    void distruggilista(nodo il){
         nodo tmp = NULL;
         while (il != NULL)
         {
               tmp= il->succ;
               free (il);
               il=tmp;}}
                
    void ricerca (nodo il, int z){
          while (il != NULL && z!=il->elemento)
          il=il->succ;
          
          if (il->elemento==z)
          printf ("Il numero e' stato trovato\n");
          else printf ("Il numero non e' stato trovato\n");} 
           
    void cancellanodo (nodo il, int l){
         nodo nodoprecedente;
         nodo nodocorrente;
         nodo nodotemporaneo;
         
         if (il->elemento == l){
                         nodotemporaneo = il;
                         il = il->succ;
                         free (nodotemporaneo);}
         else{
              nodoprecedente = NULL;
              nodocorrente = il;
              while(nodocorrente != NULL && nodocorrente->elemento != l){
                                 nodoprecedente = nodocorrente;
                                 nodocorrente = nodocorrente->succ;}
         
         if (nodocorrente != NULL) {
                          nodotemporaneo = nodocorrente;
                          nodoprecedente->succ = nodocorrente->succ;
                          free (nodotemporaneo);
                          }}}                       
    
    void inserimentoordinato (nodo il){
        nodo nodoprecedente;
        nodo nodocorrente;
        nodo nuovonodo;
        int h;
        printf ("Digita 1 per inserire un numero o 0 per terminare\n");
        scanf ("%d", &h);
        while (h==1){
              int u;
              nuovonodo = malloc(sizeof(struct numeri));
              printf ("Digita il numero da inserire\n");
              scanf ("%d",&u);
              nuovonodo->elemento=u;
              
              nodoprecedente=NULL;
              nodocorrente=il;
              
              while(nodocorrente!=NULL && u > nodocorrente->elemento){
                                       nodoprecedente=nodocorrente;
                                       nodocorrente=nodocorrente->succ;}
              
              if (nodoprecedente == NULL){
                                 nuovonodo->succ = il;
                                 il=nuovonodo;}
              else {
                   nodoprecedente->succ=nuovonodo;
                   nuovonodo->succ=nodocorrente;}
              printf ("Digita 1 per inserire un numero o 0 per terminare\n");
              scanf ("%d", &h);}}

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    secondo me manca il cast nelle malloc()

    (struct numeri*)malloc(sizeof(struct numeri));

    se ti da problemi cosi , prova a restituire con return il puntatore dalle funzioni .
    Tecnologia

  3. #3
    Il problema è che, per esempio, nella funzione inserisciintesta non mi memorizza i valori ad eccezione del primo e in quella inseriscicoda mi memorizza solo i primi tre valori

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Con i puntatori non è che me la cavi bene

    per l'inserimento in testa a una lista , mi dava i tuoi stessi problemi , assegnando al puntatore
    passato per argomento , il nuovo nodo della lista , non me lo restituiva nel main , non so il perchè

    ma io ho risolto restituendolo con un return , e funziona !

    il perchè da problemi occorre che qualche esperto si faccia sentire , aspettiamo in dure

    il typedef non ti da problemi , provato e funziona .


    codice:
      nodo inseriscicoda(nodo il){
         int m;
         printf ("\nDigita 1 per inserire un numero, altrimenti digita 0\n");
         scanf ("%d",&m);
         while (m==1)
         {
         if (il==NULL){
         nodo p2 = NULL;
         p2= malloc (sizeof(struct numeri));
         p2->succ=NULL;
         printf ("Digita il numero da inserire:\n");
         scanf ("%d", &p2->elemento);
         p2->succ = il;
         il = p2;}
               else
               {
                     nodo tm= il;
                     while (tm->succ!=NULL)
                           tm = tm->succ;
                           
                   nodo nuovo= malloc(sizeof(struct numeri));
                   printf("Digita il numero\n");
                   scanf("%d", &nuovo->elemento);
                   nuovo->succ=NULL;
                   tm->succ=nuovo;}
                   printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
         scanf ("%d",&m);}
         
         return il;
         }
    
    
    
      nodo inseriscitesta(nodo il){
         int y;
         printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
         scanf ("%d",&y);
         while (y==1)
         {
         
         nodo p2 = NULL;
         p2= malloc (sizeof(struct numeri));
         p2->succ=NULL;
         printf ("Digita il numero da inserire:\n");
         scanf ("%d", &p2->elemento);
         p2->succ = il;
         il = p2;
         printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
         scanf ("%d",&y);}
         return il;
         }
    
    
       int main(int argc, char *argv[])
    {
      int y;
      nodo il=NULL;
      il= malloc (sizeof (struct numeri));
      il->succ=NULL;
      printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
      scanf ("%d", &y);
      if (y==1)
      {printf ("Inserisci il nuemero:\n");
      scanf ("%d", &il->elemento);}
       
         il=inseriscitesta(il);
         stampalista (il);
         il=inseriscicoda(il);
         stampalista (il);
    Tecnologia

  5. #5
    Risolto tutto, mancavano dei puntatori, maledetti quanto li odio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.