Ir para conteúdo
Fórum Script Brasil
  • 0

Ponteiros De Ponteiros


rodrigoteles

Pergunta

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 rodrigoteles
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --PePeLeGaL --

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

Link para o comentário
Compartilhar em outros sites

  • 0
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
Primeiro 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.
Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...