Oppure

Loading
20/09/18 16:56
comtel
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:

#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 20/09/18 17:02
aaa
20/09/18 17:08
comtel
Sembra abbia risolto il problema aggiungendo un break nel blocco IF, cosi che possa uscire dopo aver fatto le operazioni..

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;
                }
        }
}


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