Null list error

Asked

Viewed 76 times

0

Guys I’m having a problem, my code is running right option 3 only the first time if return to the menu and try again it appears nulla. O case 3 is to list names in alphabetical and reverse alphabetical order (Insertord 0/ Insertdec 1);

Follows 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 works but then comes this:

inserir a descrição da imagem aqui

1 answer

0


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

I used two different lists and two variables to open and close the file. ( deleted from the code the release function). So every time I go through case 0 and 1 he 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);

That part of uploading the file and inserting did everything at the beginning of the code.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.