Ordinamento di una lista

di il
14 risposte

Ordinamento di una lista

Salve sto cercando di realizzare un programma che ordina una lista. Il problema è che ho a che fare con qualcosa di abbastanza complicato, non è il classico esempio che si trova su internet.
Descrivo con cosa ho a che fare:
1) Le strutture con cui ho a che fare:

/** tipi di ordinamento: 
   NOTORD = nessun ordinamento. 
   TIME = ordinata per tempi crescenti.
   POSITION = ordinata per posizione crescente
*/ 
typedef enum { NOTORD=0, TIME=1, POSITION=2  } ord_t;

/** flag che indica se la rilevazione contiene rumore (NOISE) o no (OK) */
typedef enum { OK=0, NOISE=2  } flag_t;

/** struttura che realizza l'elemento della lista di registrazioni */
typedef struct elem {
  /** posizione registrazione*/
  double position;
  /** tempo registrazione */
  double time;
  /** flag rumore/buono */
  flag_t flag;
  /** puntatore al prossimo elemento */
  struct elem * next;
} elem_t;

/** struttura della lista delle registrazioni */
typedef struct {
  /** puntatore alla testa della lista */
  elem_t * head;
  /** numero di elementi presenti in lista */
  int nelem; 
  /** indica se è ordinata e se l'ordinamento e' rispetto al tempo o alla posizione  */
  ord_t ord; 
} lista_t;
2) Il prototipo della funzione che devo realizzare
/**
  se la lista non e' ordinata rispetto al tempo setta a TIME il campo ord 
  ed ordina la lista, altrimenti non fa niente
  \param l lista

 */
void set_ordinata_time (lista_t * l);
Ecco quello che ho fatto io:
void set_ordinata_time (lista_t * l) {
if((l->ord)!=1) {
elem_t * a;
int i=0;
int N= (l->nelem);
a= malloc(sizeof(elem_t)*(N+1));
for(i=0;i<N+1;i++) {
if ((a+i)->time > (a+i+1)->time) {
(a+i+1)->next = (a+i);
i=0;}}
return;}}
Qualcuno sa gentilmente spiegarmi perchè non funziona?
Grazie

14 Risposte

  • Re: Ordinamento di una lista

    Perché quella malloc? La lista con i dati già esiste e hai il puntatore alla testa. Perché operi su un array appena allocato e vuoto e non sulla lista?
  • Re: Ordinamento di una lista

    oregon ha scritto:


    Perché quella malloc? La lista con i dati già esiste e hai il puntatore alla testa. Perché operi su un array appena allocato e vuoto e non sulla lista?
    Non so come trattare una lista del genere, sai aiutarmi (anche solo dando qualche consiglio)?
    Grazie
  • Re: Ordinamento di una lista

    Butta il codice che hai scritto e riparti utilizzando l'elemento

    l->head

    e quindi adotta uno dei classici algoritmi per le liste che, appunto, troverai ovunque su internet ...
  • Re: Ordinamento di una lista

    oregon ha scritto:


    Butta il codice che hai scritto e riparti utilizzando l'elemento

    l->head

    e quindi adotta uno dei classici algoritmi per le liste che, appunto, troverai ovunque su internet ...
    Ecco, questo credo abbia più senso ma ancora non va. Credo che il problema sia nell'ultima parte, forse dovrei "scambiare" i puntatori e non i valori a cui puntano. Però non lo so, onestamente. Scusa se sembro stupido ma sono alle prime armi con liste e strutture. (A dir la verità lo sono con tutto)
    void set_ordinata_time (lista_t * l) {
    if((l->ord)!=1) {
    lista_t *k;
    k = malloc(sizeof(lista_t));
    int i=0;
    int N= (l->nelem);
    for(i=0;i<N+1;i++) {
    if ((((l+i)->head)->time) > (((l+i+1)->head)->time)) {
    *k = *(l+i);
    *(l+i) = *(l+i+1);
    *(l+i+1) = *k;
    i=0;}}
    return;}}
  • Re: Ordinamento di una lista

    E' ovvio che non devi toccare i puntatori ma solamente i dati ...

    E scusa, ma perché N+1 ?
  • Re: Ordinamento di una lista

    oregon ha scritto:


    E' ovvio che non devi toccare i puntatori ma solamente i dati ...

    E scusa, ma perché N+1 ?
    Mi sono accorto ora, e l'ho cambiato. Ma nonostante ciò non funziona ancora...
  • Re: Ordinamento di una lista

    Il puntatore alla lista lo imposti all'inizio con

    elem_t *p = l->head;

    e poi utilizzi il puntatore

    p
  • Re: Ordinamento di una lista

    Scusami ma non mi è chiara una casa, come fai a fare return se la funzione è void?
  • Re: Ordinamento di una lista

    E perchè no dato che non restituisce valori?
  • Re: Ordinamento di una lista

    Dovrebbe essere qualcosa così quind?
    void set_ordinata_time (lista_t * l) {
    if((l->ord)!=1) {
    elem_t *p=(l->head);
    elem_t * a;
    p = malloc(sizeof(elem_t));
    a = malloc(sizeof(elem_t));
    int i=0;
    int N= (l->nelem);
    for(i=0;i<N;i++) {
    if (((p+i)->time) > ((p+i+1)->time)) {
    *a = *(p+i);
    *(p+i) = *(p+i+1);
    *(p+i+1) = *(a);
    i=0;}}
    l->ord=1;}
    return;}
    
    Quindi, qual'è il problema con return? Devo dargli return l?
  • Re: Ordinamento di una lista

    Ma lascia perdere la return e anche tutte quelle malloc inutili.

    Prova a fare solo questo e ne riparliamo:

    visualizza il valore di time del primo e del secondo elemento della lista.
  • Re: Ordinamento di una lista

    oregon ha scritto:


    E perchè no dato che non restituisce valori?
    volevo dire: perché dare return NULL che no restituisce nulla, mentre con exit(1) gli ritorna l'errore 1... o sbaglio?
  • Re: Ordinamento di una lista

    Ma dov'è questo

    return NULL;

    ? Io non lo vedo. ...
  • Re: Ordinamento di una lista

    Scusate ho sbagliato io... credevo che return serviva per l'if... Scusatemi...
Devi accedere o registrarti per scrivere nel forum
14 risposte