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

    [c] Problema lista collegata con puntatori

    In un esercizio viene data una lista di numeri interi collegata con puntatori e un numero intero A. Io devo scrivere una funzione che, senza allocare e deallocare memoria, mi crei una nuova lista contenente i multipli di A che appartenevano alla lista originaria, mantenendo l'ordine in cui si presentavano. In più questa funzione deve restituire il puntatore alla testa della nuova lista.
    Ho provato così ma non funge (io l'ho fatta void per semplificarmi le cose e non sapevo dove infilare il return, ma è un problema minore mi sembra):

    //la lista è così:

    struct list {

    int value;

    struct list * next_ptr;
    };

    //la mia funzione sbagliata:

    void newlist( struct list **ptrptr, int A, struct list ** dst_ptr) {

    struct list *tmp;

    while ( *ptrptr != NULL ) {

    if( (*ptrptr)->value % A == 0) {

    tmp = *ptrptr;

    while (*dst_ptr != NULL) {

    *dst_ptr = (*dst_ptr)->next_ptr;
    }

    dst_ptr = &tmp;

    ptrptr = &(*ptrptr)->next_ptr;

    }

    else

    *ptrptr = (*ptrptr)->next_ptr;
    }

    }

    Qualche consiglio??? GRAZIE

  2. #2
    Se possibile posta il codice intero e come dice il Regolamento al punto nº 6 usa i TAG CODE.

  3. #3

    sorry!

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define TRUE 1
    #define FALSE 0
    
    typedef int Boolean;
    
    
    struct list {
        int value;
        struct list * next_ptr;
    };
    
    void init( struct list ** ptrptr );
    void visit( struct list * ptr );
    void pre_insert( struct list ** ptrptr, int value );
    
    void newlist(struct list **ptr, int A, struct list **dst_ptr);
    
    main()
    {
      Boolean itera = TRUE;  
        
      int value;
      int scelta;
      struct list * ptr, * dst_ptr;
      int A;
    
        // inizializzazione della lista
        init( &ptr );
        init ( &dst_ptr);
            
        
       do {
            // menù di scelta
            printf( "\nScegli operazione:\n" );
            printf( "1. inserisci un elemento nella lista 1\n" );
            printf( "2. crea la lista dei multipli di A, rimuovendoli dalla lista 1\n");
            printf( "3. visita la lista 1\n");
            printf( "4. visita la lista dei multipli di A\n");
            printf( "0. esci\n" );
            
            // legge la scelta
            scanf( "%d", &scelta );
            
            // pulisce lo schermo
            system("cls");
            
            // chiamata delle funzioni sulla lista
            switch ( scelta ) {
                   case 1: // inserimento lista 1 
                           printf( "\ninserisci valore: " );
                           scanf( "%d", &value );
                           // funzione di inserimento prefisso nella lista
                           pre_insert( &ptr, value);
                           break;
                   case 2: // crea lista degli elementi divisibili per A, rimuovendoli dalla lista principale
                           printf( "\ninserisci il divisore: ");
                           scanf( "%d", &A);
                           newlist( &ptr, A, &dst_ptr);
                           break;
                   case 3: // visita la lista 1
                           printf( "\n\nlista 1: " );
                           visit( ptr );
                           break;
                   case 4: // visita la lista dei multipli di A
                           printf( "\n\nlista multipli di A: " );
                           visit( dst_ptr );
                           break;       
                     
                   case 0: itera = FALSE;
                           break;
                   default: // in ogni altro caso ripresenta il menù
                           printf( "\nscelta errata!" );
                           break;  
            }
        } while ( itera );
      
        
      
      system("PAUSE");	
      return 0;
    }
    
    void newlist( struct list **ptrptr, int A, struct list ** dst_ptr) {
        
        struct list *tmp;
        
        while ( *ptrptr != NULL ) {
            
            if( (*ptrptr)->value % A == 0) {
                
                tmp = *ptrptr;
                     
                     while (*dst_ptr != NULL) {
                         
                          *dst_ptr = (*dst_ptr)->next_ptr;
                          }
                          
                          *dst_ptr = tmp;
                          
                          ptrptr = &(*ptrptr)->next_ptr;
                          
                         } 
                    
             else
                
                 *ptrptr = (*ptrptr)->next_ptr;
             }
            
         }                                                                                       
                                                 
                    
    
    void init( struct list ** ptrptr ) 
    /* inizializzazione
    */
    {
        *ptrptr = NULL;
    }
    
    void visit( struct list * ptr ) 
    /* visita della lista
    */
    {
        while ( ptr != NULL ) {
              printf( "%d ", ptr->value );
              ptr = ptr->next_ptr;
        }
    }
    
    
    void pre_insert( struct list ** ptrptr, int value ) 
    /* inserisce in testa
    */
    {
        struct list * tmp_ptr;
        
        tmp_ptr = *ptrptr;
        *ptrptr = (struct list *) malloc( sizeof(struct list));
        (*ptrptr)->value = value;
        (*ptrptr)->next_ptr = tmp_ptr;
    }

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.