Liste c - Cancellazione nodi dispari e salvataggio su secondo file.

di il
4 risposte

Liste c - Cancellazione nodi dispari e salvataggio su secondo file.

Ciao a tutti, ho un dubbio su questo esercizio.
Quello che devo fare è prendere i dati scritti su un file "uno.txt", salvare i dati su una lista, cancellare i nodi che hanno elemento dispari e salvare la lista con soli numeri pari su un secondo file "due.txt".

L'esercizio mi funziona, solo che quando apro il file "due.txt" non mi ha scritto nessun numero, allora non capisco dove sbaglio. Questo è il codice. Grazie per l'aiuto

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

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

void lista_crea_nodo_coda(nodo** testa, int x);
void lista_crea(char* file, nodo** testa);
void lista_visualizza(nodo *testa);
int lista_canc_pos_disp(nodo **testa);
int canc_nodo(nodo** testa, nodo * node);
void lista_file(nodo* testa, char* file);


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

  if(argc!=3) {
    printf("\nErrore. Numero argomenti errati. (Inserire il nome dei due file).\n");
    return 0;
  }

  nodo* lista = NULL;
  int cn=0;

  lista_crea(argv[1], &lista);
  printf("\n");
  lista_visualizza(lista);
  cn = lista_canc_pos_disp(&lista);
  printf("\nCancellati %d nodi.\n", cn);
  lista_file(lista, argv[2]);
  printf("\n");
  lista_visualizza(lista);

  return 0;
}

void lista_crea(char* file, nodo** testa){
  FILE *fd;
  int res;
  int x;

  fd=fopen(file, "r");
  if(fd==NULL){
    perror("\Errore in apertura del file.\n");
    exit(1);
  }

  while(1){
    res=fscanf(fd, "%d", &x);
    if(res!=1)
      break;

    lista_crea_nodo_coda(testa, x);
  }
  fclose(fd);
}

void lista_crea_nodo_coda(nodo** testa, int x){
  nodo* newnode = (nodo*)malloc(sizeof(nodo));
  nodo* last = *testa;

  if(newnode!=NULL){
    newnode->elemento = x;
    newnode->successivo = NULL;

  if(*testa==NULL){
    *testa = newnode;
    return;
  }

  while(last->successivo!=NULL){
    last=last->successivo;
  }
  last->successivo = newnode;
  }
  else{
    printf("\nErrore nella creazione del nodo in memoria\n");
  }
}

void lista_visualizza(nodo *testa)
{
    while(testa!=NULL)
    {
        printf("%d -> ", testa->elemento);
        testa=testa->successivo;
    }
    printf("NULL\n");
}

int lista_canc_pos_disp(nodo **testa){
  nodo *temp = *testa;
  int c=0;

  if(*testa==NULL)
    return 0;

  while(temp!=NULL){
    if((temp->elemento%2)!=0){
      nodo *del = temp;
      temp = temp->successivo;
      c = c + canc_nodo(testa, del);
    }
    else{
      temp = temp->successivo;
    }
  }
  return c;
}

int canc_nodo(nodo** testa, nodo* node){
  nodo* temp = *testa;
  nodo *prev = NULL;

  if(temp!=NULL && temp==node){
    *testa = temp->successivo;
    free(temp);
    return 1;
  }

  while(temp!=NULL && temp!=node){
    prev = temp;
    temp = temp->successivo;
  }

  if(temp==NULL)
    return 0;

  prev->successivo = temp->successivo;

  free(temp);

  return 1;
}

void lista_file(nodo* testa, char *file){
 FILE *fp = fopen(file, "w");
 while(testa!=NULL)
 {
     // printf("%d -> ", head->data); // debug
     fprintf(fp,"%d\n",testa->elemento);
     testa=testa->successivo;
 }
}

4 Risposte

Devi accedere o registrarti per scrivere nel forum
4 risposte