rodrigoteles Postado Fevereiro 14, 2007 Denunciar Share Postado Fevereiro 14, 2007 (editado) Eu to tentando aprender ponteiros, mas não to conseguindo entender esse códigoEu peguei esse codigo num livro, é uma lista encadeada sem cabeça:#include <stdio.h>#include <stdlib.h>struct nodo{ int dados; struct nodo* proximo;};void cria_lista(struct nodo **inicio, struct nodo **fim){ *inicio = NULL; *fim = NULL;}void insere_esquerda(struct nodo **inicio, struct nodo **fim, int valor, int *status){ struct nodo *p; p = (struct nodo*)malloc(sizeof(nodo)); if ( p ==NULL) *status = 0; else { p -> dados = valor; p -> proximo = *inicio; if (*inicio = NULL) *fim = p; *inicio = p; }}int main(){ struct nodo *ptri,*ptrf; int x,num,ok; cria_lista(&ptri,&ptrf); ---> (1) for( x = 1; x <= 10; x++) { printf("Digite um valor qualquer: "); scanf("%i",&num); fflush(stdin); insere_esquerda(&ptri,&ptrf,num,&ok); } return 0;}Peguntas1) Em (1) porque eu tenho que passar &ptri como parametro e não somente ptri? 2) Qual a diferença se os parametros da função cria_lista fosse somente *inicio e *fim,e se eu chamasse ela assim: struct nodo *ptri;struct nodo *ptrf;cria_lista(ptri,ptrf)2) É possível implementar esse programa sem usar ponteiro de ponteiro?alguém pode me ajudar?[]´s Editado Fevereiro 15, 2007 por rodrigoteles Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 PePeLeGaL Postado Fevereiro 20, 2007 Denunciar Share Postado Fevereiro 20, 2007 respondendo em partes... ;) você tem que passar o & porque nos parametros da funcao cria... voce passou ponteiro de ponteiro. Se você passasse apenas ponteiro, você não teria que colocar. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Fevereiro 20, 2007 Denunciar Share Postado Fevereiro 20, 2007 Nesse código é necessário ponteiro para ponteiro, porque as rotinas necessitam de mudar o valor dos ponteiros da lista em cada operação. Se você tirar um * o código não vai funcionar porque ao rodar um comando como *inicio = NULL você estaria colocando null no registro, e não no ponteiro para esse registro como deveria ser. E causará erro de compilação. Ou o comando inicio = NULL, você estaria modificando o ponteiro, mas não o ponteiro da lista, apenas a cópia dele que foi criada pela rotina e que terá o seu valor perdido. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --PePeLeGaL -- Postado Fevereiro 21, 2007 Denunciar Share Postado Fevereiro 21, 2007 quando eu disse que funciona eu tinha certeza. Eu testei antes de responder ao tópico. Segue a prova abaixo. Teste antes de postar qualquer resposta :angry: #include<stdio.h> #include<stdlib.h> struct nodo { int dados; struct nodo* proximo; }; void cria_lista(struct nodo *inicio, struct nodo *fim) { inicio = NULL; fim = NULL; } void insere_esquerda(struct nodo **inicio, struct nodo **fim, int valor, int *status) { struct nodo *p; p = (struct nodo*)malloc(sizeof(struct nodo)); if ( p == NULL) *status = 0; else { p -> dados = valor; p -> proximo = *inicio; if (*inicio = NULL) *fim = p; *inicio = p; } } int main() { struct nodo *ptri,*ptrf; int x,num,ok; cria_lista(ptri, ptrf); for( x = 1; x <= 10; x++) { printf("Digite um valor qualquer: "); scanf("%i",&num); fflush(stdin); insere_esquerda(&ptri,&ptrf,num,&ok); } while(ptri != NULL) { printf("%d\n",ptri->dados); ptri = ptri->proximo; if(ptri->proximo == NULL) break; } return 0; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Fevereiro 21, 2007 Denunciar Share Postado Fevereiro 21, 2007 quando eu disse que funciona eu tinha certeza. Eu testei antes de responder ao tópico. Segue a prova abaixo. Teste antes de postar qualquer respostaPrimeiro que eu não sei se você é a mesma pessoa que respondeu antes porque você não está logado. Mas, no caso da função cria_lista você estaria passando os ponteiros como parametro e modificando somente a cópia deles, ou seja, o mesmo que não fazer nada já que seu valor atribuido não é usado posteriormente. E o objetivo é mudar o valor da variavel do tipo ponteiro que é passado como parametro. Então isso é passagem de ponteiro como parametro por referencia. E na função insere_esquerda você ainda continua passando ponteiros de ponteiros, como é a maneira correta. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
rodrigoteles
Eu to tentando aprender ponteiros, mas não to conseguindo entender esse código
Eu peguei esse codigo num livro, é uma lista encadeada sem cabeça:
#include <stdio.h>
#include <stdlib.h>
struct nodo
{
int dados;
struct nodo* proximo;
};
void cria_lista(struct nodo **inicio, struct nodo **fim)
{
*inicio = NULL;
*fim = NULL;
}
void insere_esquerda(struct nodo **inicio, struct nodo **fim, int valor, int *status)
{
struct nodo *p;
p = (struct nodo*)malloc(sizeof(nodo));
if ( p ==NULL)
*status = 0;
else
{
p -> dados = valor;
p -> proximo = *inicio;
if (*inicio = NULL)
*fim = p;
*inicio = p;
}
}
int main()
{
struct nodo *ptri,*ptrf;
int x,num,ok;
cria_lista(&ptri,&ptrf); ---> (1)
for( x = 1; x <= 10; x++)
{
printf("Digite um valor qualquer: ");
scanf("%i",&num); fflush(stdin);
insere_esquerda(&ptri,&ptrf,num,&ok);
}
return 0;
}
Peguntas
1) Em (1) porque eu tenho que passar &ptri como parametro e não somente ptri?
2) Qual a diferença se os parametros da função cria_lista fosse somente *inicio e *fim,e se eu chamasse ela assim:
struct nodo *ptri;
struct nodo *ptrf;
cria_lista(ptri,ptrf)
2) É possível implementar esse programa sem usar ponteiro de ponteiro?
alguém pode me ajudar?
[]´s
Editado por rodrigotelesLink para o comentário
Compartilhar em outros sites
4 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.