A Lista de Duplo-Linked
listas ligadas pode ser bastante útil, por uma série de razões - embora eles levar algum tempo para envolver sua mente em torno do conceito. O que é pior? A lista double-ligados.
Ao invés de simplesmente ligar para a frente para a próxima estrutura, uma Lista de double-linked também links para trás, para a estrutura anterior.
O código a seguir demonstra um programa lista interativa, double-ligados. É maciça. Compará-lo com o código-lista ligada neste livro para ver os passos adicionais tomadas para manter ambos os ponteiros dianteiro e traseiro na estrutura.
/ * Um DUPLO interativo programa de lista ligada * // * Dan Gookin, começando Programação com C For Dummies * / # include # include # include struct típica {int value-estrutura típica * next-estrutura típica * anterior -} - struct típica * primeira-estrutura típica * current-estrutura típica * novo menu-int (void) -void adicionar (void) mostram -void (void) -void delete (void) despejo -void (void) -struct típico * criar (void) - / * a principal função funciona com entrada only.Everything o resto é tratado por uma função * / int main) {escolha (int = ' 0' - / * obter o loop while para girar * / first = NULL-while (escolha! = 'Q') {escolha = menu () - switch (escolha) {case 'S': show () - quebrar a caso 'A': add () - quebrar a caso 'R': delete () - break- caso 'D': despejar () - quebrar a caso 'Q': break-padrão: break -}} return (0) -} / * exibir o menu principal e recolher a entrada * menu de int / (void) {int ch- printf ( "S) como, A) dd, R) emove, D) UMP, Q) uit:") CH = getchar () - enquanto (getchar () = ' n') / * remover o excesso de entrada *! / -Retornar (toupper (ch)) -} / * Adicionar um item ao fim da lista ligada * / void add (void) {if (primeira == null) / * caso especial para o primeiro item * / {primeiro = create () - atual = primeira observação de correntes> previous = nulo-} else / * encontrar o último item * / {current = first-while (observação de correntes> ao lado) / * último item == NULL * / corrente = corrente -> próxima novas = create () - observação de correntes> próxima = new - / * ligação de actualização * / novo-> anterior = corrente de corrente = recém-} printf ( "Digite um valor:") -scanf ( "% d ", observação de correntes> value) -current-> next = NULL-while (getchar () = ' n') / * remover o excesso de entrada * / -} / * Mostrar todas as estruturas na lista ligada * / void show ( void) {int count = 1-if (primeira == null) / * esta lista está vazia * / {puts ( "Nada para mostrar") - regresso-} puts ( "Mostrando todos os registros:") - atual = primeiro- while (atual) / * último registro == NULL * / {printf ( "Record% d:% d n", conta, observação de correntes> value) -current = observação de correntes> próxima contagem ++ -}} / * Remover um registro da lista * / void delete (void) {int r, c-se (primeiro == null) / * verificar se há lista vazia * / {puts ( "Nenhum registro para remover") - voltar-} puts ( "Escolha um registro para remover: ") - show () - printf (" Record: ") -scanf ("% d ", r) -enquanto (getchar ()! = ' n') / * remover o excesso de entrada * / - c = 1-current = first-while (! c = r) {if (== atual NULL) / * garantir que 'r' está no intervalo * / {puts ( "Record não encontrado") - regresso-} atual = observação de correntes> next-c ++ -} if (observação de correntes> == anterior NULL) / * caso especial para o primeiro registro * / {first = observação de correntes> next-primeiro-> previous = nulo-} else / * ponto recorde anterior em próxima * / {observação de correntes> NEXT-> previous = observação de correntes> anterior-observação de correntes> previous-> next = observação de correntes> NEXT-} printf ( "Record% d removido. n", r) -livre (atual) - / * memória liberação * /} / * referências ponteiro exibição na lista ligada * // * copiado principalmente a partir da função show () * / void despejo (void) {int count = 1-if (primeira == null) / * esta lista está vazia * / {puts ( "Nada a dump") - voltar-} puts ( "referências de ponteiro") - atual = primeira printf ( "Record # tPrevious tCurrent tnext n") - enquanto ( atual) / * último registro == NULL * / {printf ( "Record% d: t% t% p t% p n p", conta, observação de correntes> anterior, atual, observação de correntes> ao lado) - current = observação de correntes> next-count ++ -}} / * criar uma estrutura vazia e retornar seu endereço * / struct típico * criar (void) {struct típico * aa = malloc (struct típico *) (sizeof (struct típico)) - if (a == null) {puts ( "Algum tipo de malloc () de erro") - exit (1) -} return (a) -}