1 00:00:07,260 --> 00:00:10,050 [Powered by Google Translate] Na programação, muitas vezes precisamos representar listas de valores, 2 00:00:10,050 --> 00:00:12,840 como os nomes dos alunos em uma seção 3 00:00:12,840 --> 00:00:15,100 ou os seus resultados no último teste. 4 00:00:15,100 --> 00:00:17,430 >> Na linguagem C, declarado matrizes podem ser utilizadas 5 00:00:17,430 --> 00:00:19,160 para armazenar listas. 6 00:00:19,160 --> 00:00:21,200 É fácil enumerar os elementos de uma lista 7 00:00:21,200 --> 00:00:23,390 armazenados em uma matriz, e se você precisa acessar 8 00:00:23,390 --> 00:00:25,050 ou modificar o elemento da lista om 9 00:00:25,050 --> 00:00:27,570 por algum índice arbitrário I, 10 00:00:27,570 --> 00:00:29,910 que pode ser feito em tempo constante, 11 00:00:29,910 --> 00:00:31,660 mas as matrizes apresentam desvantagens, também. 12 00:00:31,660 --> 00:00:33,850 >> Quando nós declará-los, somos obrigados a dizer 13 00:00:33,850 --> 00:00:35,900 na frente como eles são grandes, 14 00:00:35,900 --> 00:00:38,160 isto é, quantos elementos que podem armazenar 15 00:00:38,160 --> 00:00:40,780 e qual o tamanho destes elementos são, que é determinada pelo tipo. 16 00:00:40,780 --> 00:00:45,450 Por exemplo, int arr (10) 17 00:00:45,450 --> 00:00:48,220 pode armazenar 10 itens 18 00:00:48,220 --> 00:00:50,200 que são do tamanho de um int. 19 00:00:50,200 --> 00:00:52,590 >> Nós não podemos mudar o tamanho de uma matriz após a declaração. 20 00:00:52,590 --> 00:00:55,290 Nós temos que fazer uma nova matriz se deseja armazenar mais elementos. 21 00:00:55,290 --> 00:00:57,410 A razão dessa limitação existe é que o nosso 22 00:00:57,410 --> 00:00:59,040 programa armazena todo o conjunto 23 00:00:59,040 --> 00:01:02,310 como um pedaço contíguo de memória. 24 00:01:02,310 --> 00:01:04,500 Dizer que este é o buffer onde se armazenados em nossa matriz. 25 00:01:04,500 --> 00:01:06,910 Pode haver outras variáveis 26 00:01:06,910 --> 00:01:08,310 localizado ao lado da matriz 27 00:01:08,310 --> 00:01:10,060 na memória, por isso não podemos 28 00:01:10,060 --> 00:01:12,060 apenas fazer a matriz maior. 29 00:01:12,060 --> 00:01:15,700 >> Às vezes, nós gostaríamos de trocar de velocidade a matriz de acesso rápido de dados 30 00:01:15,700 --> 00:01:17,650 para um pouco mais de flexibilidade. 31 00:01:17,650 --> 00:01:20,380 Digite a lista ligada, uma outra estrutura de dados básica 32 00:01:20,380 --> 00:01:22,360 você não pode ser tão familiarizado. 33 00:01:22,360 --> 00:01:24,200 A um nível elevado, 34 00:01:24,200 --> 00:01:26,840 uma lista ligada armazena os dados numa sequência de nodos 35 00:01:26,840 --> 00:01:29,280 que estão ligados uns aos outros com links, 36 00:01:29,280 --> 00:01:31,760 portanto, "lista ligada." o nome 37 00:01:31,760 --> 00:01:33,840 Como veremos, esta diferença no projeto 38 00:01:33,840 --> 00:01:35,500 conduz a diferentes vantagens e desvantagens 39 00:01:35,500 --> 00:01:37,000 de uma matriz. 40 00:01:37,000 --> 00:01:39,840 >> Aqui está um código C para uma lista muito simples ligada de inteiros. 41 00:01:39,840 --> 00:01:42,190 Você pode ver que temos representado cada nó 42 00:01:42,190 --> 00:01:45,520 na lista como uma estrutura que contém duas coisas, 43 00:01:45,520 --> 00:01:47,280 um inteiro para armazenar chamado 'Val' 44 00:01:47,280 --> 00:01:50,460 e um link para o próximo nó na lista 45 00:01:50,460 --> 00:01:52,990 que representamos como um ponteiro chamado 'próximo'. 46 00:01:54,120 --> 00:01:56,780 Dessa forma, é possível acompanhar toda a lista 47 00:01:56,780 --> 00:01:58,790 com apenas um único ponteiro para o nó 1, 48 00:01:58,790 --> 00:02:01,270 e então podemos seguir os ponteiros próximos 49 00:02:01,270 --> 00:02:03,130 para o nó 2, 50 00:02:03,130 --> 00:02:05,280 para o nó 3, 51 00:02:05,280 --> 00:02:07,000 ao nó 4, 52 00:02:07,000 --> 00:02:09,889 e assim por diante, até chegar ao fim da lista. 53 00:02:10,520 --> 00:02:12,210 >> Você pode ser capaz de ver uma vantagem isso tem 54 00:02:12,210 --> 00:02:14,490 sobre a estrutura de array estático - com uma lista ligada, 55 00:02:14,490 --> 00:02:16,450 não precisamos de um grande pedaço de memória completamente. 56 00:02:17,400 --> 00:02:20,530 O nó 1 da lista poderia viver neste lugar na memória, 57 00:02:20,530 --> 00:02:23,160 eo nó 2 poderia ser todo o caminho até aqui. 58 00:02:23,160 --> 00:02:25,780 Podemos chegar a todos os nós, não importa onde eles estão na memória, 59 00:02:25,780 --> 00:02:28,890 porque a partir do nó 1, o ponteiro próximo de cada nó 60 00:02:28,890 --> 00:02:31,700 nos diz exatamente onde ir. 61 00:02:31,700 --> 00:02:33,670 >> Além disso, não temos que dizer na frente 62 00:02:33,670 --> 00:02:36,740 como uma grande lista encadeada será a nossa forma de fazer com arrays estáticos, 63 00:02:36,740 --> 00:02:39,060 uma vez que podemos continuar a adicionar nós a uma lista 64 00:02:39,060 --> 00:02:42,600 enquanto não há espaço em algum lugar na memória para novos nós. 65 00:02:42,600 --> 00:02:45,370 Portanto, listas ligadas são fáceis de redimensionar dinamicamente. 66 00:02:45,370 --> 00:02:47,950 Dizer, mais tarde no programa, precisamos adicionar mais nós 67 00:02:47,950 --> 00:02:49,350 em nossa lista. 68 00:02:49,350 --> 00:02:51,480 Para inserir um novo nó em nossa lista em tempo real, 69 00:02:51,480 --> 00:02:53,740 tudo o que temos a fazer é alocar a memória para esse nó, 70 00:02:53,740 --> 00:02:55,630 plop no valor de dados, 71 00:02:55,630 --> 00:02:59,070 e depois colocá-lo onde quiser, ajustando os ponteiros apropriados. 72 00:02:59,070 --> 00:03:02,310 >> Por exemplo, se quiséssemos colocar um nó no meio 73 00:03:02,310 --> 00:03:04,020 os nós 2 e 3 da lista, 74 00:03:04,020 --> 00:03:06,800  não teríamos para mover os nós 2 ou 3 em tudo. 75 00:03:06,800 --> 00:03:09,190 Dizer que estamos inserindo este nó vermelho. 76 00:03:09,190 --> 00:03:12,890 Tudo que temos a fazer é definir ponteiro próximo do novo nó de 77 00:03:12,890 --> 00:03:14,870 para apontar para o nó 3 78 00:03:14,870 --> 00:03:18,580 e, em seguida, religar ponteiro próximo nó 2 do 79 00:03:18,580 --> 00:03:20,980 para apontar para o novo nó. 80 00:03:22,340 --> 00:03:24,370 Assim, podemos redimensionar nossas listas na mosca 81 00:03:24,370 --> 00:03:26,090 desde o nosso computador não dependem de indexação, 82 00:03:26,090 --> 00:03:28,990 mas sim na ligação entre o uso de ponteiros para armazená-los. 83 00:03:29,120 --> 00:03:31,600 >> Listas No entanto, uma desvantagem do ligadas 84 00:03:31,600 --> 00:03:33,370 é que, ao contrário de uma matriz estática, 85 00:03:33,370 --> 00:03:36,690 o computador não pode simplesmente pular para o meio da lista. 86 00:03:38,040 --> 00:03:40,780 Desde que o computador tem que visitar cada nó na lista ligada 87 00:03:40,780 --> 00:03:42,330 para chegar ao próximo, 88 00:03:42,330 --> 00:03:44,770 que vai levar mais tempo para encontrar um nó específico 89 00:03:44,770 --> 00:03:46,400 do que seria em um array. 90 00:03:46,400 --> 00:03:48,660 Para percorrer a lista inteira leva um tempo proporcional 91 00:03:48,660 --> 00:03:50,580 para o comprimento da lista, 92 00:03:50,580 --> 00:03:54,630 ou O (n) em notação assintótica. 93 00:03:54,630 --> 00:03:56,510 Em média, atingindo qualquer nó 94 00:03:56,510 --> 00:03:58,800 também leva um tempo proporcional a n. 95 00:03:58,800 --> 00:04:00,700 >> Agora, vamos realmente escrever um código 96 00:04:00,700 --> 00:04:02,000 que trabalha com listas ligadas. 97 00:04:02,000 --> 00:04:04,220 Vamos dizer que queremos uma lista ligada de inteiros. 98 00:04:04,220 --> 00:04:06,140 Podemos representar um nó na nossa lista novamente 99 00:04:06,140 --> 00:04:08,340 como uma estrutura com dois campos, 100 00:04:08,340 --> 00:04:10,750 um valor inteiro chamado 'Val' 101 00:04:10,750 --> 00:04:13,490 e um ponteiro próximo para o próximo nó da lista. 102 00:04:13,490 --> 00:04:15,660 Bem, parece bastante simples. 103 00:04:15,660 --> 00:04:17,220 >> Vamos dizer que queremos escrever uma função 104 00:04:17,220 --> 00:04:19,329 que percorre a lista e imprime o 105 00:04:19,329 --> 00:04:22,150 valor armazenado no último nó da lista. 106 00:04:22,150 --> 00:04:24,850 Bem, isso significa que teremos que percorrer todos os nós da lista 107 00:04:24,850 --> 00:04:27,310 para encontrar a última, mas desde que não está adicionando 108 00:04:27,310 --> 00:04:29,250 ou apagar nada, não queremos mudar 109 00:04:29,250 --> 00:04:32,210 a estrutura interna dos ponteiros seguintes na lista. 110 00:04:32,210 --> 00:04:34,790 >> Então, vamos precisar de um ponteiro especificamente para passagem 111 00:04:34,790 --> 00:04:36,940 que chamaremos de "rastreador". 112 00:04:36,940 --> 00:04:38,870 Vai rastejar através de todos os elementos da lista 113 00:04:38,870 --> 00:04:41,190 seguindo a cadeia de ponteiros próximos. 114 00:04:41,190 --> 00:04:43,750 Tudo o que temos armazenado é um ponteiro para o nó 1, 115 00:04:43,750 --> 00:04:45,730 ou "cabeça" da lista. 116 00:04:45,730 --> 00:04:47,370 Pontos de cabeça para o nó 1. 117 00:04:47,370 --> 00:04:49,120 É o tipo de ponteiro a nó. 118 00:04:49,120 --> 00:04:51,280 >> Para obter o nó 1 real na lista, 119 00:04:51,280 --> 00:04:53,250 temos que dereference esse ponteiro, 120 00:04:53,250 --> 00:04:55,100 mas antes que possamos cancelar a referência de que, é preciso verificar 121 00:04:55,100 --> 00:04:57,180 se o ponteiro é nulo primeiro. 122 00:04:57,180 --> 00:04:59,190 Se for nulo, a lista está vazia, 123 00:04:59,190 --> 00:05:01,320 e devemos imprimir uma mensagem que, porque a lista é vazia, 124 00:05:01,320 --> 00:05:03,250 não há último nó. 125 00:05:03,250 --> 00:05:05,190 Mas, vamos dizer que a lista não é vazia. 126 00:05:05,190 --> 00:05:08,340 Se não é, então devemos rastrear toda a lista 127 00:05:08,340 --> 00:05:10,440 até chegarmos ao último nó da lista, 128 00:05:10,440 --> 00:05:13,030 e como podemos saber se nós estamos olhando para o último nó na lista? 129 00:05:13,670 --> 00:05:16,660 >> Bem, se ponteiro próxima de um nó é nulo, 130 00:05:16,660 --> 00:05:18,320 sabemos que estamos no final 131 00:05:18,320 --> 00:05:22,390 desde o último ponteiro seguinte teria nenhum nó seguinte na lista para apontar. 132 00:05:22,390 --> 00:05:26,590 É uma boa prática para manter sempre ponteiro próximo do nó passado inicializado como nulo 133 00:05:26,590 --> 00:05:30,800 ter uma propriedade padronizada que nos alerta quando chegamos ao fim da lista. 134 00:05:30,800 --> 00:05:33,510 >> Então, se rastreador → seguinte é nulo, 135 00:05:34,120 --> 00:05:38,270 lembre-se que a sintaxe flecha é um atalho para dereferencing 136 00:05:38,270 --> 00:05:40,010 um ponteiro para uma estrutura, em seguida, acessar 137 00:05:40,010 --> 00:05:42,510 seu próximo campo equivalente ao incómodo: 138 00:05:42,510 --> 00:05:48,750 (* Rastreador). Seguinte. 139 00:05:49,820 --> 00:05:51,260 Uma vez que tenhamos encontrado o último nó, 140 00:05:51,260 --> 00:05:53,830 queremos imprimir rastreador → val, 141 00:05:53,830 --> 00:05:55,000 o valor do nó actual 142 00:05:55,000 --> 00:05:57,130 que sabemos que é a última. 143 00:05:57,130 --> 00:05:59,740 Caso contrário, se nós não estamos ainda no último nó na lista, 144 00:05:59,740 --> 00:06:02,340 temos que seguir em frente para o próximo nó na lista 145 00:06:02,340 --> 00:06:04,750 e verificar se esse é o último. 146 00:06:04,750 --> 00:06:07,010 Para fazer isso, basta fazer o nosso ponteiro rastreador 147 00:06:07,010 --> 00:06:09,840 para apontar para o próximo valor do nó atual, 148 00:06:09,840 --> 00:06:11,680 isto é, o nó seguinte na lista. 149 00:06:11,680 --> 00:06:13,030 Isto é feito ajustando 150 00:06:13,030 --> 00:06:15,280 rastreador = rastreador → seguinte. 151 00:06:16,050 --> 00:06:18,960 Em seguida, repetimos este processo, com um laço, por exemplo, 152 00:06:18,960 --> 00:06:20,960 até encontrar o último nó. 153 00:06:20,960 --> 00:06:23,150 Assim, por exemplo, se rastreador estava apontando para a cabeça, 154 00:06:24,050 --> 00:06:27,710 vamos definir rastreador para apontar para rastreador → seguinte, 155 00:06:27,710 --> 00:06:30,960 que é o mesmo que o próximo campo do nó 1. 156 00:06:30,960 --> 00:06:33,620 Então, agora o nosso rastreador está apontando para o nó 2, 157 00:06:33,620 --> 00:06:35,480 e, de novo, repetir este com um ciclo, 158 00:06:37,220 --> 00:06:40,610 até que tenhamos encontrado o último nó, isto é, 159 00:06:40,610 --> 00:06:43,640 onde ponteiro próximo do nó está a apontar para null. 160 00:06:43,640 --> 00:06:45,070 E aí temos que, 161 00:06:45,070 --> 00:06:47,620 nós encontramos o último nó na lista, e para imprimir o seu valor, 162 00:06:47,620 --> 00:06:50,800 é só usar rastreador → val. 163 00:06:50,800 --> 00:06:53,130 >> O deslocamento não é tão ruim, mas o que sobre a inserção? 164 00:06:53,130 --> 00:06:56,290 Vamos dizer que nós queremos inserir um inteiro na posição 4 165 00:06:56,290 --> 00:06:58,040 em uma lista de inteiros. 166 00:06:58,040 --> 00:07:01,280 Que se encontra entre os nós de corrente 3 e 4. 167 00:07:01,280 --> 00:07:03,760 Mais uma vez, temos que percorrer a lista apenas para 168 00:07:03,760 --> 00:07:06,520 chegar ao elemento terceiro, aquele que está inserindo depois. 169 00:07:06,520 --> 00:07:09,300 Então, criamos um ponteiro rastreador novamente para percorrer a lista, 170 00:07:09,300 --> 00:07:11,400 verificar se o nosso ponteiro cabeça é nulo, 171 00:07:11,400 --> 00:07:14,810 e se não é, aponta nosso ponteiro rastreador no nó de cabeça. 172 00:07:16,880 --> 00:07:18,060 Então, estamos no primeiro elemento. 173 00:07:18,060 --> 00:07:21,020 Nós temos que ir para a frente dois elementos mais antes que possamos inserir, 174 00:07:21,020 --> 00:07:23,390 por isso podemos usar um loop 175 00:07:23,390 --> 00:07:26,430 int i = 1; i <3, i + + 176 00:07:26,430 --> 00:07:28,590 e em cada iteração do loop, 177 00:07:28,590 --> 00:07:31,540 avançar nosso ponteiro rastreador frente por um nó 178 00:07:31,540 --> 00:07:34,570 verificando se o campo próximo do nó atual é nulo, 179 00:07:34,570 --> 00:07:37,550 e se não é, mover nosso ponteiro rastreador para o próximo nó 180 00:07:37,550 --> 00:07:41,810 definindo-o igual ao ponteiro próximo do nó atual. 181 00:07:41,810 --> 00:07:45,210 Assim, desde que o nosso circuito para fazer isso, diz 182 00:07:45,210 --> 00:07:47,550 duas vezes, 183 00:07:49,610 --> 00:07:51,190 chegamos ao nó 3, 184 00:07:51,190 --> 00:07:53,110 e uma vez que nosso ponteiro rastreador atingiu o nó após 185 00:07:53,110 --> 00:07:55,270 que queremos inserir o nosso inteiro novo, 186 00:07:55,270 --> 00:07:57,050 como é que nós realmente a inserção? 187 00:07:57,050 --> 00:07:59,440 >> Bem, o nosso novo inteiro tem de ser inserida na lista 188 00:07:59,440 --> 00:08:01,250 como parte de sua estrutura próprio nó, 189 00:08:01,250 --> 00:08:03,140 uma vez que esta é realmente uma seqüência de nós. 190 00:08:03,140 --> 00:08:05,690 Então, vamos fazer um novo ponteiro para o nó 191 00:08:05,690 --> 00:08:08,910 chamado "new_node ' 192 00:08:08,910 --> 00:08:11,800 e configurá-lo para apontar para a memória que agora alocar 193 00:08:11,800 --> 00:08:14,270 sobre a pilha para o próprio nó, 194 00:08:14,270 --> 00:08:16,000 ea quantidade de memória que precisamos alocar? 195 00:08:16,000 --> 00:08:18,250 Assim, o tamanho de um nó, 196 00:08:20,450 --> 00:08:23,410 e queremos definir seu campo val para o número inteiro que deseja inserir. 197 00:08:23,410 --> 00:08:25,590 Vamos dizer, 6. 198 00:08:25,590 --> 00:08:27,710 Agora, o nó contém o nosso valor inteiro. 199 00:08:27,710 --> 00:08:30,650 É também uma boa prática para inicializar próximo campo o novo nó de 200 00:08:30,650 --> 00:08:33,690 para apontar para null, 201 00:08:33,690 --> 00:08:35,080 mas e agora? 202 00:08:35,080 --> 00:08:37,179 >> Temos que mudar a estrutura interna da lista 203 00:08:37,179 --> 00:08:40,409 e os ponteiros próximos contida existente da lista 204 00:08:40,409 --> 00:08:42,950 Nós 3 e 4. 205 00:08:42,950 --> 00:08:46,560 Uma vez que os ponteiros próximos determinar a ordem da lista, 206 00:08:46,560 --> 00:08:48,650 E já que estamos inserindo nosso novo nó 207 00:08:48,650 --> 00:08:50,510 para a direita no meio da lista, 208 00:08:50,510 --> 00:08:52,010 pode ser um pouco complicado. 209 00:08:52,010 --> 00:08:54,250 Isto porque, lembre-se, o nosso computador 210 00:08:54,250 --> 00:08:56,250 só sabe a localização de nós na lista 211 00:08:56,250 --> 00:09:00,400 por causa dos ponteiros próximos armazenados nos nós anteriores. 212 00:09:00,400 --> 00:09:03,940 Então, se alguma vez perdeu a noção de qualquer um destes locais, 213 00:09:03,940 --> 00:09:06,860 dizer alterando um dos ponteiros próximos em nossa lista, 214 00:09:06,860 --> 00:09:09,880 por exemplo, dizer que mudou 215 00:09:09,880 --> 00:09:12,920 campo seguinte o nó 3 é 216 00:09:12,920 --> 00:09:15,610 para apontar para algum nó aqui. 217 00:09:15,610 --> 00:09:17,920 Nós estaríamos fora de sorte, porque não faria 218 00:09:17,920 --> 00:09:20,940 tem alguma idéia de onde encontrar o resto da lista, 219 00:09:20,940 --> 00:09:23,070 e isso é, obviamente, muito ruim. 220 00:09:23,070 --> 00:09:25,080 Então, nós temos que ter muito cuidado sobre a ordem 221 00:09:25,080 --> 00:09:28,360 em que manipular os ponteiros próximas durante a inserção. 222 00:09:28,360 --> 00:09:30,540 >> Então, para simplificar, vamos dizer que 223 00:09:30,540 --> 00:09:32,220 nossos primeiros quatro nós 224 00:09:32,220 --> 00:09:36,200 são denominados A, B, C, e D, com as setas que representam a cadeia de ponteiros 225 00:09:36,200 --> 00:09:38,070 que ligam os nós. 226 00:09:38,070 --> 00:09:40,050 Então, precisamos inserir nosso novo nó 227 00:09:40,050 --> 00:09:42,070 entre os nós C e D. 228 00:09:42,070 --> 00:09:45,060 É fundamental fazê-lo na ordem certa, e eu vou mostrar-lhe porquê. 229 00:09:45,060 --> 00:09:47,500 >> Vamos olhar para a maneira errada de fazer isso primeiro. 230 00:09:47,500 --> 00:09:49,490 Ei, sabemos que o novo nó tem que vir logo depois C, 231 00:09:49,490 --> 00:09:51,910 então vamos definir ponteiro próximo do C 232 00:09:51,910 --> 00:09:54,700 para apontar para new_node. 233 00:09:56,530 --> 00:09:59,180 Tudo bem, parece tudo bem, só temos que terminar agora por 234 00:09:59,180 --> 00:10:01,580 fazendo ponto o novo nó do ponteiro ao lado de D, 235 00:10:01,580 --> 00:10:03,250 mas espera, como podemos fazer isso? 236 00:10:03,250 --> 00:10:05,170 A única coisa que poderia nos dizer onde era D, 237 00:10:05,170 --> 00:10:07,630 o ponteiro próximo foi previamente armazenado em C, 238 00:10:07,630 --> 00:10:09,870 mas nós apenas reescreveu que o ponteiro 239 00:10:09,870 --> 00:10:11,170 para apontar para o novo nó, 240 00:10:11,170 --> 00:10:14,230 assim já não temos qualquer pista onde D é na memória, 241 00:10:14,230 --> 00:10:17,020 e nós perdemos o resto da lista. 242 00:10:17,020 --> 00:10:19,000 Não é bom em tudo. 243 00:10:19,000 --> 00:10:21,090 >> Então, como vamos fazer isso certo? 244 00:10:22,360 --> 00:10:25,090 Primeiro, apontar ponteiro seguinte, o novo nó no D. 245 00:10:26,170 --> 00:10:28,990 Agora, os ponteiros tanto o novo nó e C do próximo 246 00:10:28,990 --> 00:10:30,660 estão apontando para o mesmo nó, D, 247 00:10:30,660 --> 00:10:32,290 mas isso é bom. 248 00:10:32,290 --> 00:10:35,680 Agora podemos apontar ponteiro próximo do C no novo nó. 249 00:10:37,450 --> 00:10:39,670 Então, nós fizemos isso sem perder quaisquer dados. 250 00:10:39,670 --> 00:10:42,280 No código, C é o nó actual 251 00:10:42,280 --> 00:10:45,540 que a travessia ponteiro rastreador está apontando, 252 00:10:45,540 --> 00:10:50,400 e D é representada pelo nó apontado pelo campo seguinte do nó actual, 253 00:10:50,400 --> 00:10:52,600 ou rastreador → seguinte. 254 00:10:52,600 --> 00:10:55,460 Então, primeiro definir ponteiro seguinte, o novo nó 255 00:10:55,460 --> 00:10:57,370 para apontar para rastreador → seguinte, 256 00:10:57,370 --> 00:11:00,880 da mesma forma que disse ponteiro próxima new_node deveria 257 00:11:00,880 --> 00:11:02,780 apontar para D na figura. 258 00:11:02,780 --> 00:11:04,540 Então, podemos definir ponteiro próximo do nó atual 259 00:11:04,540 --> 00:11:06,330 para nosso novo nó, 260 00:11:06,330 --> 00:11:10,980 assim como nós teve de esperar até o ponto C para new_node no desenho. 261 00:11:10,980 --> 00:11:12,250 Agora tudo está em ordem, e não perdemos 262 00:11:12,250 --> 00:11:14,490 o controle de todos os dados, e fomos capazes de apenas 263 00:11:14,490 --> 00:11:16,200 furar o nosso novo nó no meio da lista 264 00:11:16,200 --> 00:11:19,330 sem reconstruir a coisa toda ou até mesmo deslocando todos os elementos 265 00:11:19,330 --> 00:11:22,490 do jeito que teria que ter com uma matriz de comprimento fixo. 266 00:11:22,490 --> 00:11:26,020 >> Então, listas ligadas são um básico, mas importante, estrutura de dados dinâmica 267 00:11:26,020 --> 00:11:29,080 que têm vantagens e desvantagens 268 00:11:29,080 --> 00:11:31,260 em comparação com as matrizes e outras estruturas de dados, 269 00:11:31,260 --> 00:11:33,350 e, como é frequentemente o caso em ciência da computação, 270 00:11:33,350 --> 00:11:35,640 é importante saber quando usar cada ferramenta, 271 00:11:35,640 --> 00:11:37,960 para que você possa escolher a ferramenta certa para o trabalho certo. 272 00:11:37,960 --> 00:11:40,060 >> Para mais prática, tente escrever funções para 273 00:11:40,060 --> 00:11:42,080 excluir nós de uma lista ligada - 274 00:11:42,080 --> 00:11:44,050 lembre-se de ter cuidado com a ordem em que você reorganizar 275 00:11:44,050 --> 00:11:47,430 os ponteiros próximos para garantir que você não perca um pedaço de sua lista - 276 00:11:47,430 --> 00:11:50,200 ou uma função para contar os nós em uma lista ligada, 277 00:11:50,200 --> 00:11:53,280 ou um divertimento, para inverter a ordem de todos os nós em uma lista ligada. 278 00:11:53,280 --> 00:11:56,090 >> Meu nome é Jackson Steinkamp, ​​este é CS50.