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

    [C] Funzione di una lista con sottolista

    Salve,
    devo programmare una funzione avente una lista principale collegata con puntatori che in ingresso riceve valori in ordine crescente secondo il campo code, stampare la lista principale fino ad avere code==class (se a fine scansione la condizione non è soddisfatta restituisce FALSE).
    Se la condizione è soddisfatta devo inserire un valore target in coda alla sottolista che soddisfa la condizione (restituendo TRUE).

    Mi sono applicato e tutto procede bene finchè non inserisco il valore class per confrontarlo con code, in quel momento la funzione si ferma.
    Mi scuso se effettivamente è un po' disordinato.
    Sulla riga "case 4" mi viene segnalato un warning "argomento di sub_visit passa da un tipo di puntatore incompatibile" che non riesco a correggere.
    Ringrazio per l'aiuto (ne ho tanto bisogno).

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    typedef unsigned short int boolean;
    #define FALSE 0
    #define TRUE 1
    
    
    struct list{
        int code;
        struct sublist * sub_ptr;
        struct list * next_ptr;
    };
    
    
    struct sublist{
        float value;
        struct sublist * next_ptr;
    };
    
    
    void init(struct list **ptr);
    boolean ord_insert(struct list **ptr, int code);
    void visit(struct list *ptr);
    boolean pre_insert(struct list **ptr, int code);
    boolean search(struct list **ptr, int class, float target);
    boolean suf_insert_sub(struct sublist **ptr, float value);
    boolean pre_insert_sub(struct sublist **ptr, float value);
    void sub_init(struct list **ptr);
    void sub_visit(struct sublist *ptr);
    
    
    
    
    int main(){
    
    
        int digit, code, class;
        float target;
        struct list *ptr=NULL;
        init (&ptr);
        digit=0;
    
    
        do{
        printf("\n 1)Inserisci valore nella lista principale\n 2)Scandisci lista principale");
        printf("\n 3)Inserisci elemento nella sottolista di un valore gia' esistente ");
        printf("\n 4)Scandisci sottolista \n\n");
        scanf("%d", &digit);
        switch (digit){
        case 1:printf("\n Digita il valore: ");
               scanf("%d",&code);
               ord_insert(&ptr, code);
               printf("\n Valore -->%d inserito \n", code);
               break;
        case 2:visit(ptr);
               break;
        case 3:printf("\n Scegli un valore dalla lista principale: ");
               scanf("%d", &class);
               search(&ptr, class, target);
               printf("\n Inserire elemento destinato alla sottolista: ");
               scanf("%f", &target);
               break;
        case 4:sub_visit(ptr);  
               break;
        default:printf("\n Comando digitato non valido");
        }
        }
        while(digit!=0);
        system("PAUSE");
        return 0;
    } //chiude main
    
    
    void init(struct list **ptr){
        *ptr=NULL;
    }
    
    
    boolean pre_insert(struct list **ptr, int code){
        struct list *tmp_ptr;
        tmp_ptr=*ptr;
        (*ptr)=(struct list*)malloc(sizeof(struct list));
        (*ptr)->code=code;
        (*ptr)->next_ptr=tmp_ptr;
        return TRUE;
    }
    
    
    boolean ord_insert(struct list **ptr, int code){
            while(((*ptr)!=NULL) && (*ptr)->code<code)
            ptr=&((*ptr)->next_ptr);
            return pre_insert(ptr,code);
    }
    
    
    void visit(struct list *ptr){
        if(ptr!=NULL){
            printf("\n");
            while(ptr!=NULL){
                printf("-->%d", ptr->code);
                ptr=ptr->next_ptr;
            }
            printf("\n");
        }
        else{
            printf("\n La lista e' vuota\n");
        }
    }
    
    
    boolean search(struct list **ptr, int class, float target){
        if(ptr!=NULL){
            boolean found = FALSE;
            while(*ptr!=NULL && found==FALSE){
                if((*ptr)->code==class){
                    suf_insert_sub((&(*ptr)->sub_ptr), target);
                }
                else{
                ptr=&((*ptr)->next_ptr);
                }
                    sub_visit((*ptr)->sub_ptr);
            }
        }
        return FALSE;
    }
    
    
    void sub_init(struct list **ptr){
        (*ptr)->sub_ptr=NULL;
    }
    
    
    boolean suf_insert_sub(struct sublist **ptr, float target){
        while(*ptr!=NULL){
            ptr=&((*ptr)->next_ptr);
        }
        return pre_insert_sub(ptr, target);
    }
    
    
    boolean pre_insert_sub(struct sublist **ptr, float target){
        struct sublist *tmp;
        tmp=*ptr;
        (*ptr)=(struct sublist*)malloc(sizeof(struct sublist));
        (*ptr)->value=target;
        (*ptr)->next_ptr=tmp;
        return TRUE;
    }
    
    
    void sub_visit(struct sublist *ptr){
        if(ptr!=NULL){
            while(ptr!=NULL){
                printf("Valore inserito: %f",(ptr)->value);
                ptr=ptr->next_ptr;
            }
        }
        else{
            printf("La lista è vuota");
        }
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sulla riga "case 4" mi viene segnalato un warning "argomento di sub_visit passa da un tipo di puntatore incompatibile" che non riesco a correggere.
    La sub_visit, come hai scritto in

    void sub_visit(struct sublist *ptr);

    prevede un puntatore ad una "struct sublist" ma tu passi ptr che è un puntatore ad una "struct list" e questo è il motivo del warning.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Hai ragione, grazie!
    Provvedo alla correzione

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.