Curso de Programação C | Como inserir no início de uma Lista Simplesmente Encadeada? | aula 243

Поділитися
Вставка
  • Опубліковано 2 лют 2025

КОМЕНТАРІ • 54

  • @matheusalves3489
    @matheusalves3489 3 роки тому +8

    Mano aprendi muito com todas essas aulas, conteúdo maravilhoso...

    • @programeseufuturo
      @programeseufuturo  3 роки тому

      Fico muito feliz em saber Matheus 😀
      Obrigado pelo feedback.

  • @pedrobatista1389
    @pedrobatista1389 2 роки тому +2

    Mais uma aula MUITO boa Mestre!
    Obrigado.

  • @viniciusleitecosta
    @viniciusleitecosta 3 роки тому +2

    Assistindo aqui professor, abçs.

  • @juniorvalente1483
    @juniorvalente1483 Рік тому

    Caramba, simplesmente excelente!!! Muito obrigado.

  • @anthonymeds4440
    @anthonymeds4440 Рік тому

    Conteúdo muito bom!! Parabéns.

  • @joaovitordantas4941
    @joaovitordantas4941 Рік тому +2

    Fala cara, tudo certo? Video 10!! Uma dúvida, se eu usar uma struct lista que aponta para o primiero nó da lista tem diferença? Vi que você apresenta sempre das duas maneiras, uma de ponteiro para ponteiro e outra criando uma struct da estrutura abordada. Mas sempre prefere passar ponteiro para ponteiro, pq?

  • @Ruan-tp7cn
    @Ruan-tp7cn 6 місяців тому +1

    1:17 pq eu n poderia declarar o proximo só usando "No *proximo" e declarar o typedef sem o primeiro apelido?

  • @hugo-garcia
    @hugo-garcia 2 роки тому +25

    Tô muito ferrado, perdi dezenas de horas estudando e entendi foi nada

    • @deathman_3740
      @deathman_3740 10 місяців тому

      Talvez você pulou muitas etapas, as vezes é só isso. Mas já tem uma ano já, a esse ponto vc já deve ter entendido kkkk

    • @bigpatrao1277
      @bigpatrao1277 9 місяців тому

      @@deathman_3740 eu to que nem ele

    • @santedu
      @santedu 9 місяців тому

      @@bigpatrao1277 somos 3 então

    • @exp1608
      @exp1608 9 місяців тому

      @@santedu Minha vez...

    • @R0bertyy
      @R0bertyy 4 місяці тому

      ​@@exp1608 agr é a minha vez kkkkkkkkk

  • @michelyserras9992
    @michelyserras9992 Рік тому

    A inserção de dados no inicio de uma lista duplamente encadeada funcionaria da mesma maneira?

  • @pedroeugenio757
    @pedroeugenio757 3 роки тому +1

    Professor tenho duas duvidas.
    1ª Posso dizer que esse ponteiro "novo" seria uma especie de variável aux, ou seja, tem a função de trocar os valores para não perder os apontamentos?
    2º Com base no uso de TAD, esses tratamentos de erros podem ficar na main? Ex: ao invés de usar o printf na linha 24, poderia colocar um return -1, e dentro da main, verificar se o retorno foi -1, e só então dizer ao usuário, ou é melhor dentro das funções mesmo?

    • @programeseufuturo
      @programeseufuturo  3 роки тому

      Olá Pedro.
      1) Não necessariamente. Esse ponteiro novo é uma variável, perceba que há aí uma alocação dinâmica de memória. Alocamos memória para um nó e inserimos esse nó na lista. Toda inserção cria um novo nó.
      2) Sim, podem ficar na main.

  • @Leossj1
    @Leossj1 Рік тому

    Se eu inserisse mais um valor no início dessa lista encadeada, o valor que antes já estava no início é passado para a segunda posição ou é sobrescrevido?

  • @gumiero7701
    @gumiero7701 2 роки тому +4

    1:46 a partir daqui eu ja bugo todo, ponteiro de ponteiro wtf

  • @ltcqqn
    @ltcqqn 2 роки тому +3

    oi, professor. eu n entendi algo simples em relacao a structs.
    costumo declarar dessa forma:
    typedef struct {
    int valor;
    struct no *proximo;
    }no;
    no video, eu n entendi pq é feito:
    typedef struct no{
    int valor;
    struct no *proximo;
    }No;
    voltei algumas aulas pra tentar entender, mas continuo em duvida.

    • @programeseufuturo
      @programeseufuturo  2 роки тому +6

      Olá.
      Eu nunca testei da forma como você faz, não sei te dizer se vai funcionar sempre.
      A forma como eu faço, assim:
      typedef struct no{
      int valor;
      struct no *proximo;
      }No;
      é simples. O computador não entende C, java, C++ ou qualquer outra linguagem de programação. O computador entende apenas linguagem de máquina, que no caso do C é obtida após o processo de compilação. A compilação é feita no mesmo sentido em que lemos um livro, ou seja, de cima para baixo, da esquerda para a direita. Assim, em teoria, quando você faz struct no *proximo o compilador não sabe quem é struct no porque na primeira linha você usou apenas struct.
      É importante entender que há duas operações sendo feitas no meu código. A primeira é a criação da struct, que em sua forma mais simples pode ser feita assim:
      struct no{
      int valor;
      struct no *proximo;
      }
      Dessa forma, toda vez que precisarmos criar uma variável desse tipo precisamos escrever "struct no". Isso pode se tornar longo e cansativo, principalmente se você tiver muitas estruturas. Há uma forma de abreviar isso renomeando nossa estrutura. Typedef serve para isso, renomear estruturas. Meu código pode ser reescrito assim:
      struct no{ //cria a estrutura struct no
      int valor;
      struct no *proximo;
      }
      typedef struct no No; // renomeia a estrutura para No

  • @zz_diogo
    @zz_diogo Рік тому

    e se na minha estrutura eu tiver dados do tipo string, teria de usar strcpy?

  • @luizotavio5838
    @luizotavio5838 Рік тому +4

    Deu de entender super bem, mas as sintaxes pra mim ainda são confusas. Tipo pq usar void, por que usar malloc. Eu estudei python no primeiro semestre e tudo era mas simples.

    • @Lucihful
      @Lucihful 5 місяців тому

      Void é pq a função não tem retorno, e o malloc é para alocar dinamicamnete um espaço na memória.

  • @PedroHenrique-hk6yy
    @PedroHenrique-hk6yy 11 місяців тому

    a variavel "lista" é a cabeça dessa lista?

  • @ウェンディ-m7e
    @ウェンディ-m7e Рік тому +1

    Nao consigo compreender 😢 ja vi varios e varios vídeos sobre e ainda muito confuso pra mim

  • @agentebebeto3494
    @agentebebeto3494 3 роки тому +1

    Professor, eu não consigo entender bem o operador seta "->" tem alguma aula sua explicando mais detalhado?

    • @programeseufuturo
      @programeseufuturo  3 роки тому +3

      Olá Bebeto.
      Talvez a aula 190 ajude: ua-cam.com/video/u8q_Rx32YU4/v-deo.html

    • @agentebebeto3494
      @agentebebeto3494 3 роки тому +1

      @@programeseufuturo Obrigado!

  • @allsimoes
    @allsimoes 2 роки тому +2

    A partir dessa aula começou a complicar pra mim, pois nas aulas da faculdade iniciamos a ver Listas Lineares, porém ainda não vimos nada de ponteiros, que veremos somente no próximo semestre.

    • @programeseufuturo
      @programeseufuturo  2 роки тому +1

      Olá Allan.
      Deixa eu ver se entendi. Você começou a estudar "lista linear" mas não viu ponteiros?
      Fiz uma busca rápida aqui no google e vi que lista linear basicamente é uma estrutura (struct) com um vetor em seu interior. Por isso linear, vetor tem tamanho fixo.
      Neste caso estas aulas a partir da 243 talvez te confundam pois na verdade a estrutura que estão trabalhando é composta por um vetor, junta os conteúdos de struct e arrays.

    • @allsimoes
      @allsimoes 2 роки тому +1

      @@programeseufuturo exatamente isso. Vamos ver ponteiros só no próximo semestre. Mas continuarei acompanhando as tuas aulas.

  • @sirpripyat4274
    @sirpripyat4274 2 роки тому +1

    Boa tarde, professor. Tudo bem contigo?
    Meu código está dando erro na seguinte linha:
    " *lista = novo; "
    o erro é " Thread 1: EXC_BAD_ACCESS (code=2, address=0x1000003f34)
    Utilizo para estudos de linguagem C, a IDE Xcode em um MacBook Pro M1
    Você consegue me ajudar?

    • @Pedro-fi5iy
      @Pedro-fi5iy 2 роки тому

      não é por causa da alocação de memória não?

  • @alanramos4185
    @alanramos4185 3 роки тому +1

    Como seria se tivesse mais de uma informação no typedef, teria que passar todos como parâmetro?

    • @programeseufuturo
      @programeseufuturo  3 роки тому

      Olá Alan. Há duas possibilidades:
      - passar todos como parâmetro, ou
      - fazer a leitura dos dados dentro do procedimento de inserção, assim é necessário passar apenas o ponteiro para a lista.
      Mas observe que dentro do tipo nó você poderia ter outro tipo, por exemplo o tipo pessoa. Assim, você passaria uma variável do tipo pessoa como parâmetro ao invés do nome, idade, etc. Neste exemplo (ua-cam.com/video/PebO6xIw3oc/v-deo.html) eu mostro como construir uma fila de pessoas. A lista pode usar a mesma ideia.

    • @alanramos4185
      @alanramos4185 3 роки тому +1

      Vou olhar, muito obg desde já, estou fazendo um trabalho da faculdade que precisa fazer com lista simplesmente encadeada e estou batendo cabeça 🤦🏿‍♂️ vou ver lá

  • @luisrodrigues1610
    @luisrodrigues1610 2 роки тому +1

    ai ta facil pow, precisava de ajuda para inserir na segunda posição da lista, ultilizando somente inicio, fim e valor

    • @programeseufuturo
      @programeseufuturo  2 роки тому +1

      Olá Luis
      Você viu a aula 245?
      ua-cam.com/video/__CyzQX4kqo/v-deo.html

  • @marciofilho9156
    @marciofilho9156 3 роки тому +2

    Infelizmente não consegui entender bem a utilidade de se utilizar o **lista ao invés de *lista, como já vinha utilizando.

    • @programeseufuturo
      @programeseufuturo  3 роки тому +2

      Olá Marcio. Essa é uma lógica um tanto complexa para expressar via texto, mas vou tentar ajudar por aqui.
      O primeiro ponto importante a entender é que normalmente há ao menos duas formas para se resolver um problema usando ponteiros. Eu mostrei isso nas aulas 224 a 227 quando apresentei a estrutura de dados do tipo pilha. Uma versão usa ponteiro e a outra versão usa ponteiros para ponteiros.
      Agora, qual a diferença entre as versões?
      Para simplificar vamos imaginar uma estrutura nó com um campo inteiro e um ponteiro para outro nó, assim:
      typedef struct no{
      int chave;
      struct no proximo;
      }No;
      Agora vamos imaginar que faremos inserções sempre no início da nossa estrutura de dados que estará na função main, como a seguir:
      int main(){
      No *lista = null;
      }
      Podemos fazer isso de duas formas:
      1) Fazendo uma função que irá:
      - alocar memória para um novo nó,
      - fazer esse novo nó apontar para o início da lista atual,
      - e retornar o endereço desse novo nó para atualizar o ponteiro que está na função main.
      Em algum ponto na função main teremos uma linha mais ou menos assim: lista = inserir(lista, novoValor);
      Como a inserção é no início, a função inserir retorna o ponteiro para o novo nó, fazendo com que o ponteiro na função main esteja sempre atualizado após cada nova inserção.
      2) Contudo, imagine que por algum motivo não seja possível fazer uma função. Neste caso temos que fazer um procedimento. Um procedimento não retorna nenhum valor, logo, a nossa variável lista, que está na função main, precisará ser atualizada dentro do procedimento inserir, mas, como fazer isso se a variável lista apenas é visível dentro da função main?
      Se precisamos alterar o valor de lista (declarada na função main) dentro de um procedimento, precisamos passar o endereço de memória desta variável, a região exata onde ela está na memória (lembra de passagem por valor e por referência? Se você não passar o endereço de lista, você estará fazendo uma passagem por valor, ou seja, uma cópia de lista, e qualquer alteração feita no procedimento será feita na cópia e não na variável original dentro de main). Como a variável lista guarda um endereço de memória, então teremos um ponteiro para ponteiro (endereço de uma variável que guarda outro endereço). A chamada na função main ficara assim: inserir(lista, novoValor);
      Esses conceitos são bastante abstratos Marcio e exigem um pouco de prática para fixá-los.

    • @saito.yakumo
      @saito.yakumo Рік тому

      @@programeseufuturoexcelente explicação. Estive quebrando a cabeça com isso nesses últimos dias, acho que depois dessa explicação estou começando a entender kk Obrigado e parabéns pelo ótimo conteúdo!

  • @luisrodrigues1610
    @luisrodrigues1610 2 роки тому

    se tiver alguma resposta para isso, porfavor me enviei o codigo

  • @joaoairton9989
    @joaoairton9989 Рік тому

    Galera, estou com dificuldade em entender mesmo essas estruturas de dados. O que vocês sugerem para que o entendimento seja melhor?

    • @gabeznl3591
      @gabeznl3591 Рік тому

      Veja esse vídeo do mesmo canal:
      "Construindo uma lista encadeada com a linguagem de programação C - Ponteiros parte III"
      Tem alguns erros nesse vídeo quando vc parte pro código. Acredito que seja por conta que estou usando o VScode, mas em geral o conteúdo é muito bom

  • @icarodias2973
    @icarodias2973 3 роки тому +2

    oii, eu de novo, kkkkk, Pode me falar como passar o método goto para uma função? tem como fazer isso?

    •  3 роки тому +2

      Em C não existe método

    • @programeseufuturo
      @programeseufuturo  3 роки тому +2

      Olá Ícaro.
      Como o colega (KzZirry) disse, C é programação estruturada e métodos são de programação orientada a objetos.
      Explica melhor sua dúvida por gentileza.

    • @icarodias2973
      @icarodias2973 3 роки тому +2

      @@programeseufuturo tenho um pequeno jogo, e tem uma função jogar(), eu queria sair da função jogar() e ir pra o início da main.
      Mais consegui dá um jeito, valeu 😅

    • @programeseufuturo
      @programeseufuturo  3 роки тому +1

      Que bom que conseguiu.
      Esse efeito pode ser conseguido usando o return ou o break dentro de jogar e com uma repetição do tipo do{ }while no main.