-1
I’m having trouble to print out the names I am registering in this program.
I’m inserting elements in a record: login, name and values. Each new element is inserted in a chain list.
For example, if I made three separate records like Victor, Mayko and Itamar the program appears as follows:
Name eh Itamar.
Name eh Itamar.
Name eh Itamar.  
I believe there’s 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;
                }
    }
Follows full 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;
    }