Linguaggio C, SCL - liste

di il
4 risposte

Linguaggio C, SCL - liste

struct elemSCL {
	int elemento;
	struct elemSCL *next;
};

typedef struct elemSCL nodoSetSCL;
typedef nodoSetSCL *setSCL;
Questa è la mia struttura per creare un insieme con le liste. Ho già caricato la mia lista, e devo implementare una funzione, ovvero:

int is_set(setSCL set)
;

Che, dato l'insieme set, restituisce true se set rappresenta un insieme (ovvero non contiene elementi duplicati) e false altrimenti.


Quindi avevo pensato a questo: prendo il primo elemento della lista e lo confronto con tutti i suoi successivi, se uno di questi è uguale a temp ritorno false. Altrimenti, temp prende il secondo elemento della lista e fa la stessa cosa del primo elemento. E così via.. Se si arriva alla fine del ciclo e quindi si esce dal ciclo stesso ritorno true.

La prima cosa che ho pensato di fare e vede quanti elementi ci sono nella lista.

int is_set(setSCL set)
{
	int i = 0, j = 0, temp;

	temp = set->elemento;
	printf("temp1: %d\n", temp);

	while(set != NULL)
	{
		set = set -> next;
		i++;
	}
	printf("Set contiene %d elementi\n", i);
}
Però, ho notato questa cosa: se temp = set->elemento; printf("temp1: %d\n", temp); li metto prima del while di scansione allora mi stampa il primo elemento. Se li metto dopo il ciclo mi da Errore di segmentazione (core dump creato). Perché?

Immagino che una volta scandita tutta la lista il puntatore rimanga in fondo alla lista stessa. Un po' come succede con i file quando si ha bisogno di fseek per riposizionare il cursore all'inizio.. Sbaglio?

Se fosse così come rimetto il puntatore all'inizio della lista?

4 Risposte

  • Re: Linguaggio C, SCL - liste

    Se tu fai
       while(set != NULL)
       {
          set = set -> next;
          i++;
       }
    dopo il ciclo set punterà a NULL.
    Quindi se fai
       temp = set->elemento;
       printf("temp1: %d\n", temp);
    
    non può fare altro che darti segmentation error
    Per il tuo algoritmo dovrai tenerti almeno due puntatori, uno che scandisce tutta la lista per tenere traccia del primo elemento di ciascun confronto e il secondo puntatore che di volta in volta parte dal primo e si scandisce fino alla fine, e dovrai fare due cicli annidati: ti suggerisco di scrivere il tutto in pseudocodice e rifletterci sopra e solo dopo che ne sarai convinto passare alla codifica.
    Buon lavoro!
  • Re: Linguaggio C, SCL - liste

    Ok, capito.

    Però, se volessi che il puntatore, dopo il while, puntasse di nuovo all'inizio della lista?

    Ho risolto lo stesso problema ricorrendo agli array, potrei utilizzare questo algoritmo come spunto?
    #include <stdio.h>
    
    int main()
    {
    	int v[5] = {1, 2 ,3, 4, 5}, i = 0, j, temp;
    	
    	while(i < 5)
    	{
    		temp = v[i];
    		for(j = i+1; j < 5; j++)
    			if(temp == v[j])
    			{
    				printf("Insieme non ammissibile\n");
    				return;
    			}
    		i++;
    	}
    	printf("Insieme ammissibile");
    } 
  • Re: Linguaggio C, SCL - liste

    se volessi che il puntatore, dopo il while, puntasse di nuovo all'inizio della lista?
    salvati il puntatore iniziale
  • Re: Linguaggio C, SCL - liste

    Ci ho provato.. Pare che funzioni, pare.. Me lo controlli perfavore? Grazie

    definizioni.h
    #include <stdio.h>
    #include <stdlib.h>
    struct elemSCL {
    	int elemento;
    	struct elemSCL *next;
    };
    
    typedef struct elemSCL nodoSetSCL;
    typedef nodoSetSCL *setSCL;
    
    int is_set(setSCL set);
    
    

    main.c

    #include "definizioni.h"
    
    int main()
    {
    	setSCL insieme, punt_insieme = NULL;
    	int risultato;
    	
    	insieme = malloc (sizeof(setSCL));
    	insieme->elemento = 3;
    	//Collgamento al nodo successivo
    	insieme -> next = punt_insieme; 
    	punt_insieme = insieme;
    	printf("\nElemento 1 dell'insieme: %d\n", insieme -> elemento);
    	
    	insieme = malloc (sizeof(setSCL));
    	insieme -> elemento = 2;
    	//Collegamento al nodo successivo
    	insieme -> next = punt_insieme;
    	punt_insieme = insieme;
    	printf("Elemento 2 dell'insieme: %d\n", insieme -> elemento);	
    	
    	insieme = malloc (sizeof(setSCL));
    	insieme -> elemento = 1;
    	//Collegamento al nodo successivo
    	insieme -> next = punt_insieme;
    	punt_insieme = insieme;
    	printf("Elemento 3 dell'insieme: %d\n", insieme -> elemento);
    	
            //Chiamata della funzione
    
    	risultato = is_set(insieme);
    	if(risultato == 1)
    		printf("Insieme ammissibile.\n");
    	else
    		printf("Insieme non ammissibile.\n");
    funzioni.c
    int is_set(setSCL set)
    {
    	int precedente, successivo, i = 0;
    	
    	setSCL set_parziale;
    	
    	while(set != NULL)
    	{
    		precedente = set->elemento;
    		printf("Precedente: %d\n", precedente);
    
    		set_parziale = set -> next;
    		while( set_parziale != NULL)
    		{
    			successivo = set_parziale -> elemento;
    			printf("Successivo: %d\n", successivo);
    			if(precedente == successivo)
    			{	
    				printf("ciao");
    				return 0;
    			}
    			else
    				set_parziale = set_parziale -> next;
    		}
    		set = set -> next;
    	}
    	return 1;
    }
Devi accedere o registrarti per scrivere nel forum
4 risposte