Chained List Value Printing - Pointer Problem (C Language)

Asked

Viewed 83 times

1

I’m having trouble printing out the values on my list. I believe the function is right, however the following error is happening when I try to compile: "error: expect declaration specifiers or .. before & token".

I believe there is an error in the function parameterization. I am using the address of the list struct, but it is not working.

I ask for an explanation of the problem and the solution.

The problem happens in the

main() {
...
...

imprime_valores(&p2_main);

}

Complete code

#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 * prox;
} 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->prox = 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->prox = l->cauda; //antigo primeiro aponta para o próximo
    l->cauda = novo; // novo nodo recebe ponteiro para começo
    printf("nodo implementado!!");
    return novo;
}

//FUNÇÕES PARA UTILIZAR NO MAIN

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

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

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

    do {
        printf("Digite 1 para continuar:\n");
        scanf("%d", &escolha1);

        criar_registro(&p1_main);
        insere_ini(&p2_main, &p1_main);
    }
    while ( escolha1 != 0);
}

imprime_nomes(&p2_main);

1 answer

0


The call of imprime_nomes is out of the main. The main should look more like:

int main(){
    registro *p1_main;
    lista   *p2_main;
    int escolha1, escolha2;

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

    do {
        printf("Digite 1 para continuar:\n");
        scanf("%d", &escolha1);

        criar_registro(&p1_main);
        insere_ini(&p2_main, &p1_main);
    }
    while ( escolha1 != 0);

    imprime_nomes(&p2_main);
}

There are also two more mistakes.

  1. p2_main is a pointer, but you never gave a value to p2_main before using within criarLista.

  2. criarLista expecting a lista*, that is, a pointer to a lista, but you passed &p2_main, the address of p2_main. This address has the type of lista**, or a pointer to a pointer to a lista.

It seems that the same mistakes apply to p1_main. Can correct both errors by switching lines:

registro *p1_main;
lista *p2_main;

with:

registro p1_main;
lista p2_main;
  • Perfect! I have made the changes and is partially working the program. When it prints the values I have recorded, they appear in sequence of the number of records performed, but only the last name. Nodes are being correctly innervated in the list, but something is still missing...

Browser other questions tagged

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