comtel (Member)
Pro
Messaggi: 145
Iscritto: 08/04/2011
|
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..
Codice sorgente - presumibilmente C++ |
#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..
|
ZLEKA (Normal User)
Newbie
Messaggi: 1
Iscritto: 09/07/2020
|
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.
|