Olá, pessoal, meu nome é Valder, estou estudando Estrutura de Dados usando a linguagem C. Estou tendo dificuldades seríssimas com essa disciplina, sinseramente, não consigo entender muita coisa, já comprei 3 livros e nenhum deles consegue me fazer entender.
Quando penso que estou entendendo, começa a dar um monte de erros nos códigos, já estou até desencanando.
Será que alguém pode me ajudar com esse pequeno problema de lista encadeada ?
É o seguinte, criei uma lista simplesmente encadeada com os dados número, nome, endereço e cidade. As coisas até que estão funcionando bem, alocação de memória, inserção na lista, liberação de espaço em memória, etc.
O problema é que na hora de imprimir os dados ocorrem algumas coisas que não entendo. Estou usando o gets para capturar os dados do tipo char e o scanf para o dado inteiro. na hora da impressão o programa simplesmente não imprime o nome do dado, ou o nome da cidade, ou algum dado do tipo char, dependendo da mudança que faço no código. já fiz inúmeras, em todas o programa não imprime algum tipo de dado.
Outra coisa que não entendo é por que na explicação da teoria o autor usa ponteiro e no exemplo prático recebe um ponteiro de ponteiro na função void cria_lista e void insere_esquerda, por exemplo.
Tenho outras dúvidas, mas prefiro ir pedindo ajuda aos poucos.
Alguém pode me ajudar, por favor ?
O código está abaixo:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
struct lista
{
int nro;
char nome[40];
char endereco[30];
char cidade[20];
struct lista *prox;
};
void cria_lista(struct lista **inicio, struct lista **fim)
{
*inicio = NULL;
*fim = NULL;
}
void insere_esquerda(struct lista **inicio, struct lista **fim, int numero,
char *nome, char *endereco, char *cidade, int *status)
{
struct lista *p; //variável p representa um ponteiro
p = (struct lista*)malloc(sizeof(struct lista));
if(p == NULL)
*status = 0;
else
{
p->nro = numero;
strcpy(p->nome, nome);
strcpy(p->endereco, endereco);
strcpy(p->cidade, cidade);
p->prox = *inicio;
if(*inicio = NULL)
*fim = p;
*inicio = p;
*status = 1;
}
}
void mostra_lista(struct lista *inicio)
{
struct lista *aux;
aux = inicio;
printf("Lista :");
while(aux!=NULL)
{
printf("\nNumero.....: %d\t", aux->nro);
printf("\nNome.......: %s\t", aux->nome);
printf("\nEndereco...: %s\t", aux->endereco);
printf("\nCidade.....: %s\t", aux->cidade);
aux = aux->prox;
printf("\n");
}
}
void libera_lista(struct lista **inicio, struct lista **fim)
{
struct lista *aux;
aux = *inicio;
while(aux != NULL)
{
*inicio = (*inicio)->prox;
free(aux);
aux = *inicio;
}
*fim = NULL;
}
int main ()
{
struct lista *ptri, *ptrf;
int x;
int num, ok;
char nome[20], endereco[15], cidade[15];
// Chama a rotina cria_lista
cria_lista(&ptri, &ptrf);
// Lê dados digitados e os insere na lista
for (x = 1; x <= 2; x++)
{
printf("Digite o numero do dado: ");
scanf("%d", &num); fflush(stdin);
printf("Digite o nome do dado: ");
gets(nome); fflush(stdin);
printf("Digite o endereco do dado: ");
gets(endereco); fflush(stdin);
printf("Digite a cidade do dado: ");
gets(cidade); fflush(stdin);
printf("\n");
insere_esquerda(&ptri, &ptrf, num, nome, endereco, cidade, &ok);
if(ok == 0) printf("Problema na alocacao de memoria");
}
// Procedimnt para mostrar a lista
mostra_lista(ptri);
scanf("%i", &num);
libera_lista(&ptri, &ptrf);
return 0;
getch();
}
Pergunta
Valder
Olá, pessoal, meu nome é Valder, estou estudando Estrutura de Dados usando a linguagem C. Estou tendo dificuldades seríssimas com essa disciplina, sinseramente, não consigo entender muita coisa, já comprei 3 livros e nenhum deles consegue me fazer entender.
Quando penso que estou entendendo, começa a dar um monte de erros nos códigos, já estou até desencanando.
Será que alguém pode me ajudar com esse pequeno problema de lista encadeada ?
É o seguinte, criei uma lista simplesmente encadeada com os dados número, nome, endereço e cidade. As coisas até que estão funcionando bem, alocação de memória, inserção na lista, liberação de espaço em memória, etc.
O problema é que na hora de imprimir os dados ocorrem algumas coisas que não entendo. Estou usando o gets para capturar os dados do tipo char e o scanf para o dado inteiro. na hora da impressão o programa simplesmente não imprime o nome do dado, ou o nome da cidade, ou algum dado do tipo char, dependendo da mudança que faço no código. já fiz inúmeras, em todas o programa não imprime algum tipo de dado.
Outra coisa que não entendo é por que na explicação da teoria o autor usa ponteiro e no exemplo prático recebe um ponteiro de ponteiro na função void cria_lista e void insere_esquerda, por exemplo.
Tenho outras dúvidas, mas prefiro ir pedindo ajuda aos poucos.
Alguém pode me ajudar, por favor ?
O código está abaixo:
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> struct lista { int nro; char nome[40]; char endereco[30]; char cidade[20]; struct lista *prox; }; void cria_lista(struct lista **inicio, struct lista **fim) { *inicio = NULL; *fim = NULL; } void insere_esquerda(struct lista **inicio, struct lista **fim, int numero, char *nome, char *endereco, char *cidade, int *status) { struct lista *p; //variável p representa um ponteiro p = (struct lista*)malloc(sizeof(struct lista)); if(p == NULL) *status = 0; else { p->nro = numero; strcpy(p->nome, nome); strcpy(p->endereco, endereco); strcpy(p->cidade, cidade); p->prox = *inicio; if(*inicio = NULL) *fim = p; *inicio = p; *status = 1; } } void mostra_lista(struct lista *inicio) { struct lista *aux; aux = inicio; printf("Lista :"); while(aux!=NULL) { printf("\nNumero.....: %d\t", aux->nro); printf("\nNome.......: %s\t", aux->nome); printf("\nEndereco...: %s\t", aux->endereco); printf("\nCidade.....: %s\t", aux->cidade); aux = aux->prox; printf("\n"); } } void libera_lista(struct lista **inicio, struct lista **fim) { struct lista *aux; aux = *inicio; while(aux != NULL) { *inicio = (*inicio)->prox; free(aux); aux = *inicio; } *fim = NULL; } int main () { struct lista *ptri, *ptrf; int x; int num, ok; char nome[20], endereco[15], cidade[15]; // Chama a rotina cria_lista cria_lista(&ptri, &ptrf); // Lê dados digitados e os insere na lista for (x = 1; x <= 2; x++) { printf("Digite o numero do dado: "); scanf("%d", &num); fflush(stdin); printf("Digite o nome do dado: "); gets(nome); fflush(stdin); printf("Digite o endereco do dado: "); gets(endereco); fflush(stdin); printf("Digite a cidade do dado: "); gets(cidade); fflush(stdin); printf("\n"); insere_esquerda(&ptri, &ptrf, num, nome, endereco, cidade, &ok); if(ok == 0) printf("Problema na alocacao de memoria"); } // Procedimnt para mostrar a lista mostra_lista(ptri); scanf("%i", &num); libera_lista(&ptri, &ptrf); return 0; getch(); }Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.