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

    [C++] Modifica ricorsiva dei campi di una struct

    Un saluto a tutti,
    sto continuando a studiare e sperimentare e questa mattina sono incappato in un dilemma: "la modifica ricorsiva dei dati".
    Cerco di spiegarmi meglio:

    Ipotizziamo di avere una struttura dati cosifatta:
    struct Prova {
    int id;
    int valore;
    int puntaId[50];
    };

    Un esempio del contenuto è questo:

    id=1
    valore=5;
    puntaId[0]=2
    puntaId[1]=5
    puntaId[2]=7

    id=2
    valore=10;
    puntaId[0]=1
    puntaId[1]=8
    puntaId[2]=9

    e cosi via....

    Vorrei fare una cosa del genere:

    Leggo l'id di ciascuna istanza e vedo a quale essa punta (puntaId).
    Nel primo caso punta a 2,5,7.
    A questo punto accedo alle istanze 2,5,7 per modificare il loro valore a 100.

    A questo punto però voglio modificare ricorsivamente le istanze a cui puntano rispettivamente 2,5,7, modificando il loro valore mettendolo alla metà di prima (quindi 50, in pratica ad ogni livello successivo di profondità, voglio dimezzare).
    Quindi andrò a visitare l'istanza con ID=2 e vedrò che punta a 1,8,9 ma l'1 non mi interessa perchè è l'ID padre, per questo andrò a modificare l'8 e il 9....e cosi via

    Per ottenere alla fine una cosa del genere.

    id=1
    valore=5;
    puntaId[0]=2
    puntaId[1]=5
    puntaId[2]=7

    id=2
    valore=100;
    puntaId[0]=1
    puntaId[1]=8
    puntaId[2]=9

    id=5
    valore=100
    puntaId[0]=2

    id=7
    valore=100
    puntaId[0]=1

    id=8
    valore=50
    puntaId[0]=2

    id=9
    valore=50
    puntaId[0]=10

    id=10
    valore=25
    puntaId[0]=1

    Lo so sembra una cosa pazza :berto:, ma avete qualche idea ?
    Grazie.

    P.S.
    spero di aver scritto correttamente l'oggetto.


  2. #2
    Utente di HTML.it L'avatar di frznn
    Registrato dal
    Apr 2008
    Messaggi
    108
    puntaID dovrebbe essere un vettore di puntatori non di interi...a meno che tu non abbia una struttura condivisa con le strutture...ma di solito sono cose da evitare
    poi la storia del padre è un po' ingarbugliata così, dovresti mettere una variabile nella struttura che indica se quell'istanza è già stata visitata

    per il resto la ricorsione viene naturale...

    funz(struct Prova* n) {

    if n->id != 1 //così mi sembra di aver capito
    per ogni figlio
    funz(n->puntaID[i])

    return;
    };

    un'alternativa per la storia del padre è passare come argomento l'id del padre...tipo:


    funz(struct Prova* n, int padre) {

    if n->id != 1//così mi sembra di aver capito
    per ogni figlio
    if n->puntaID[i] != padre
    funz(n->puntaID[i],n->id)

    return;
    };

    naturalmente sono solo bozze...cerca di essere più completo nella descrizione del problema
    *** Rock n' Roll ain't noise pollution ***

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.