Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Creazione queue attraverso una linked list e nodi sentinella..
Forum - C/C++ - Creazione queue attraverso una linked list e nodi sentinella..

Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 18:56
Giovedì, 20/09/2018
Buonasera ragazzi, praticamente nello svolgimento di un esercizio di creazione di una coda attraverso una linked list con dei nodi sentinella, e l'implementazione delle relative operazioni su di essi, mi sono imbattuto in questo comportamento strano: gli inserimenti avvengono all'interno della coda, ma quando vado a visualizzare gli elementi della stessa non viene visualizzato nulla. Questo problema l'ho risolto, ed era dovuto al fatto che assegnavo memoria al nodo sentinella ogni volta che veniva fatto un ciclo while, cosa che non andava. Il problema di adesso è che quando intendo eliminare un nodo dalla lista, mi da un errore di segmentazione. Inoltre vorrei sapere se concettualmente è giusto fare in questo modo, cioè procedere in questa maniera. Questo è il codice completo:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef char DATA;
  6. struct node {
  7.         DATA info;
  8.         struct node *p_next;
  9. };
  10.  
  11. typedef struct node ELEMENT;
  12. typedef ELEMENT *LINK;
  13. LINK head, punt, h_sentinel, t_sentinel;
  14.        
  15. void * make_queue();
  16. void queue_inseriment(short, ELEMENT *, ELEMENT **);
  17. void queue_elimination(ELEMENT **);
  18.  
  19. int main(int argc, char *argv[]) {
  20.         int choose = 0;
  21.         ELEMENT *data;
  22.         h_sentinel = (ELEMENT *)calloc(1, sizeof(ELEMENT));
  23.         t_sentinel = (ELEMENT *)calloc(1, sizeof(ELEMENT));
  24.  
  25.         while(choose != 3) {
  26.                 printf("0. Show, 1. Insert, 2. Delete, 3. Exit;\n>> ");
  27.                 scanf("%d", &choose);
  28.                
  29.                 head = make_queue();
  30.                 head = h_sentinel;
  31.  
  32.                 switch(choose) {
  33.                         case 0:
  34.                                 punt = head;
  35.                                 while(punt != NULL) {
  36.                                         printf("%c\n", punt->info);
  37.                                         punt = punt->p_next;
  38.                                 }
  39.                                 break;
  40.                         case 1:
  41.                                 data = (ELEMENT *)calloc(1, sizeof(ELEMENT));
  42.                                 printf("Char: ");
  43.                                 scanf(" %c", &data->info);
  44.                                 queue_inseriment(sizeof(ELEMENT), data, &h_sentinel);
  45.                                 break;
  46.                         case 2:
  47.                                 queue_elimination(&t_sentinel);
  48.                                 break;
  49.                         case 3:
  50.                                 printf("Exiting..\n");
  51.                                 exit(1);
  52.                                 break; 
  53.                         default:
  54.                                 printf("Command not found..\n");
  55.                                 break;
  56.                 }
  57.         }      
  58. }
  59.  
  60. void * make_queue() {
  61.         char *head = NULL;
  62.         return head;
  63. }
  64.  
  65. void queue_inseriment(short len_info, ELEMENT *data, ELEMENT **h_sentinel) {
  66.         ELEMENT *ptr = (ELEMENT *)calloc(1, sizeof(ELEMENT));
  67.         memcpy(ptr, data, len_info);
  68.         ptr->p_next = (*h_sentinel)->p_next;
  69.         (*h_sentinel)->p_next = ptr;
  70. }
  71.  
  72. void queue_elimination(ELEMENT **t_sentinel) {
  73.         punt = head;
  74.         while(punt != NULL) {
  75.                 if((punt->p_next)->p_next == NULL) {
  76.                         (*t_sentinel) = punt;
  77.                         (*t_sentinel)->p_next = NULL;  
  78.                 } else {
  79.                         punt = punt->p_next;
  80.                 }
  81.         }
  82. }



Sicuramente sarà un problema di implementazione dei puntatori e cose del genere.. Ma fino ad ora ancora devo capire il perchè di questo comportamento.

Ultima modifica effettuata da comtel il 20/09/2018 alle 19:02
PM Quote
Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 19:08
Giovedì, 20/09/2018
Sembra abbia risolto il problema aggiungendo un break nel blocco IF, cosi che possa uscire dopo aver fatto le operazioni..

Codice sorgente - presumibilmente C/C++

  1. void queue_elimination(ELEMENT **t_sentinel) {
  2.         punt = head;
  3.         while(punt != NULL) {
  4.                 if((punt->p_next)->p_next == NULL) {
  5.                         (*t_sentinel) = punt;
  6.                         (*t_sentinel)->p_next = NULL;  
  7.                 } else {
  8.                         punt = punt->p_next;
  9.                 }
  10.         }
  11. }



Resta il fatto che sono in dubbio sul fatto che non so se è un approccio possibile questo e giusto ai fini dell'esercizio.

PM Quote