Algoritmo di visita di un albero generico attraverso una coda..

di il
3 risposte

Algoritmo di visita di un albero generico attraverso una coda..

Buonasera ragazzi, vorrei implementare un algoritmo di visita (e creazione) di un albero generico mediante l'utilizzo di una coda. Ebbene ho sviluppato il codice, ma ha qualche problema nella funzione di dequeue(). In pratica, quando si effettua l'estrazione dell'elemento dalla coda, non viene eliminato appunto dalla coda, ma persiste, per cui il codice non uscirà mai dal ciclo WHILE definito nella funzione tree() dato che deve terminare solo quando la cosa è vuota.. Non so come poter prendere l'ultimo elemento della coda, e poi eliminarlo dalla cosa stessa..

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

struct node {
    char info;
    short grd;
    struct node *p_next; 
};

typedef struct node ELEMENT;
ELEMENT *head, *punt, *tail;

void enqueue(short, ELEMENT *, ELEMENT **);
void dequeue(ELEMENT **);
void tree();

int main(int argc, char *argv[]) {
    head = NULL;
    tree();
}

// Queue function::Enqueue.
void enqueue(short len_info, ELEMENT *data, ELEMENT **head) {
    ELEMENT *ptr = (ELEMENT *)calloc(1, sizeof(ELEMENT));
    memcpy(ptr, data, len_info);
    ptr->p_next = *head;
    *head = ptr;
}

// Queue function::Dequeue.
void dequeue(ELEMENT **tail) {
    punt = head;
    while(punt->p_next != NULL) {
        punt = punt->p_next;
    }
    
    (*tail) = punt;
    (*tail)->p_next = NULL;
    free(punt); 
}

// Tree::Generation.
void tree() {
    ELEMENT *child, *data = (ELEMENT *)calloc(1, sizeof(ELEMENT));
    printf("CHAR: "); scanf(" %c", &data->info);
    printf("CHILDS (0-3): "); scanf("%hd", &data->grd);
    enqueue(sizeof(ELEMENT), data, &head);
     
    while(head != tail) {
    	dequeue(&tail);
    	for(int i = 0; i < tail->grd; i++) {
		child = (ELEMENT *)calloc(1, sizeof(ELEMENT));
    		printf("CHAR: "); scanf(" %c", &child->info);
    		printf("CHILDS (0-3): "); scanf("%hd", &child->grd);
    		enqueue(sizeof(ELEMENT), child, &head); 
		free(child);
    	}

	printf("QUEUE:\n");
	punt = head; 
	while(punt != NULL) {
		printf("%c\t", punt->info);
		punt = punt->p_next; 
	} printf("\n");
    }

    free(data);
}
Grazie mille anticipatamente..

3 Risposte

Devi accedere o registrarti per scrivere nel forum
3 risposte