Funzione Insert per Strutture Dati

di il
21 risposte

Funzione Insert per Strutture Dati

Non so come approcciarmi al seguente esercizio. L'esercizio è composto da due punti, nel primo viene richiesto di Definire una struttura dati per contenere una sequenza di lunghezza variabile di terne "nome", "cognome", "età" ("name", "last name", "age") es. (Mario, Bianchi, 20), (Giuseppe, Rossi, 21), ... (Lucia, Verdi, 22). Definire opportunamente i campi relativi ai valori delle terne. La struttura deve supportare operazioni di inserimento, ricerca e cancellazione.

io l'ho risolte nel seguente modo:
struct person_t {
	char name[PERSON_FIELD_SIZE];
	char surname[PERSON_FIELD_SIZE];
	unsigned age;
};

typedef struct person_t person_t;
Nel secondo punto viene richiesto di definire una funzione, secondo il prototipo incompleto riportato di seguito, di inserimento che tenga la sequenza delle terne ordinata per età (age) decrescente es. (Lucia, Verdi, 22), (Giuseppe, Rossi, 21), ..., (Mario, Bianchi, 20)
insert(         name,    last_name,    age);
Qualche consiglio su come potrei impostare l'esercizio?

21 Risposte

  • Re: Funzione Insert per Strutture Dati

    Hai studiato le liste collegate?
  • Re: Funzione Insert per Strutture Dati

    Le liste le ho studiate il problema è che si tratta solo di definire una funzione e si è vincolati dal prototipo incompleto, non di creare un programma vero o proprio.. Non andrei contro questi vincoli?
  • Re: Funzione Insert per Strutture Dati

    No. Dato che è incompleto, puoi completarlo come vuoi. Usa una lista.
  • Re: Funzione Insert per Strutture Dati

    Potresti aiutarmi con il codice? Non capisco bene in che modo utilizzare la lista all'interno della funzione
  • Re: Funzione Insert per Strutture Dati

    Sai scrivere la classica funzione che aggiunge un elemento ad una lista? Devi solo fare attenzione, nello scorrere la lista, ad aggiungere il nuovo elemento tenendo conto del campo età.
  • Re: Funzione Insert per Strutture Dati

    Si, ma non capisco in che modo la lista possa collegarsi alla struttura dati che ho definito nel primo punto dell'esercizio. Le liste che abbiamo studiato erano sempre formate da un informazione espressa da una variabile di tipo int e da un puntatore. A causa del vincolo del prototipo incompleto devo ricevere in ingresso, nella funzione, oltre al dato dell'età quello del nome e del cognome.. Sono abbastanza confuso..
  • Re: Funzione Insert per Strutture Dati

    Quei dati nel prototipo, ovviamente, sono necessari per inserire un nuovo elemento nella lista.

    Nella struttura che hai mostrato manca solo il puntatore alla prossima struttura.
  • Re: Funzione Insert per Strutture Dati

    Spero di aver capito. Sto creando un intero programma per andar poi a testare la funzione. Per accertarmi che operasse correttamente ho effettuato una stampa subito dopo aver caricato la lista. Nei surname, però, viene stampato (null), non capisco il motivo. Ecco il codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    struct list_t {
    	char *name;
    	char *surname;
    	int age;
    	struct list_t *next;
    };
    typedef struct list_t list_t;
    
    list_t *
    list_cons(char *name, char *surname, int age, list_t *list){
    	list_t *new;
    
    	new=malloc(sizeof(list_t));
    	if(new){
    		new->name=name;
    		new->surname=surname;
    		new->age=age;
    		new->next=list;
    	}
    	return new;
    }
    
    void
    list_print(list_t *list){
    	
    	while(list){
    		printf("NAME: %s\n", list->name);
    		printf("SURNAME: %s\n", list->surname);
    		printf("AGE: %i\n", list->age);
    		list=list->next;
    	}
    	printf("\n");
    }
    
    int
    main(int argc, char **argv){
    	list_t *l;
    	char *name;
    	char *surname;
    	int age;
    	int number_of_people,i;
    
    	printf("Insert number of people: ");
    	scanf("%i", &number_of_people);
    
    
    	l=NULL;
    	for(i=0; i<number_of_people; i++) {
    		getchar();
    		printf("Insert name: ");
    		scanf("%s", name);
    		getchar();
    		printf("surname: ");
    		scanf("%s", surname);
    		getchar();
    		printf("age: ");
    		getchar();
    		scanf("%i", &age);
    		l=list_cons(name, surname, age, l);
    	}
    		list_print(l);
    	return 0;
    }
    
  • Re: Funzione Insert per Strutture Dati

    Come si copia una stringa in C? Non così di sicuro
          new->name=name;
          new->surname=surname;
    
    e perchè hai cambiato la person_t originale? La nuova list_t può secondo te "contenere" stringhe in name e surname?
    struct list_t {
       char *name;
       char *surname;
  • Re: Funzione Insert per Strutture Dati

    Mi era stato detto che mancava solo il puntatore.. In che modo dovrei organizzare la lista?
  • Re: Funzione Insert per Strutture Dati

    Oregon ha scritto
    Nella struttura che hai mostrato manca solo il puntatore alla prossima struttura.
    di sicuro non intendeva farti cambiare name e surname.

    Aggiungo: qui sotto come fai a caricare name se questo non è neanche allocato? (stesso discorso per surname)
    int
    main(int argc, char **argv){
       // ...
       char *name;
       // ...
          printf("Insert name: ");
          scanf("%s", name);
       // ...
    
  • Re: Funzione Insert per Strutture Dati

    Per quanto riguarda le stringhe devo utilizzare strcpy..
    Riguardo name e surname vengono prima inseriti in delle stringhe nel name e poi la struttura viene allocata di volta in volta tramite il ciclo for e la chiamata a list_cons.. Puoi aiutarmi a capire tramite codice dove sbaglio?
    Grazie degli aiuti.
  • Re: Funzione Insert per Strutture Dati

    Ma perché prima hai scritto
    
    char name[PERSON_FIELD_SIZE];
    char surname[PERSON_FIELD_SIZE];
    
    per nome e cognome e poi hai invece usato
    
    char *name;
    char *surname;
    
  • Re: Funzione Insert per Strutture Dati

    Ho creato un altro programma e ho considerato secondario la grandezza delle stringhe, vorrei capire come fare la funzione prima
Devi accedere o registrarti per scrivere nel forum
21 risposte