Linguaggio C, strutture collegate lineari

di il
22 risposte

Linguaggio C, strutture collegate lineari

Si consideri un record Persona contenente i campi nome e cognome di tipo stringa (lunghezza massima 50 caratteri). Una fila è un array di elementi di tipo Persona. La fine di una fila è marcata da un record di tipo Persona il cui nome e cognome sono la stringa vuota. Il marcatore è sempre presente, anche nel caso di fila vuota. Il primo elemento della fila (la componente di indice 0 nell'array) è detto capofila e rappresenta la prossima persona che sarà servita. Quando il capofila è servito, esso viene rimosso dalla fila e la persona successiva diventa capofila. Quando una persona si aggiunge alla fila, viene inserita in ultima posizione. Tuttavia, una persona può essere raccomandata: in tal caso, può essere inserita in un punto arbitrario della fila.

Definizioni.h
/*
Dopo aver definito il record Persona, implementare in C le seguenti funzioni di gestione di file e
verificarne il comportamento mediante un'opportuna funzione main: */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
	//Dati anagrafici
	char nome[50];
	char cognome[50];
	
	//Collegamento al nodo successivo
	struct Persona *next;
	
}Persona;

Persona* nuova_fila();
//crea una fila vuota e la restituisce;

int is_empty(const Persona fila[]);
//data la fila, restituisce true se fila è vuota e false altrimenti;

Persona* capofila(Persona fila[]);
//restituisce un puntatore alla persona capofila di fila (NULL se la fila è vuota);

Persona* servi_capofila(Persona fila[]);
//restituisce un nuovo array ottenuto da fila eliminandone capofila da fila ed avanzando le
//restanti persone di una posizione;

Persona* aggiungi(Persona fila[], const Persona p); 
//restituisce un nuovo array ottenuto da fila aggiungendovi p come ultimo elemento della fila;

Persona* raccomanda(Persona fila[], const Persona p, const int n);
//restituisce un nuovo array ottenuto da fila inserendovi p in posizione n
//(si consideri 0 come la posizione del capofila) e spostando le persone 
//indietro di una posizione, a partire dalla posizione n. Se n rappresenta una
//posizione non valida, p viene inserito in fondo alla fila.

Main.c:

#include "definizioni.h"

int main()
{
	Persona *fila; //Puntatore alla fila
	int res;
	
	/* ********************************************* */
	
	//Creazione della lista (vuota)

	
	fila = nuova_fila(); 	
	
	/* ********************************************* */
	
	//Controllo lista vuota o meno
	
	res = is_empty(fila); 
	
	if(res == 1)
		printf("\nLa fila e' vuota.\n");
	else
		if(res == 0)
			printf("\nLa fila non e' vuota.\n"); 
	
	/* ********************************************* */	
	
}

Funzioni.c

#include "definizioni.h"

Persona *nuova_fila()
{
	Persona *fila, *punt;
	
	fila = NULL;
	
	return fila;
	/*
	int i, n;
	
	printf("Specificare il numero di elementi della fila, n: ");
	scanf("%d", &n);
	
	//Se n = 0, viene creata una fila vuota, 
	//quindi si assegna a p il valore NULL
	
	if(n == 0)
	{
		fila == NULL; //fila vuota
		return fila;
	}
	else
	{
		for(i = 1; i <= n; i++)
		{
			//Creazione primo elemento
			fila = (Persona *) malloc (sizeof(Persona));
			
			printf("\n%d) Inserisci il nome: ", i);
			scanf("%s", fila->nome);
			
			printf("Inserisci il cognome: ");
			scanf("%s", fila->cognome);
			
			punt = fila;
		}
	}*/
	
}

int is_empty(const Persona fila[])
{
	if(fila == NULL)
		return 1;
	else
		return 0;
}

Persona* capofila(Persona fila[])
{
	
}
Ho implementato le prime due funzioni, e riguardo la prima (nuova_fila()) devo chiedervi una cosa: per il "marcatore sempre presente" dovrei fare:

strcpy(fila->nome, " ");
strcpy(fila->cognome, " ");

però mi dice: "Errore di segmentazione (core dump creato)".

Comunque mi sono bloccato a:

Persona* capofila(Persona fila[]);
//restituisce un puntatore alla persona capofila di fila (NULL se la fila è vuota);

Non so da dove cominciare!!

22 Risposte

  • Re: Linguaggio C, strutture collegate lineari

    Ma dove hai inserito quelle strcpy ?
  • Re: Linguaggio C, strutture collegate lineari

    In nuova_fila, comunque quella cosa l'ho risolta.

    Ho difficoltà con:

    Persona* capofila(Persona fila[]);
    //restituisce un puntatore alla persona capofila di fila (NULL se la fila è vuota);
  • Re: Linguaggio C, strutture collegate lineari

    Cioè? Spiegati ...

    P.S. Indica precisamente il problema, se parli d'altro e poi quest'altro è risolto perdiamo solo tempo tutti ...
  • Re: Linguaggio C, strutture collegate lineari

    Devo restituire un puntatore alla persona capofila di fila, che sarebbe quindi il primo elemento della lista.
    1) Come accedo al primo elemento della lista? O comunque ad un determinato elemento che mi serve?
    2) Restituire il puntatore al primo elemento della lista (cioè capofila). Il nodo capofila è composto da nome, cognome e next, cioè il puntatore al prossimo nodo. Devo ritornare questo oppure il puntatore iniziale che fa riferimento proprio al primo elemento della lista?

    PS: la piattaforma dell'università da dove scarico solitamente i pdf del prof e tutto il materiale didattico, in questi giorni è in crash. Non ho modo di consultarla. Sto studiando in giro sul web ma faccio parecchia confusione.. Grazie
  • Re: Linguaggio C, strutture collegate lineari

    Il primo elemento della lista nella funzione è

    fila[0]

    mi sembra scontato ...

    Di questo elemento devi controllare nome e cognome. Se questi sono vuoti allora è il record di chiusura e quindi restituisci NULL; altrimenti restituisci l'indirizzo di fila[0]

    P.S. IMPORTANTE ... ma a cosa ti serve next ? Non è prevista dall'esercizio ...
  • Re: Linguaggio C, strutture collegate lineari

    Next è il puntatore che mi collega al nodo successivo.. Ma ora che mi ci hai fatto pensare mi sa che ho sbagliato tutto.. Questo esercizio non è che andava fatto con gli array, senza le liste?

    Perché il testo non lo dice chiaramente, e come ti ho detto prima non posso accertarmene dato che la piattaforma è in crash..

    Sì, confermo. Le liste saranno utilizzate nella prossima esercitazione
  • Re: Linguaggio C, strutture collegate lineari

    davide.fruci ha scritto:


    next è il puntatore che mi collega al nodo successivo.. Ma ora che mi ci hai fatto pensare mi sa che ho sbagliato tutto.. Questo esercizio non è che andava fatto con gli array, senza le liste?
    In questo esercizio non si parla di liste ... quel puntatore non ha senso.
  • Re: Linguaggio C, strutture collegate lineari

    Sìsì, infatti non va fatto con le liste. Lo sto rifacendo utilizzando gli array.

    oregon ha scritto:



    Di questo elemento devi controllare nome e cognome. Se questi sono vuoti allora è il record di chiusura e quindi restituisci NULL; altrimenti restituisci l'indirizzo di fila[0]
    Ho fatto così ma non va bene, mi dice "Errore di segmentazione (core dump creato)".
    typedef struct {
    	//Dati anagrafici
    	char nome[50];
    	char cognome[50];
    
    }Persona;
    main.c
    
    int main()
    {
            Persona *punt;
    	punt = capofila(fila);
    	printf("\nDati relativi al capofila");
    	printf("Nome: %s", punt->nome);
    	printf("Cognome: %s", punt->cognome);
    }

    Funzione.c
    
    Persona* capofila(Persona fila[])
    {
    	if(fila == NULL)
    		return NULL;
    	else
    		if(fila != NULL)
    			return &fila[0];
    }
    
    Un'altra cosa:

    Persona* servi_capofila(Persona fila[]);
    //restituisce un nuovo array ottenuto da fila eliminandone capofila da fila ed avanzando le
    //restanti persone di una posizione;

    Va bene se allocassi un nuovo array di tipo Persona, di dimensione -1 rispetto a quello attuale e scrivendo su tutti gli elementi saltando il primo? Con eliminazione si intende proprio di riallocare oppure di eliminare nel verso senso della parola quell'elemento dalla cella [0] ? In tal caso come si cancella il contenuto di una cella di un array? Grazie
  • Re: Linguaggio C, strutture collegate lineari

    Ma in

    punt = capofila(fila);

    cosa è fila ? Da dove viene ?
  • Re: Linguaggio C, strutture collegate lineari

    Ho copiato solo la funzione che mi dava problemi e non tutto il codice, scusa,

    Sarebbe un array di Persona già caricato
  • Re: Linguaggio C, strutture collegate lineari

    Ma caricato dove?
  • Re: Linguaggio C, strutture collegate lineari

    Posto tutto il codice.

    Definizioni.h
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct {
    	//Dati anagrafici
    	char nome[50];
    	char cognome[50];
    
    }Persona;
    
    Persona* nuova_fila();
    //crea una fila vuota e la restituisce;
    
    int is_empty(const Persona fila[]);
    //data la fila, restituisce true se fila è vuota e false altrimenti;
    
    Persona* capofila(Persona fila[]);
    //restituisce un puntatore alla persona capofila di fila (NULL se la fila è vuota);
    
    Persona* servi_capofila(Persona fila[]);
    //restituisce un nuovo array ottenuto da fila eliminandone capofila da fila ed avanzando le
    //restanti persone di una posizione;

    Main.c:

    #include "definizioni.h"
    
    int main()
    {
    	Persona *fila, *punt;
    	
    	int res;
    	
    	/* ********************************************* */
    	
    	//Creazione della lista (vuota)
    
    	
    	fila = nuova_fila(); 	
    	
    	/* ********************************************* */
    	
    	//Controllo lista vuota o meno
    	
    	res = is_empty(fila); 
    	
    	if(res == 1)
    		printf("\nLa fila e' vuota.\n");
    	else
    		if(res == 0)
    			printf("\nLa fila non e' vuota.\n"); 
    	
    	/* ********************************************* */	
    	
    	punt = capofila(fila);
    	printf("\nDati relativi al capofila");
    	printf("Nome: %s", punt->nome);
    	printf("Cognome: %s", punt->cognome);
    		
    	/* ********************************************* */	
    
    	Persona *new_lista;
    	new_lista = servi_capofila(fila);
    		
    				
    	
    }

    Funzioni.c:

    #include "definizioni.h"
    
    Persona *nuova_fila()
    {
    	Persona *fila;
    	int n, i, m = 1;
    	printf("Elementi fila?");
    	scanf("%d", &n);
    	
    	if(n == 0)
    		return fila = NULL;
    	
    	//Allocazione dinamica della fila
    	fila = (Persona*) malloc (n * sizeof(Persona));
    	
    	for(i = 0; i < n; i++)
    	{	
    		printf("\nElemento %d della fila.\n", m);
    		printf("Nome: "); scanf("%s", fila[i].nome);
    		printf("Cognome: "); scanf("%s", fila[i].cognome);
    		m++;
    	}
    }
    
    int is_empty(const Persona fila[])
    {
    	if(fila == NULL)
    		return 1;
    	else
    		if(fila != NULL)
    			return 0;
    }
    
    Persona* capofila(Persona fila[])
    {
    	if(fila == NULL)
    		return NULL;
    	else
    		if(fila != NULL)
    			return &fila[0];
    }
  • Re: Linguaggio C, strutture collegate lineari

    Nella funzione nuova_fila manca il

    return fila;
  • Re: Linguaggio C, strutture collegate lineari

    oregon ha scritto:


    Nella funzione nuova_fila manca il

    return fila;
    Ah.. giusto.. Grazie!

    Un'altra cosa:

    Persona* servi_capofila(Persona fila[]);
    //restituisce un nuovo array ottenuto da fila eliminandone capofila da fila ed avanzando le
    //restanti persone di una posizione;

    Va bene se allocassi un nuovo array di tipo Persona, di dimensione -1 rispetto a quello attuale e scrivendo su tutti gli elementi saltando il primo?

    Se andasse bene questo, per poter allocare un nuovo array di dimensione n-1 rispetto all'originale mi occorrerebbe proprio conoscere dimensione. E dato che l'ultimo elemento dell'array è un marcatore, cioè nome e cognome sono vuoti, avevo pensato ad una cosa del genere:
    
    int i = 0;
    while(fila[i].nome != " ")
           i++;
    printf("%d", i);
    
    
    Solo che non mi stampa niente. Come mai?

    Ti riallego il codice.

    main.c

    #include "definizioni.h"
    
    int main()
    {
    	//Persona *fila, *punt; //Puntatore alla fila
    	Persona *fila, *punt;
    	
    	int res;
    	
    	/* ********************************************* */
    	
    	//Creazione della lista (vuota)
    
    	
    	fila = nuova_fila(); 	
    	
    	/* ********************************************* */
    	
    	//Controllo lista vuota o meno
    	
    	res = is_empty(fila); 
    	
    	if(res == 1)
    		printf("\nLa fila e' vuota.\n");
    	else
    		if(res == 0)
    			printf("\nLa fila non e' vuota.\n"); 
    	
    	/* ********************************************* */	
    	
    	punt = capofila(fila);
    	printf("\nDati relativi al capofila: ");
    	printf("\n");
    	printf("Nome: %s", punt->nome);
    	printf("\n");
    	printf("Cognome: %s", punt->cognome);
    	printf("\n");
    		
    	/* ********************************************* */	
    		
    	Persona *new_lista;
    	new_lista = servi_capofila(fila);
    		
    				
    	
    }

    funzioni.c

    #include "definizioni.h"
    
    Persona *nuova_fila()
    {
    	Persona *fila;
    	int n, i, m = 1;
    	printf("Elementi fila?");
    	scanf("%d", &n);
    	n++;
    	if(n == 0)
    		return fila = NULL;
    	
    	//Allocazione dinamica della fila
    	fila = (Persona*) malloc (n * sizeof(Persona));
    	
    	for(i = 0; i <= n; i++)
    	{	
    		if(i < n-1)
    		{
    			printf("\nElemento %d della fila.\n", m);
    			printf("Nome: "); scanf("%s", fila[i].nome);
    			printf("Cognome: "); scanf("%s", fila[i].cognome);
    		}
    		else
    			if(i == n)
    			{
    				printf("\nElemento %d della fila marcatore.\n", i);
    				strcpy(fila[i].nome, " ");
    				strcpy(fila[i].cognome, " ");
    
    			}
    		m++;
    	}
    	return fila;
    }
    
    int is_empty(const Persona fila[])
    {
    	if(fila == NULL)
    		return 1;
    	else
    		if(fila != NULL)
    			return 0;
    }
    
    Persona* capofila(Persona fila[])
    {
    	if(fila == NULL)
    		return NULL;
    	else
    		if(fila != NULL)
    			return &fila[0];
    }
    Persona* servi_capofila(Persona fila[])
    {
    	if(fila == NULL)
    		return NULL;
    	else
    		if(fila != NULL)
    		{
    			int i = 0;
    			while(fila[i].nome != " ")
    			{
    				i++;
    			}
    			printf("n: %d", i);
    		}
    			
    }
    
    
    Con eliminazione si intende proprio di riallocare oppure di eliminare nel verso senso della parola quell'elemento dalla cella [0] ? In tal caso come si cancella il contenuto di una cella di un array? Grazie
Devi accedere o registrarti per scrivere nel forum
22 risposte