C - Liste, problema stampa al contrario

di il
5 risposte

C - Liste, problema stampa al contrario

Ciao a tutti, ho provato a fare questo esercizio, il compito era quello di creare due liste in cui inserire i valori pari in una e quelli dispari in un'altra. Il programma funziona, non capisco solamente perchè quando mi stampa le due liste nuove sono al contrario.

#include<stdio.h>
#include<stdlib.h>
#define MINRAND 0
#define MAXRAND 50

typedef struct nodo {
  int elemento;
  struct nodo *successivo;
} nodo;

nodo* lista_crea(int n, nodo* testa);
void lista_visualizza(nodo*);
void creazione_liste(nodo*, nodo*, nodo*);

int main(int argc, char *argv[]) {

  nodo *lista = NULL;
  nodo *listapari = NULL;
  nodo *listadispari = NULL;
  int numero = 0, i=0;

  if(argc < 2) { printf("\nArgomento mancante\n"); return 0; }
  numero = atoi(argv[1]);

  for(i=0; i<numero; i++){
      lista = lista_crea(rand()%(MAXRAND-MINRAND+1)+MINRAND, lista);
  }

  lista_visualizza(lista);
  creazione_liste(lista, listapari, listadispari);

  return 0;
}

nodo* lista_crea(int n, nodo* testa){
  if(testa!=NULL){
    nodo* next = testa;
    testa = (nodo*)malloc(sizeof(nodo));
    testa -> elemento = n;
    testa -> successivo = next;
  }
  else{
    testa = (nodo*)malloc(sizeof(nodo));
    testa -> elemento = n;
    testa -> successivo = NULL;
  }
  return testa;
}

void lista_visualizza(nodo* lista){
  int numEl;
  printf("\n======================================\n");
  printf("\nLISTA:\t");
  for(numEl=0; lista; numEl++){
    printf("%d -> ", lista -> elemento);
    lista = lista -> successivo;
  }
  printf("NULL");
  if(numEl) printf("\nLa lista contiene %d elementi\n", numEl);
  else printf("\nLa lista e' vuota\n");
  printf("\n======================================");
  return;
}

void creazione_liste(nodo* lista, nodo* listapari, nodo*listadispari){
  while(lista!=NULL){
    if((lista->elemento)%2 == 0){
      listapari = lista_crea(lista->elemento, listapari);
    }
    else{
      listadispari = lista_crea(lista->elemento, listadispari);
    }
    lista = lista->successivo;
  }

  lista_visualizza(listapari);
  lista_visualizza(listadispari);
}

5 Risposte

  • Re: C - Liste, problema stampa al contrario

    Al contrario rispetto a cosa? A come li hai inseriti? L'inserimento di elementi nuovi lo fai sempre in testa. La stampa pure avviene a partire della testa, quindi...
  • Re: C - Liste, problema stampa al contrario

    Alexv ha scritto:


    Al contrario rispetto a cosa? A come li hai inseriti? L'inserimento di elementi nuovi lo fai sempre in testa. La stampa pure avviene a partire della testa, quindi...
    Si per quello non capivo, l’inserimento che faccio è sempre in testa, non capivo perché la prima lista me la stampa in quell’ordine mentre nelle ultime due in un ordine diverso.
    Cioè invece di stampare il primo elemento pari della lista stampa l’ultimo elemento pari per primo è così via…
    Può essere che per sbaglio faccio il controllo dall’ultimo elemento della lista?
  • Re: C - Liste, problema stampa al contrario

    L'ultimo elemento letto nella lista, 41, è anche l'ultimo che viene inserito in listadispari, quindi si trova in testa a listadispari, di conseguenza viene stampato per primo.
  • Re: C - Liste, problema stampa al contrario

    Alexv ha scritto:


    L'ultimo elemento letto nella lista, 41, è anche l'ultimo che viene inserito in listadispari, quindi si trova in testa a listadispari, di conseguenza viene stampato per primo.
    Quindi basta che faccio un inserimento in coda e risolvo il problema? O esiste una soluzione molto più semplice?
  • Re: C - Liste, problema stampa al contrario

    Secondo me l'inserimento in coda è la soluzione più semplice. Ci sarebbe anche la lettura a partire dalla coda, ma richiede una funzione ricorsiva o qualche altro intruglio.
Devi accedere o registrarti per scrivere nel forum
5 risposte