<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Cinthia Queiroz</title>
    <description>The latest articles on Forem by Cinthia Queiroz (@cicinth).</description>
    <link>https://forem.com/cicinth</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F564054%2F70ba401f-c5ec-4f7f-bf5c-2f2465644467.jpeg</url>
      <title>Forem: Cinthia Queiroz</title>
      <link>https://forem.com/cicinth</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/cicinth"/>
    <language>en</language>
    <item>
      <title>Array e lista encadeada - Entenda a diferença</title>
      <dc:creator>Cinthia Queiroz</dc:creator>
      <pubDate>Mon, 15 May 2023 16:50:24 +0000</pubDate>
      <link>https://forem.com/cicinth/array-e-lista-encadeada-entenda-a-diferenca-cj5</link>
      <guid>https://forem.com/cicinth/array-e-lista-encadeada-entenda-a-diferenca-cj5</guid>
      <description>&lt;p&gt;Criar, ler e deletar coleções de dados é algo que esta presente no dia a dia do programador e é muito comum nos usarmos sempre o famoso array, mas será que essa estrutura de dados é a melhor para todos os casos? Será que o array é essa bala de prata que tratamos como se fosse ?&lt;br&gt;
Antes de respondermos essas questões, precisamos entender como um array de fato funciona.&lt;br&gt;
Ok, uma informação que temos geralmente, é que um tamanho de um array é fixo e a memória alocada estaticamente, o que isso quer dizer? Quando criamos um array com um tamanho 5 é como se a gente estivesse falado "Oi, separa 5 lugares pra mim por favor?", mais ou menos como reservar 5 lugares em um restaurante. Vamos imaginar então um array que armazene os filmes preferidos de um usuário.&lt;br&gt;
Quando salvamos dados em um array, é importante lembrar que cada valor que incluímos é armazenado em um espaço na memória. No exemplo a seguir, cada caixinha (coluna) representa um espaço na memória.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqpliy432uc0s6nnjs6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqpliy432uc0s6nnjs6b.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Implementação:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

func main() {
 movies := [4]string{"boyhood", "donnie darko", "clube da luta", "clube dos cinco"}
 fmt.Println(movies)
}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Só que o que acontece se precisarmos incluir um novo filme nesse array ? Não podemos simplesmente adicionar esse novo filme em uma caixinha do lado, pois no momento de criar o array nos só alocamos 4 espaços e pode ser que o espaço do lado ja esteja sendo usado por outro recurso.&lt;br&gt;
Então o que é necessário fazer nesse caso, seria achar 5 espaços vazios juntos e mover todo o array, junto com esse elemento, para os novos espaços alocados. Em outras palavras criar um novo array e mover tudo pra lá. O problema é que toda vez que um novo item for adicionado, o mesmo processo deve ser repetido e isso pode se tornar muito custoso e trabalhoso.&lt;/p&gt;

&lt;p&gt;Implementação:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

func main() {
 movies := [4]string{"boyhood", "donnie darko", "clube da luta", "clube dos cinco"}

 var newMovies [5]string

 for i := 0; i &amp;lt; len(movies); i++ {
  newMovies[i] = movies[i]
 }

 newMovies[4] = "her"

 fmt.Print(newMovies)

}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Então se o nosso array precisa ser constantemente modificado, inserindo e/ou deletando elementos, o array não é a melhor estrutura para ser utilizada.&lt;br&gt;
Sei que quando falamos de implementação em codigo, muitas linguagens tem implementações de listas utilizando arrays, com funções de adicionar e remover itens que resolvem a questão a cima, mas é importante ressaltar que ao utilizar essas implementaçãoes ainda estamos utilizando arrays e isso não faz com que o codigo seja menos custoso pois o mesmo processo necessario para adicionar novos itens em um array continua sendo feito, a diferença é que não somos nos que implementamos esse processo.&lt;br&gt;
Vamos então falar das listas encadeadas, como essa estrutura poderia resolver nosso problema?&lt;br&gt;
Em uma lista encadeada, o tamanho dela não é fixo e a memória utilizada é alocada em tempo de execução, não precisamos que os elementos salvos em uma lista estejam juntos, um do lado do outro. Mas e se no momento que um novo item for adicionado o espaço ao lado do ultimo item inserido estiver sendo utilizado, o que eu faço ? Insere no próximo espaço disponível!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fekf9jqdcqhax8jizeu48.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fekf9jqdcqhax8jizeu48.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E como sabemos que o próximo  item da lista de filmes não esta do lado ? e sim la na caixinha 8, por exemplo ? Listas encadeadas, possuem uma coisa que chamamos de ponteiro, cada caixinha, além de guarda seu conteúdo, também irá guardar a informação do endereço de memória  do próximo  elemento da lista, ou seja um ponteiro para o próximo  elemento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4dqpgao1dzs8tityvvp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4dqpgao1dzs8tityvvp.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse caso, nos sabemos que um um lista terminou, quando algum elemento não aponta para um próximo.&lt;br&gt;
Então, eu devo usar listas encadeadas para tudo ? A resposta é não, lista encadeadas&lt;br&gt;
são ótimas quando precisamos inserir e/ou deletar um elemento de uma lista por exemplo, mas vamos dizer que precisamos navegar em uma lista, achar elementos como o ultimo elemento ou o elemento do meio de uma lista. Com uma lista encadeada isso se torna mais difícil , pois por não sabermos o tamanho exato, para achar o elemento do meio pro exemplo, precisaremos percorrer toda a lista para saber seu tamanho e encontrar o meio, ou achar o ultimo elemento, precisaremos percorrer até achar um elemento que não  aponte para o próximo , sendo assim, percorrer toda a lista até achar o que queremos.&lt;br&gt;
Implementação de uma lista encadeada em Go.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

type Node struct {
    value string
    Next  *Node
   }

   type LinkedList struct {
    Head *Node
    Tail *Node
   }

   func (list *LinkedList) add(newValue string) {
    newNode := Node{value: newValue}
    if list.Head == nil {
     list.Head = &amp;amp;newNode
     list.Tail = &amp;amp;newNode
     return
    }


    currentNode := list.Tail
    currentNode.Next = &amp;amp;newNode
    list.Tail = &amp;amp;newNode
   }


   func main() {
    list := &amp;amp;LinkedList{}
    list.add("Boyhood")
    list.add("donnie darko")
    list.add("Curtindo a vida adoidado")

    printList(list)
   }

   func printList(list *LinkedList) {
    currentNode := list.Head
    for currentNode != nil {
     fmt.Printf(currentNode.value)
     currentNode = currentNode.Next
    }
    fmt.Println()
   }


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;É importante aprender novas estruturas e entender bem as que já usamos para cada vez melhoramos nosso código  e usar aquilo que mais irá trazer benefícios  para o nosso código , com o avanço da tecnologia, das maquinas, a diferença de custo entre essas duas estruturas diminuiu, e uma nova discussão  surgiu sobre o real custo beneficio na hora de escolher entre uma dessas estruturas, mas isso são cenas para um próximo  capitulo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências e recomendações&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Estrutura de Dados com Java | Lista Encadeada | Introduçao -&lt;/strong&gt; &lt;a href="https://www.youtube.com/@loianegroner" rel="noopener noreferrer"&gt;Loiane Groner&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entendendo Algoritmos: Um Guia Ilustrado Para Programadores e Outros Curiosos -&lt;/strong&gt; &lt;a href="https://www.amazon.com.br/s/ref=dp_byline_sr_book_1?ie=UTF8&amp;amp;field-author=Aditya+Y.+Bhargava&amp;amp;text=Aditya+Y.+Bhargava&amp;amp;sort=relevancerank&amp;amp;search-alias=stripbooks" rel="noopener noreferrer"&gt;Aditya Y. Bhargava&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;strong&gt;&lt;em&gt;Data Structures in Golang - Linked List (1/2) -&lt;/em&gt;&lt;/strong&gt;* &lt;a href="https://www.youtube.com/@JunminLee" rel="noopener noreferrer"&gt;Junmin Lee&lt;/a&gt;Junmin Lee&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>coding</category>
      <category>go</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
