Null list error

0

I'm having a problem, my code is running right the 3 option only the first time if I go back to the menu and try again it appears nulla. The case 3 is to list a list of names in reverse alphabetical and alphabetical order (InsertOrd 0 / InsertDec 1);

Follow the code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <locale.h>
#define N 10000
typedef struct Lista {
    char *data;
    struct Lista *next;
} Lista;

//Ordem Crescente
struct Lista *InsertOrd(struct Lista *head, const char *data) {
    struct Lista *newp;
    struct Lista *tmp;
    char *new_data;

    /* aloca o novo item */
    newp = ((struct Lista*)malloc(sizeof(struct Lista)));
    new_data = strdup(data);
    //strdup aloca memória na pilha.
    if (newp == NULL || new_data == NULL) {
        fprintf(stderr, "out of memory");
        return NULL;
    }
    newp->data = new_data;
    newp->next = NULL;

    /* check if element should be inserted at the head */
    if (head == NULL || strcmp(new_data, head->data) < 0) {
        newp->next = head;
        head = newp;
    } else {
        /* otherwise find the point of insertion */
        tmp = head;
        while (tmp->next && strcmp(new_data, tmp->next->data) >= 0) {
            tmp = tmp->next;
        }
        newp->next = tmp->next;
        tmp->next = newp;
    }
    return head;
}

//Ordem decrescente 
struct Lista *InsertDec(struct Lista *head, const char *data) {
    struct Lista *newp;
    struct Lista *tmp;
    char *new_data;

    /* aloca o novo item */
    newp = ((struct Lista*)malloc(sizeof(struct Lista)));
    new_data = strdup(data);
    //strdup aloca memória na pilha.
    if (newp == NULL || new_data == NULL) {
        fprintf(stderr, "out of memory");
        return NULL;
    }
    newp->data = new_data;
    newp->next = NULL;

    /* verificar  o elemento deve ser inserido na cabeça*/
    if (head == NULL || strcmp(new_data, head->data) < 0) {
        newp->next = head;
        head = newp;
    } else {
        /* caso contrário, encontre o ponto de inserção */
        tmp = head;
        while (tmp->next && strcmp(new_data, tmp->next->data) <= 0) {
            tmp = tmp->next;
        }
        newp->next = tmp->next;
        tmp->next = newp;
    }
    return head;
}

void liberar(struct Lista *filmes)
{
     while (filmes != NULL) {
        struct Lista *next = filmes->next;
        free(filmes->data);
        free(filmes);
        filmes = next;
    }
}
void escrever(struct Lista * film,struct Lista * filmes)
{

    for (film = filmes; film != NULL; film = film->next) {
        printf("\n Nome: %s", film->data);
    }
}
int main()
{
    struct Lista *filmes;
    struct Lista *film;
    FILE *arq;
    char linha[600];
    int opcao;
      /* insert the items */
    filmes = NULL;
    /* open the file */
    arq = fopen("asd.txt", "r");
    if (arq == NULL) {
        printf("Ocorreu um erro!");
        return 1;
    }

do{
    printf("\n1- Listar todos os atores da lista em ordem alfabetica e alfabetica reversa");
    printf("\n2- Listar todos os filmes de um determinado ator em ordem cronologica.");
    //\n Os filmes que não tiverem a informação de ano são mostrados em último lugar
    printf("\n3- Listar todos os filmes em ordem alfabetica e alfabetica reversa");
    printf("\n4- Inserir novo filme");
    printf("\n5- Remocao de filmes");
    printf("\n6-SAIR DO PROGRAMA");
    printf("\n");
    scanf("%d",&opcao);
    if(opcao<1 || opcao>6){
        printf("\nO numero que voce digitou eh invalido!\n Por favor tente novamente.\n");
    }
    switch(opcao)
    {
        case 1: 


        break;
        case 2: 
        break;



        case 3: 


        printf("\n Voce gostaria de listar em ordem alfabetica ou alfabetica reversa (0/1) :");
        int op;

                scanf("%d",&op);
                if(op!=0 && op!=1)
                {
                    printf("\n Voce precisa digita o numero 1 ou 0 apenas!\n");
                }



        switch(op){
            case 0:
                 while (fgets(linha, sizeof linha, arq)) {
                 char *p = strtok(linha, ",");
                 filmes = InsertOrd(filmes, p);
                  }

              fclose(arq);
              escrever(film,filmes);
              liberar(filmes);

                break;
                case 1:
                while (fgets(linha, sizeof linha, arq)) {
                 char *p1 = strtok(linha, ",");
                 filmes = InsertDec(filmes, p1);
                  }

              fclose(arq);
              escrever(film,filmes);
              liberar(filmes);

                    break;
        }


        break;
        case 4: 
        break;
        case 5: 
        break;
        case 6: 
        printf("\nSaindo do programa...");
        break;
    }
}while(opcao!=6);









   // escrever(film,filmes);


    /* free the list */
    while (filmes != NULL) {
        struct Lista *next = filmes->next;
        free(filmes->data);
        free(filmes);
        filmes = next;
    }
    return 0;
}

Does anyone know why this is happening? The first time I run either option 1 or 0 of case 3 it works but then this appears:

    
asked by anonymous 26.05.2018 / 21:06

1 answer

0

Solution : In case 0 and case 1 that are within case 3 were being inserted the data in the same list and finally releasing. (Both 0 and 1)

I used two different lists and two variables to open and close the file. (deletei the code to release function). So every time I go through case 0 and 1 it just writes;

arq = fopen("n.txt", "r");
arq2 = fopen("n.txt", "r");

if (arq == NULL) {
    printf("Ocorreu um erro!");
    return 1;
}

if (arq2 == NULL) {
    printf("Ocorreu um erro!");
    return 1;
}

while (fgets(linha, sizeof linha, arq)) {
    char *p = strtok(linha, ",");
    filmes = InsertOrd(filmes, p);
}

fclose(arq);

while (fgets(linha, sizeof linha, arq2)) {
    char *p1 = strtok(linha, ",");
    filmes2 = InsertDec(filmes2, p1);
}

fclose(arq2);

This part of loading the file and inserting it did everything at the beginning of the code.

    
28.05.2018 / 14:23