PROBLEMA Alberi Di Grado Arbitario C

Fab996

Utente Attivo
177
5
Devo realizzare un metodo int contaric(Bntree T, int x), che dato un albero di grado arbitrario T e un intero x conta quanti nodi in T hanno esattamente x figli (diretti discendenti).
Io avevo pensato che dato che ogni figlio è collegato al proprio fratello, di creare una lista per ogni figlio quindi poi contare il numero di elementi che conteneva la lista, però ho un problema quando vado a compilare...

Ecco quello che sono riuscito ad implementare

File header:
Codice:
#ifndef GENEALOGIA_H
#define GENEALOGIA_H

typedef char stringa[20];

typedef struct elem3 {
    stringa info;
    struct elem3* next;
} elist;

typedef struct elem2 {
    stringa info;
    struct elem2* primofiglio;
    struct elem2* fratello;
} nodo_alberoN;

typedef nodo_alberoN* Bntree;
typedef elist* plist;

int contaric(Bntree,int);
plist crealista(Bntree);
int contaelem(plist);

#endif

Codice:
#include"genealogia.h"
#include<string.h>
#include<stdlib.h>

int contaric(Bntree t, int x) {
    plist a = (plist)malloc(sizeof(elist));
    int count=0;
    if (t!=NULL) {
        contaric(t->primofiglio,x);
        contaric(t->fratello,x);
        a = crealista(t);
        if (contaelem(a) == x)
            count++;
    }
    return count;
}

int contaelem(plist a) {
    int count = 0;
    while (a!=NULL) {
        count++;
        a = a->next;
    }
    return count;
}

plist crealista(Bntree t) {
    plist a = (plist)malloc(sizeof(elist));
    plist temp = a;
    strcpy(temp->info,t->info);
    t->fratello;
    while (t!=NULL) {
        temp->next = (plist)malloc(sizeof(elist));
        temp = temp->next;
        strcpy(temp->info,t->info);
        t->fratello;
    }
    return a;
}
 

Nico911

Utente Attivo
192
13
Dando un occhiata vedo qualche errore semantico( ad esempio t-> fratello; ti crea un ciclo infinito devi associargli il valore, t=t->fratello; allochi memoria dinamica senza però rimuoverla nel caso la funzione termini precocemente( mi riferisco all'inizio di contaric)
Comunque sia il problema principale del tuo programma è che non ti porta da nessuna parte, te hai creato un oggetto che dovrebbe scandagliarti tutto l'albero e ti dovrebbe dare anche in ritorno il numero di elementi che soddisfa la richiesta, anche ammesso la funzione di conteggio che hai scritto funzionasse te non prelevi il valore in ritorno da contaric quindi te lo perdi, poi per ogni nodo ci crei una lista ma questo non ti risolve il problema te lo complica soltanto anche se lo metti in lista rimane sempre un albero spezzettato su una lista.
Ti dico come procederei/o io poi semmai domani controllo meglio quello che hai scritto.
Prima di tutto ti crei una UNICA funzione che ti scandaglia l'albero, la base di contaric andrebbe bene, la funzione si riapplica sui figli e PRELEVA il loro ritorno. Quando hai fatto questo devi ragionare ai valori che ti servono, in questo caso il numero dei figli e il numero di nodi che soddisfa la condizione, ergo ti servono due valori in ritorno, o in ritorno dai una struttura di due interi invece di un intero o ti crei una variabile riferimento da passare come parametro in cui la funzione di livello superiore lascia il proprio risultato. A questo punto bai una funzione che ti visita tutti i nodi e ti da indietro dei valori. Ora devi pensare a come ottenere quei valori e qui è questione di pratica per impararlo. Nel tuo caso ti servono il numero dei figli quindi semplicemente usi la variabile count che hai allocato, inizializzata a uno(il nodo su cui la funzione sta lavorando è anche lui un figlio di qualcuno) dopo di che a riapplichi la funzione sui figli e controllo la somma dei loro valori di ritorno se è uguale alla condizione. Poi dai in ritorno il loro valori a cui sommi anche country.
In questo modo hai una funzione che partirà e scandaglierá tutto l'albero fino ad arrivare alle sue foglie. A quel punto le foglie daranno in ritorno 1(i loro figli hanno dato 0 in ritorno, non ci sono +1 per se stesse) questi valori verranno raccolti dai padri che hanno di eseguito le funzioni su di loro e che ipoteticamente(se avevano tutti i figli) daranno in ritorno 3 e così via. In tutto questo a te basta una piccolo confronto tra questi valori e la tua condizione e salvartelo su qualche variabile. Spero di essere stato chiaro , ho la scrittura automatic che fa le bizze quindi se trovi qual he parola che non ci incastra è perchè me la ha modificata e non ci ho fatto caso xD.
 
  • Mi piace
Reazioni: Fab996

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili