Problem in function to print names - List chain (C language)

-1

I'm having trouble printing the names I'm registering in this program.

I'm inserting elements into a record: login, name, and values. Each new element is inserted in a chained list .

For example, if I made three distinct records like Victor, Mayko and Itamar the program appears as follows:

Name eh Itamar.
Name eh Itamar.
Name is Itamar.

I believe there is an error in this code:

void imprime_nomes(lista *l){            // função que imprime os valores
            nodo* p = l->cauda;
                while(p)
                {                                           // Usando while, não é necessário estabelecer um loop para percorrer toda lista.
                printf("Login eh: %s\n", p->dado->login);
                printf("Nome eh: %s\n", p->dado->nome);
                p = p->dir;
                }
    }

Follow the complete code:

<stdlib.h>

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



    typedef struct registro_st{         // sequência de objetos do mesmo tipo
        char login[50];
        char nome[50];
        float valor;
        struct registro *prox;
    } registro;

    typedef struct nodo_st{
        registro *dado;
        struct nodo_st *dir;
        struct nodo_st *esq;
    } nodo;

    typedef struct Lista_st{
        nodo *cabeca;
        nodo *cauda;
        int tamanho;
    } lista;

    nodo* CriarNodo(registro * p){
            nodo* n;
            n = (nodo*)malloc(sizeof(nodo));
            n->dado = p;
            n->dir = NULL;
            n->esq = NULL;
            return n;
    }

    void criarLista(lista *l){
        l->cauda = NULL;
        l->cabeca = NULL;
        l->tamanho = 0;
    }



    void insere_ini(lista *l, registro* dado){
        nodo* novo = (nodo*)malloc(sizeof(nodo));
            if(novo == NULL){
                return 0; //falta de espaço
            };


            novo->dado = dado;
            novo->dir = l->cauda; //antigo primeiro aponta para o próximo
            l->cauda = novo;        // novo nodo recebe ponteiro para começo
            l->tamanho = l->tamanho + 1;
            printf("\n\nEsse foi o registro de num: %d.\n", l->tamanho);
            printf("\nnodo implementado!!\n");
            return novo;
    }


    }

    //FUNÇÕES PARA UTILIZAR NO MAIN

    void imprime_nomes(lista *l){            // função que imprime os valores
            nodo* p = l->cauda;
                while(p)
                {                                           // Usando while, não é necessário estabelecer um loop para percorrer toda lista.
                printf("Login eh: %s\n", p->dado->login);
                printf("Nome eh: %s\n", p->dado->nome);
                p = p->dir;
                }
    }

    void criar_registro(registro *p){                   //função para adicionar os contatos
        printf("Qual login para registro:\n");
        scanf("%s", &p->login);
        printf("Qual o nome do contato:\n");
        scanf("%s", &p->nome);
        printf("Qual valor para registrar:\n");
        scanf("%f", &p->valor);
    }

    int main(){

    registro p1_main;
    lista   p2_main;
    int escolha1 = 99, escolha2;


    criarLista(&p2_main); //cria a lista para salvar os nodos.

    do {
        printf("Qual opção a seguir você deseja realizar?\n\n1-Adicionar Contato\n2-Apresentar nomes registrados\n\n");
        scanf("%d", &escolha1);

    switch(escolha1){
        case 1:
            criar_registro(&p1_main);
            insere_ini(&p2_main, &p1_main);
            break;
        case 2:
            imprime_nomes(&p2_main);

        }
    }

    while ( escolha1 != 0);


    return 0;

    }
    
asked by anonymous 23.07.2017 / 00:21

1 answer

0

The problem is that you are statically allocating the variable p1_main, so every time you call it:

criar_registro(&p1_main);
insere_ini(&p2_main, &p1_main);

is the same record that you are changing and adding to the list. You should do dynamic allocation of p1_main, as follows:

case 1:
        p1_main = (registro*)calloc(1, sizeof(registro));
        criar_registro(p1_main);
        insere_ini(p2_main, p1_main);

So, every time a new record is added, there will be a new memory space for it.

    
09.08.2017 / 18:18