Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Algoritmo di visita di un albero generico attraverso una coda..
Forum - C/C++ - Algoritmo di visita di un albero generico attraverso una coda..

Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 22:07
Giovedì, 11/10/2018
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++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. struct node {
  7.     char info;
  8.     short grd;
  9.     struct node *p_next;
  10. };
  11.  
  12. typedef struct node ELEMENT;
  13. ELEMENT *head, *punt, *tail;
  14.  
  15. void enqueue(short, ELEMENT *, ELEMENT **);
  16. void dequeue(ELEMENT **);
  17. void tree();
  18.  
  19. int main(int argc, char *argv[]) {
  20.     head = NULL;
  21.     tree();
  22. }
  23.  
  24. // Queue function::Enqueue.
  25. void enqueue(short len_info, ELEMENT *data, ELEMENT **head) {
  26.     ELEMENT *ptr = (ELEMENT *)calloc(1, sizeof(ELEMENT));
  27.     memcpy(ptr, data, len_info);
  28.     ptr->p_next = *head;
  29.     *head = ptr;
  30. }
  31.  
  32. // Queue function::Dequeue.
  33. void dequeue(ELEMENT **tail) {
  34.     punt = head;
  35.     while(punt->p_next != NULL) {
  36.         punt = punt->p_next;
  37.     }
  38.    
  39.     (*tail) = punt;
  40.     (*tail)->p_next = NULL;
  41.     free(punt);
  42. }
  43.  
  44. // Tree::Generation.
  45. void tree() {
  46.     ELEMENT *child, *data = (ELEMENT *)calloc(1, sizeof(ELEMENT));
  47.     printf("CHAR: "); scanf(" %c", &data->info);
  48.     printf("CHILDS (0-3): "); scanf("%hd", &data->grd);
  49.     enqueue(sizeof(ELEMENT), data, &head);
  50.      
  51.     while(head != tail) {
  52.         dequeue(&tail);
  53.         for(int i = 0; i < tail->grd; i++) {
  54.                 child = (ELEMENT *)calloc(1, sizeof(ELEMENT));
  55.                 printf("CHAR: "); scanf(" %c", &child->info);
  56.                 printf("CHILDS (0-3): "); scanf("%hd", &child->grd);
  57.                 enqueue(sizeof(ELEMENT), child, &head);
  58.                 free(child);
  59.         }
  60.  
  61.         printf("QUEUE:\n");
  62.         punt = head;
  63.         while(punt != NULL) {
  64.                 printf("%c\t", punt->info);
  65.                 punt = punt->p_next;
  66.         } printf("\n");
  67.     }
  68.  
  69.     free(data);
  70. }



Grazie mille anticipatamente..

PM Quote
Avatar
ZLEKA (Normal User)
Newbie


Messaggi: 1
Iscritto: 09/07/2020

Segnala al moderatore
Postato alle 16:11
Giovedì, 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.

PM Quote