Oppure

Loading
11/10/18 20:07
comtel
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..
aaa
09/07/20 14:11
ZLEKA
io non sono un grande esperto, ma secondo me è perché metti (*tail)=punt e poi fai (*tail)->p_next=NULL che in teoria è già a NULL perché con il ciclo while hai cercato l'ultimo elemento della coda. prova a mettere una variabile aux=punt dentro al while prima del punt=punt->p_next e metti (*tail)=aux.

Spero di esserti stato di aiuto.