Function problem for printing names - Chained list (C language)

Asked

Viewed 106 times

-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;

    }

1 answer

0

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

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 make 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);

thus, each time a new record is added, there will be a new memory space for it.

Browser other questions tagged

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