Il seguente codice "converte" un array di interi in una scl, nel senso che ogni elemento a[j] viene inserito nella lista nello stesso ordine in cui gli elementi compaiono nell'array.
La mossa più conveniente sarebbe di fare un inserimento in coda. Cosa che ho fatto, quindi ok.
Per esercitarmi ho deciso di fare lo stesso es con un inserimento in testa, e poi invertire la lista, in modo tale da avere gli elementi nello stesso ordine dell'array.
Ecco il codice, funzionante:
#include <stdio.h>
#include <stdlib.h>
struct ElemSCL{
int info;
struct ElemSCL* next;
};
typedef struct ElemSCL NodoSCL;
typedef NodoSCL* TipoSCL;
void inverti(TipoSCL *scl);
int main()
{
int i = 0, a[5] = {1, 2, 3, 4, 5}, n = 5;
TipoSCL *scl, punt = NULL;
while(i < n)
{
*scl = (NodoSCL*) malloc (sizeof(NodoSCL));
(*scl) -> info = a[i];
(*scl) -> next = punt;
punt = *scl;
i++;
}
TipoSCL aux = *scl;
inverti(&aux);
*scl = aux;
printf("\n");
while(*scl != NULL)
{
printf("-> %d", (*scl) -> info);
(*scl) = (*scl) -> next;
}
}
void inverti(TipoSCL *scl)
{
TipoSCL prev = NULL, succ;
while(*scl != NULL)
{
succ = *scl;
*scl = (*scl) -> next;
succ -> next = prev;
prev = succ;
}
*scl = prev;
}
Il problema è: questo è un esercizio dato dal prof che, una volta compilato, viene avviato un correttore automatico che stampa, in percentuale, la riuscita dell'ersercizio stesso.
In realtà, l'esercizio consiste nell'implementare la funzione data. Quindi non ho nessun main da utilizzare come nel codice che ho postato qui sopra.
Ecco la traccia:
si realizzi la funzione C:
• void converti(TipoSCL* scl, int a[], int n)
che, presi in input un puntatore scl ad una SCL ed un array a di interi con la relativa dimensione n,
crea una nuova struttura collegata contenente gli elementi di a (mantenendone l’ordine) e la restituisce attraverso il parametro per riferimento scl.
ed ecco l'implementazione:
#include <stdio.h>
#include <stdlib.h>
#include "esercizio.h"
void inverti(TipoSCL *scl);
void converti(TipoSCL*scl, int a[], int n)
{
TipoSCL punt = NULL;
int i = 0;
while(i < n)
{
*scl = (NodoSCL*) malloc (sizeof(NodoSCL));
(*scl) -> info = a[i];
(*scl) -> next = punt;
punt = *scl;
i++;
}
TipoSCL aux = *scl;
inverti(&aux);
*scl = aux;
}
void inverti(TipoSCL *scl)
{
TipoSCL prev = NULL, succ;
while(*scl != NULL)
{
succ = *scl;
*scl = (*scl) -> next;
succ -> next = prev;
prev = succ;
}
*scl = prev;
}
che è praticamente uguale al primo codice che ho postato, solamente che l'array mi viene passato come parametro. Il correttore mi da Errore di segmentazione (core dump creato).
Se mi dite come fare, potrei postarvi l'intera cartella contenente anche il codice del correttore.
Oppure c'è un errore che non riesco a vedere?
Grazie