comtel (Member)
Pro
Messaggi: 145
Iscritto: 08/04/2011
|
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++ |
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef char DATA; struct node { DATA info; struct node *p_next; }; typedef struct node ELEMENT; typedef ELEMENT *LINK; LINK head, punt, h_sentinel, t_sentinel; void * make_queue(); void queue_inseriment(short, ELEMENT *, ELEMENT **); void queue_elimination(ELEMENT **); int main(int argc, char *argv[]) { int choose = 0; ELEMENT *data; h_sentinel = (ELEMENT *)calloc(1, sizeof(ELEMENT)); t_sentinel = (ELEMENT *)calloc(1, sizeof(ELEMENT)); while(choose != 3) { printf("0. Show, 1. Insert, 2. Delete, 3. Exit;\n>> "); scanf("%d", &choose); head = make_queue(); head = h_sentinel; switch(choose) { case 0: punt = head; while(punt != NULL) { printf("%c\n", punt->info); punt = punt->p_next; } break; case 1: data = (ELEMENT *)calloc(1, sizeof(ELEMENT)); printf("Char: "); scanf(" %c", &data->info); queue_inseriment(sizeof(ELEMENT), data, &h_sentinel); break; case 2: queue_elimination(&t_sentinel); break; case 3: printf("Exiting..\n"); exit(1); break; default: printf("Command not found..\n"); break; } } } void * make_queue() { char *head = NULL; return head; } void queue_inseriment(short len_info, ELEMENT *data, ELEMENT **h_sentinel) { ELEMENT *ptr = (ELEMENT *)calloc(1, sizeof(ELEMENT)); memcpy(ptr, data, len_info); ptr->p_next = (*h_sentinel)->p_next; (*h_sentinel)->p_next = ptr; } void queue_elimination(ELEMENT **t_sentinel) { punt = head; while(punt != NULL) { if((punt->p_next)->p_next == NULL) { (*t_sentinel) = punt; (*t_sentinel)->p_next = NULL; } else { punt = punt->p_next; } } }
|
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 |