How to generate a file from a doubly chained list?

Asked

Viewed 80 times

-1

I could not in any way make my program save on file at the end.

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


struct stNo {
    int info;
    char nome[50];
    char email[60];
    char celular[11];
    int idade;
    struct stNo *ant,*prox;
};


struct stNo *cria_no() {
    struct stNo *p;
    if ((p = (struct stNo *) malloc(sizeof(struct stNo))) == NULL)
        return NULL;
    else {
        p->prox = NULL;
        return p;
    }
}





void insereLista(struct stNo **list){
    struct stNo *p,*q;
    int n,idade1;
    char name[50],email1[60],celular1[11];
    fflush(stdin);
    printf("\nDigite o valor do nó:");
    scanf("%i",&n);
    fflush(stdin);
    printf("\nDigite o nome:");
    gets(name);
    fflush(stdin);
    printf("\nDigite o email:");
    gets(email1);
    fflush(stdin);
    printf("\nDigite o celular:");
    gets(celular1);
    fflush(stdin);
    printf("\nDigite o valor da idade:");
    scanf("%i",&idade1);
    fflush(stdin);
    if(*list==NULL){ //lista vazia
        p = cria_no();
        *list = p;
        p->ant = NULL;
        p->prox = NULL;
        p->info = n;
        p->idade = idade1;
        strcpy(p->nome,name);
        strcpy(p->email,email1);
        strcpy(p->celular,celular1);
        
    }else{
        p=*list;
        while(p->prox!=NULL)
            p=p->prox;
            q = cria_no();
            p->prox = q;
            q->prox = NULL;
            q->ant = p;
            q->info = n;
            q->idade = idade1;
            strcpy(q->nome,name);
            strcpy(q->email,email1);
            strcpy(q->celular,celular1);
        };
};

void mostraLista(struct stNo **list){
    struct stNo *p;
    if(*list!=NULL){
        p=*list;
        while(p->prox!=NULL){
            printf(" %i->",p->info);
            printf(" %s->",p->nome);
            p = p->prox;
        };
        printf(" %i->",p->info);
        printf(" %s",p->nome);
    }
    else printf("\nLista Vazia");
};

void visualizarLista(struct stNo **list){
    struct stNo *p;
    int n;
    char compNome[50];
    printf("\nDigite o nome: ");
     fflush(stdin);
    gets(compNome);
    if(*list!=NULL){
        p=*list;
        while(p->prox!=NULL && strcmp(compNome,p->nome) !=0 ){
            p = p->prox;
        };
        if(strcmp(compNome,p->nome)==0){
            printf("\nCódigo: %d",p->info);
            printf("\nNome: %s",p->nome);
            printf("\nEmail: %d",p->email);
            printf("\nCelular: %s",p->celular);
            printf("\nIdade: %d",p->idade);
        };
    }
    else printf("\nLista Vazia");
};

void alterarLista(struct stNo **list){
    struct stNo *p;
    int n,idade1;
    char name[50],email1[60],celular1[11];
    char compNome[50];
    printf("\nDigite o nome que sera alterado: ");
     fflush(stdin);
    gets(compNome);
    if(*list!=NULL){
        p=*list;
        while(p->prox!=NULL && strcmp(compNome,p->nome) !=0 ){
            p = p->prox;
        };
        if(strcmp(compNome,p->nome)==0){
            
    printf("\nDigite o novo valor do nó:");
    scanf("%i",&n);
    fflush(stdin);
    printf("\nDigite o novo nome:");
    gets(name);
    fflush(stdin);
    printf("\nDigite o novo email:");
    gets(email1);
    fflush(stdin);
    printf("\nDigite o novo celular:");
    gets(celular1);
    fflush(stdin);
    printf("\nDigite o novo valor da idade:");
    scanf("%i",&idade1);
    fflush(stdin);
            p->info = n;
            p->idade = idade1;
            strcpy(p->nome,name);
            strcpy(p->email,email1);
            strcpy(p->celular,celular1);
            
            printf("\nNovos dados do usuario: ");
            printf("\nCódigo: %d",p->info);
            printf("\nNome: %s",p->nome);
            printf("\nEmail: %d",p->email);
            printf("\nCelular: %s",p->celular);
            printf("\nIdade: %d",p->idade); 
    
        };
    }
    else printf("\nLista Vazia");
};

void excluirQualquer(struct stNo **list){
    
    struct stNo *p;
    char compNome[50];
    p = *list;
    if(*list==NULL){
        printf("\nLista Vazia");
    }else{
    
    
    printf("\nDigite o nome: ");
     fflush(stdin);
    gets(compNome);
    if(*list!=NULL) //lista vazia
    p = *list;
    while(p->prox!=NULL && strcmp(compNome,p->nome) !=0){
        p=p->prox;
    }     
         
         if(p->ant == NULL){
            *list = p->prox;
         }else{
            p->ant->prox = p->prox;      
         }
            
         if(p->prox != NULL)
         p->prox->ant = p->ant;
         free(p);
         printf("\nExcluido com sucesso. ");        
}
};





main(){
    setlocale(LC_ALL,"Portuguese");
    struct stNo *lista;
    int menu;
    lista = NULL; // inicializando a lista vazia

    do{
        system("cls");
        printf("\n");
        mostraLista(&lista);
        printf("\n\n");
        printf("[1-Inserir] ");
        printf("[2-Visualizar] ");
        printf("[3-Alterar] ");
        printf("[4-Excluir] ");
        printf("[5-Sair] ");
        printf("Opção:");
        scanf("%i",&menu);
        switch(menu){
            case 1 :    insereLista(&lista);
                        break;          
            case 2 :    visualizarLista(&lista);
                        break;
            case 3 :    alterarLista(&lista);
                        break;  
            case 4 :    excluirQualquer(&lista);
                        break;                  
            case 5 :    printf("\nSaindo...");
                        break;
            default:    printf("\nCódigo Inválido");
        }
        printf("\n");system("pause");
        }while(menu!=5);
}
  • you haven’t even tried to implement the logic of saving. Tip: scrolls through the list to find out how many elements there are, saves the amount of elements at the beginning of the file to make it easier to read when loading the data in a future execution of the program.

1 answer

0

Hello, this is because your entire program is not using any file saving method :) If you want to save your list, you can use the FILE* type variable and after that use the fwrite and fread functions to write and read the file respectively. Finally, you cannot forget to put fclose(arquivo_var); to save the document. Here is an example:

FILE* file_var = fopen('Name of your file', "w"); // this w means 'write' and creates a file if it does not yet exist fwrite(q->name , strlen(q->name), sizeof(q->name), arquivo_var); fclose(arquivo_var);

  • yes that part I understood, but I’m not able to apply, or turn it into a function.

Browser other questions tagged

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