O documento discute listas encadeadas em C, incluindo: (1) O que são listas encadeadas e como são implementadas usando nós; (2) Como criar uma lista encadeada vazia e inserir itens no início da lista; (3) Como imprimir os itens de uma lista encadeada.
O documento descreve as listas simplesmente encadeadas em C, incluindo:
1) A estrutura básica de um nó e lista;
2) Funções para inserir no início e fim da lista;
3) Função para imprimir a lista;
4) Função para remover elementos da lista.
O artigo descreve como criar uma lista encadeada simples em C usando nós com um campo de dados inteiro e um ponteiro. A estrutura básica do nó é definida e malloc é usado para alocar memória para os nós. Os nós são ligados uns aos outros através dos ponteiros para criar a lista e o código de exemplo mostra como imprimir a lista.
O documento discute listas encadeadas em C. Ele define listas encadeadas e suas vantagens e desvantagens em relação a vetores. Também descreve como implementar listas encadeadas em C usando estruturas e ponteiros, e apresenta funções para inserir elementos e imprimir uma lista. Finalmente, propõe um exercício para implementar uma lista encadeada simples em C.
O documento descreve as listas encadeadas e como representá-las em C. As listas encadeadas representam uma sequência de objetos na memória ligados por ponteiros. Cada elemento da lista contém um campo de dados e um ponteiro para o próximo elemento, permitindo acesso flexível aos itens.
O documento descreve listas circulares e duplamente encadeadas, e apresenta o problema de Josephus, no qual soldados em um círculo são mortos a cada M posições até restar apenas um sobrevivente.
Este documento descreve a implementação de uma lista de inteiros em C++. A lista possui métodos para inserir, remover e exibir elementos. Ela é implementada usando um array estático de tamanho fixo para armazenamento. O documento explica a interface da lista, escolha da implementação, programa de teste e detalhes da implementação dos métodos como construtor, inserção, remoção e exibição.
O documento descreve uma lista encadeada de inteiros em C++. A lista armazena elementos de forma sequencial usando nós ligados por ponteiros. O documento explica a interface da classe lista e como implementar métodos como inserção, remoção e impressão percorrendo a lista através dos nós.
Este documento descreve listas duplamente encadeadas, incluindo sua estrutura de nós com ponteiros para frente e para trás, e como implementar operações como busca, inserção e remoção nestas listas.
O documento descreve as listas simplesmente encadeadas em C, incluindo:
1) A estrutura básica de um nó e lista;
2) Funções para inserir no início e fim da lista;
3) Função para imprimir a lista;
4) Função para remover elementos da lista.
O artigo descreve como criar uma lista encadeada simples em C usando nós com um campo de dados inteiro e um ponteiro. A estrutura básica do nó é definida e malloc é usado para alocar memória para os nós. Os nós são ligados uns aos outros através dos ponteiros para criar a lista e o código de exemplo mostra como imprimir a lista.
O documento discute listas encadeadas em C. Ele define listas encadeadas e suas vantagens e desvantagens em relação a vetores. Também descreve como implementar listas encadeadas em C usando estruturas e ponteiros, e apresenta funções para inserir elementos e imprimir uma lista. Finalmente, propõe um exercício para implementar uma lista encadeada simples em C.
O documento descreve as listas encadeadas e como representá-las em C. As listas encadeadas representam uma sequência de objetos na memória ligados por ponteiros. Cada elemento da lista contém um campo de dados e um ponteiro para o próximo elemento, permitindo acesso flexível aos itens.
O documento descreve listas circulares e duplamente encadeadas, e apresenta o problema de Josephus, no qual soldados em um círculo são mortos a cada M posições até restar apenas um sobrevivente.
Este documento descreve a implementação de uma lista de inteiros em C++. A lista possui métodos para inserir, remover e exibir elementos. Ela é implementada usando um array estático de tamanho fixo para armazenamento. O documento explica a interface da lista, escolha da implementação, programa de teste e detalhes da implementação dos métodos como construtor, inserção, remoção e exibição.
O documento descreve uma lista encadeada de inteiros em C++. A lista armazena elementos de forma sequencial usando nós ligados por ponteiros. O documento explica a interface da classe lista e como implementar métodos como inserção, remoção e impressão percorrendo a lista através dos nós.
Este documento descreve listas duplamente encadeadas, incluindo sua estrutura de nós com ponteiros para frente e para trás, e como implementar operações como busca, inserção e remoção nestas listas.
O documento descreve listas ligadas e como representá-las em C. Listas ligadas armazenam itens de dados em locais de memória não contíguos, ligados por ponteiros. Isso permite inserções e remoções sem deslocar outros itens, diferente de vetores. Operações como inserir, remover e buscar itens em listas ligadas são explicadas.
O documento apresenta uma discussão sobre implementação de pilhas e filas dinâmicas utilizando listas encadeadas. É explicado como utilizar a estrutura de lista encadeada para representar pilhas e filas de forma dinâmica, codificando as operações necessárias como empilhar, desempilhar, enfileirar e desenfileirar.
O documento descreve como implementar uma fila usando uma lista simplesmente encadeada. Ele define estruturas de dados para os nós da lista e para a fila, e fornece funções para criar, inserir, remover, verificar se está vazia, imprimir e liberar a fila.
O documento discute estruturas de dados, definindo-as como métodos particulares de implementar tipos abstratos de dados. Apresenta listas como uma estrutura de dados linear na qual os elementos preservam uma ordem sequencial, e descreve listas ordenadas como listas cujos elementos estão ordenados de acordo com um critério pré-estabelecido. Detalha a implementação de listas sequenciais e ordenadas sequenciais usando arrays.
O documento descreve o funcionamento de filas, listas lineares que adotam a política FIFO. As filas permitem inserções no final e remoções no início. Elas podem ser implementadas usando vetores de forma circular, incrementando os índices de modo a "andar" no vetor.
O documento descreve como implementar uma fila usando uma lista encadeada simples. Uma estrutura Fila contém ponteiros para o início e fim da lista, e métodos são fornecidos para inserir e remover itens da fila.
O documento discute estruturas (structs) em C#, definindo-as como tipos de valor usados para agrupar variáveis relacionadas. Ele apresenta um exemplo de struct para armazenar informações sobre livros, como preço, título e autor. Também mostra como criar variáveis do tipo struct, ler e escrever seus valores e armazená-los em vetores.
O documento descreve como implementar uma fila circular usando um vetor. Uma fila é uma estrutura de dados que usa a política FIFO, com inserções no final e remoções no início. Uma fila circular permite reutilizar o espaço do vetor de forma eficiente ao incrementar os índices de forma circular.
O documento descreve diversos comandos básicos de sistemas operacionais, incluindo ls, cd, man, who, top, apropos, tee, grep, cat, wc, watch, find, touch, ps, cut, date, rev, tac e tr. Para cada comando são explicadas suas funções e principais opções.
Este documento descreve as listas ligadas e suas operações básicas, comparando-as com listas sequenciais. As listas ligadas permitem alocação dinâmica, inserindo e removendo elementos de forma flexível, enquanto listas sequenciais precisam ser dimensionadas antecipadamente. Operações como busca, inserção, remoção e criação de listas a partir de vetores são apresentadas para listas ligadas simples, circulares e duplamente ligadas.
O documento explica os diferentes tipos de JOIN no SQL, incluindo INNER JOIN, OUTER JOIN e SELF JOIN. Discute como o JOIN permite obter informações de várias tabelas usando uma única instrução SELECT, ligando as tabelas através de chaves primárias e estrangeiras. Também explica o que é um produto cartesiano e como o WHERE clause pode ser usado para especificar condições de JOIN.
1) O documento discute conceitos iniciais sobre estruturas de dados e algoritmos, incluindo tipos primitivos, variáveis compostas unidimensionais e multidimensionais, registros, programação orientada a objetos e classes.
2) É introduzido o conceito de estruturas de dados como uma forma de construir novos tipos de dados a partir da composição de tipos primitivos.
3) Vetores, matrizes e registros são exemplos de estruturas de dados unidimensionais e multidimensionais que armazenam elementos do mesmo ou de tipos diferentes.
O documento descreve o que é uma heap, como é sua estrutura e operações básicas de inserção e remoção. Uma heap é uma árvore binária balanceada que oferece acesso rápido ao item com a maior chave. Inserção e remoção ocorrem em tempo O(log n) através de movimentação de nós para cima ou para baixo na árvore.
1) O documento discute as operações básicas da álgebra relacional e como elas são representadas no SQL, incluindo união, interseção, diferença, projeção, seleção, produto cartesiano e junção.
2) Exemplos dessas operações são fornecidos usando notação da álgebra relacional e sintaxe SQL.
3) Exercícios são fornecidos para aplicar essas operações usando consultas SQL em relações representando funcionários e dependentes.
Este documento descreve as características e operações básicas de listas lineares. Em três frases: Listas lineares são estruturas de dados que armazenam elementos do mesmo tipo em ordem linear, onde cada elemento, chamado de nodo, possui uma posição relativa aos demais. As operações comuns em listas lineares incluem busca, inserção e remoção de nodos, que podem ser implementadas usando vetores para alocação sequencial ou ponteiros para alocação encadeada. Listas lineares são amplamente utilizadas para representar diversos
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUACândido Sales Gomes
Lua é uma linguagem de script dinâmica e leve usada para automatizar tarefas e adicionar lógica e funcionalidade a outros sistemas. Ela é portátil, simples, eficiente e pode ser embutida ou acoplada a várias linguagens e plataformas. Lua é amplamente usada em jogos e tem bibliotecas para strings, tabelas, matemática e depuração.
Registros ou estruturas são tipos de dados definidos pelo usuário que agrupam variáveis relacionadas sob um nome. Uma estrutura é definida usando o comando struct e especificando os campos. Uma variável de estrutura aloca memória para armazenar todos os seus campos. Os campos de uma variável de estrutura podem ser acessados usando o operador ponto.
Este relatório descreve a criação de uma agenda eletrônica usando uma lista ordenada encadeada. O programa carrega os contatos de um arquivo CSV, permite adicionar, remover e visualizar contatos, e grava os dados atualizados no arquivo. A maior dificuldade foi implementar a lista encadeada devido à complexidade dos ponteiros.
Material de apoio das aulas de tutoria de Algoritmos e Estrutura de dados da Universidade Federal de Ouro Preto, Campus João Monlevade. O conteúdo abordado é uma revisão sobre structs na linguagem de programação C.
O documento descreve as listas simplesmente encadeadas em C, incluindo:
1) A estrutura básica de um nó e lista;
2) Funções para inserir no início e fim da lista;
3) Função para imprimir a lista;
4) Função para remover elementos da lista.
Este documento apresenta os conceitos e implementação de listas duplamente encadeadas usando a linguagem C. Apresenta as vantagens sobre listas encadeadas simples, como acessar elementos adjacentes e percorrer a lista em ordem reversa. Detalha a estrutura dos nós da lista e operações básicas como criação, inserção e remoção de elementos. Instrui os alunos a implementarem os algoritmos nas atividades práticas.
1) O documento discute tipos abstratos de dados e listas lineares.
2) Apresenta conceitos fundamentais sobre definição de tipos abstratos usando a linguagem C.
3) Discutem propriedades e operações básicas de listas lineares seqüenciais e encadeadas.
O documento descreve listas ligadas e como representá-las em C. Listas ligadas armazenam itens de dados em locais de memória não contíguos, ligados por ponteiros. Isso permite inserções e remoções sem deslocar outros itens, diferente de vetores. Operações como inserir, remover e buscar itens em listas ligadas são explicadas.
O documento apresenta uma discussão sobre implementação de pilhas e filas dinâmicas utilizando listas encadeadas. É explicado como utilizar a estrutura de lista encadeada para representar pilhas e filas de forma dinâmica, codificando as operações necessárias como empilhar, desempilhar, enfileirar e desenfileirar.
O documento descreve como implementar uma fila usando uma lista simplesmente encadeada. Ele define estruturas de dados para os nós da lista e para a fila, e fornece funções para criar, inserir, remover, verificar se está vazia, imprimir e liberar a fila.
O documento discute estruturas de dados, definindo-as como métodos particulares de implementar tipos abstratos de dados. Apresenta listas como uma estrutura de dados linear na qual os elementos preservam uma ordem sequencial, e descreve listas ordenadas como listas cujos elementos estão ordenados de acordo com um critério pré-estabelecido. Detalha a implementação de listas sequenciais e ordenadas sequenciais usando arrays.
O documento descreve o funcionamento de filas, listas lineares que adotam a política FIFO. As filas permitem inserções no final e remoções no início. Elas podem ser implementadas usando vetores de forma circular, incrementando os índices de modo a "andar" no vetor.
O documento descreve como implementar uma fila usando uma lista encadeada simples. Uma estrutura Fila contém ponteiros para o início e fim da lista, e métodos são fornecidos para inserir e remover itens da fila.
O documento discute estruturas (structs) em C#, definindo-as como tipos de valor usados para agrupar variáveis relacionadas. Ele apresenta um exemplo de struct para armazenar informações sobre livros, como preço, título e autor. Também mostra como criar variáveis do tipo struct, ler e escrever seus valores e armazená-los em vetores.
O documento descreve como implementar uma fila circular usando um vetor. Uma fila é uma estrutura de dados que usa a política FIFO, com inserções no final e remoções no início. Uma fila circular permite reutilizar o espaço do vetor de forma eficiente ao incrementar os índices de forma circular.
O documento descreve diversos comandos básicos de sistemas operacionais, incluindo ls, cd, man, who, top, apropos, tee, grep, cat, wc, watch, find, touch, ps, cut, date, rev, tac e tr. Para cada comando são explicadas suas funções e principais opções.
Este documento descreve as listas ligadas e suas operações básicas, comparando-as com listas sequenciais. As listas ligadas permitem alocação dinâmica, inserindo e removendo elementos de forma flexível, enquanto listas sequenciais precisam ser dimensionadas antecipadamente. Operações como busca, inserção, remoção e criação de listas a partir de vetores são apresentadas para listas ligadas simples, circulares e duplamente ligadas.
O documento explica os diferentes tipos de JOIN no SQL, incluindo INNER JOIN, OUTER JOIN e SELF JOIN. Discute como o JOIN permite obter informações de várias tabelas usando uma única instrução SELECT, ligando as tabelas através de chaves primárias e estrangeiras. Também explica o que é um produto cartesiano e como o WHERE clause pode ser usado para especificar condições de JOIN.
1) O documento discute conceitos iniciais sobre estruturas de dados e algoritmos, incluindo tipos primitivos, variáveis compostas unidimensionais e multidimensionais, registros, programação orientada a objetos e classes.
2) É introduzido o conceito de estruturas de dados como uma forma de construir novos tipos de dados a partir da composição de tipos primitivos.
3) Vetores, matrizes e registros são exemplos de estruturas de dados unidimensionais e multidimensionais que armazenam elementos do mesmo ou de tipos diferentes.
O documento descreve o que é uma heap, como é sua estrutura e operações básicas de inserção e remoção. Uma heap é uma árvore binária balanceada que oferece acesso rápido ao item com a maior chave. Inserção e remoção ocorrem em tempo O(log n) através de movimentação de nós para cima ou para baixo na árvore.
1) O documento discute as operações básicas da álgebra relacional e como elas são representadas no SQL, incluindo união, interseção, diferença, projeção, seleção, produto cartesiano e junção.
2) Exemplos dessas operações são fornecidos usando notação da álgebra relacional e sintaxe SQL.
3) Exercícios são fornecidos para aplicar essas operações usando consultas SQL em relações representando funcionários e dependentes.
Este documento descreve as características e operações básicas de listas lineares. Em três frases: Listas lineares são estruturas de dados que armazenam elementos do mesmo tipo em ordem linear, onde cada elemento, chamado de nodo, possui uma posição relativa aos demais. As operações comuns em listas lineares incluem busca, inserção e remoção de nodos, que podem ser implementadas usando vetores para alocação sequencial ou ponteiros para alocação encadeada. Listas lineares são amplamente utilizadas para representar diversos
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUACândido Sales Gomes
Lua é uma linguagem de script dinâmica e leve usada para automatizar tarefas e adicionar lógica e funcionalidade a outros sistemas. Ela é portátil, simples, eficiente e pode ser embutida ou acoplada a várias linguagens e plataformas. Lua é amplamente usada em jogos e tem bibliotecas para strings, tabelas, matemática e depuração.
Registros ou estruturas são tipos de dados definidos pelo usuário que agrupam variáveis relacionadas sob um nome. Uma estrutura é definida usando o comando struct e especificando os campos. Uma variável de estrutura aloca memória para armazenar todos os seus campos. Os campos de uma variável de estrutura podem ser acessados usando o operador ponto.
Este relatório descreve a criação de uma agenda eletrônica usando uma lista ordenada encadeada. O programa carrega os contatos de um arquivo CSV, permite adicionar, remover e visualizar contatos, e grava os dados atualizados no arquivo. A maior dificuldade foi implementar a lista encadeada devido à complexidade dos ponteiros.
Material de apoio das aulas de tutoria de Algoritmos e Estrutura de dados da Universidade Federal de Ouro Preto, Campus João Monlevade. O conteúdo abordado é uma revisão sobre structs na linguagem de programação C.
O documento descreve as listas simplesmente encadeadas em C, incluindo:
1) A estrutura básica de um nó e lista;
2) Funções para inserir no início e fim da lista;
3) Função para imprimir a lista;
4) Função para remover elementos da lista.
Este documento apresenta os conceitos e implementação de listas duplamente encadeadas usando a linguagem C. Apresenta as vantagens sobre listas encadeadas simples, como acessar elementos adjacentes e percorrer a lista em ordem reversa. Detalha a estrutura dos nós da lista e operações básicas como criação, inserção e remoção de elementos. Instrui os alunos a implementarem os algoritmos nas atividades práticas.
1) O documento discute tipos abstratos de dados e listas lineares.
2) Apresenta conceitos fundamentais sobre definição de tipos abstratos usando a linguagem C.
3) Discutem propriedades e operações básicas de listas lineares seqüenciais e encadeadas.
O documento discute os conceitos fundamentais de estruturas de dados, incluindo tipos de dados básicos como inteiros e caracteres, e estruturas de dados mais complexas como listas, registros e arranjos. Listas lineares são definidas como uma sequência ordenada de nós que podem ser alocados de forma contígua ou encadeada. Operações comuns em listas incluem inserção, remoção e acesso a elementos.
O documento discute registros e arrays no Pascal, definindo-os como estruturas de dados para armazenar coleções de dados similares. Registros armazenam variáveis sequencialmente na memória, permitindo acesso aos campos por índice. Arrays podem ter múltiplas dimensões e são úteis para repetições. O comando With no Pascal simplifica o acesso aos campos dos registros.
O documento apresenta os objetivos e conteúdos de uma disciplina sobre algoritmos e estruturas de dados. Os tópicos incluem listas lineares, pilhas, filas, classificação de dados, recursividade e tipos abstratos de dados.
O documento apresenta os objetivos e conteúdos de uma disciplina de Algoritmos e Estrutura de Dados II. Os tópicos incluem listas lineares, pilhas, filas, classificação de dados e listas ligadas, com foco em definir formalmente estruturas de dados e selecioná-las para aplicações.
Este documento apresenta uma apostila sobre alocação dinâmica na linguagem C. Inicialmente, discute ponteiros e como eles são essenciais em C. Em seguida, explica como ponteiros são usados para acessar dados agregados como estruturas e arrays. Por fim, demonstra como ponteiros são usados como parâmetros de função para simular passagem por referência.
O documento discute alocação dinâmica de estruturas de dados não homogêneas e listas encadeadas. Apresenta listas lineares, árvores e grafos como modelos para representar informações e relacionamentos. Explica como implementar listas estáticas e encadeadas em C, incluindo funções para inicializar, inserir, remover e buscar elementos nas listas.
O documento discute pilhas e filas como estruturas de dados lineares, definindo suas propriedades e operações básicas. É apresentada a implementação de pilhas e filas usando vetores em C, com funções como push(), pop() e menus interativos para testar as estruturas. Listas encadeadas também são discutidas como alternativa de implementação.
O documento apresenta uma introdução às principais estruturas de dados em Python, incluindo listas, tuplas, dicionários, pilhas, filas e árvores. Explica os conceitos básicos por trás de cada estrutura de dados e como implementá-las usando Python.
O documento discute listas ligadas e algoritmos de estrutura de dados. Ele fornece definições de listas ligadas e explica como elas são compostas por nós ligados por ponteiros. O documento também apresenta exercícios sobre como criar estruturas de dados e implementar funções básicas como inserção, remoção e busca em listas ligadas.
1) O curso aborda tópicos de programação Java como introdução à linguagem, uso de formulários, manipulação de arquivos e banco de dados.
2) Apresenta conceitos de programação orientada a objetos em Java incluindo classes, atributos, métodos, encapsulamento e herança.
3) Demonstra o uso de variáveis, vetores, condições, laços e métodos em programação Java.
1) O documento discute fundamentos de SQL Server 2005, incluindo armazenamento de procedimentos e definição de dados.
2) É ensinado como criar procedimentos armazenados e tabelas, e como tratar erros em transações.
3) Exemplos demonstram a criação de procedimentos, tabelas, transações e tratamento de erros.
Tutorial aed iii 003 - algoritmo de ordenação shellsortFlávio Freitas
Este documento discute ordenação de dados usando o algoritmo Shellsort. Apresenta situações especiais como ordenação por índices ou ponteiros para evitar movimentação dos dados. Também fornece exercícios resolvidos e propostos sobre implementação do Shellsort e remoção de duplicatas em arrays.
Pessoal,
Demorou um pouco mas saiu!
A terceira parte da nossa apostila.
Depois vou publicar uma continuação desta apostila, começando a abordar Programação Orientada a Objeto.
Python apresenta conceitos fundamentais da linguagem como tipos de dados, controle de fluxo, funções, classes e módulos. O documento também discute quem usa Python e suas principais características como tipagem dinâmica e orientação a objetos.
No processo de aprendizagem de uma linguagem de programação, vamos, certamente, nos deparar com o tratamento de Arrays.
Em Javascript, C# e em outras linguagens de programação, temos três recursos que são muito importantes para trabalharmos com eles: map, filter e reduce.
O documento apresenta os conceitos fundamentais de algoritmos e programação, definindo o que é um algoritmo, suas etapas e estrutura, variáveis e tipos de dados, e como definir variáveis em Pascal. Explica que um algoritmo é um caminho lógico para resolver um problema, e que se aprende algoritmos através da prática de construir e testar algoritmos, não apenas copiando ou estudando-os.
SQL é uma linguagem usada para criar, manipular e extrair dados de bancos de dados. Primeiro, cria-se um diagrama de entidade-relacionamento (DER) para estruturar o banco de dados e mapear as tabelas e relações. Isso é transformado em um modelo entidade-relacionamento (MER) para criar as tabelas no banco de dados. SQL permite executar operações como criar, alterar, excluir e consultar dados no banco de dados.
O documento discute os três principais tipos de pesquisa de marketing: exploratória, descritiva e causal. A pesquisa exploratória tem como objetivo explorar um problema vagamente definido para orientar pesquisas mais detalhadas, a pesquisa descritiva descreve características de objetos ou fenômenos, e a pesquisa causal busca identificar relações de causa e efeito entre variáveis por meio de experimentos.
O documento discute os tipos de pesquisa científica, incluindo pesquisa básica versus aplicada, pesquisa exploratória, descritiva e explicativa, e pesquisa experimental, operacional e de estudo de caso. Também aborda fontes de informação para pesquisa, como pesquisa de campo e de laboratório, e estudos longitudinais versus transversais.
This document outlines the key concepts and steps of scientific research. It defines scientific research, lists the requirements and objectives of research, and classifies research by type and subject matter. It also details the planning, execution, writing, and publication stages of research and emphasizes the importance of thoroughness to research success.
O documento discute estratégias de pesquisa bibliográfica, incluindo tipos de pesquisa, fontes de informação e estratégias de busca. Aborda pesquisa qualitativa versus quantitativa, revisão bibliográfica versus pesquisa bibliográfica, e fatores a serem considerados ao selecionar fontes de informação para pesquisa.
Esta resolução estabelece as diretrizes e procedimentos para a realização do Trabalho de Conclusão de Curso (TCC) nos cursos de graduação da Universidade do Estado de Mato Grosso (UNEMAT), definindo as etapas, responsabilidades dos professores orientadores e alunos, critérios de avaliação e outras regulamentações.
O documento discute conceitos básicos de sistemas computacionais, definindo computador como uma máquina capaz de executar tarefas segundo instruções para solucionar problemas, e destacando que um sistema de computação compreende hardware (parte física) e software (parte lógica), que trabalham em conjunto para permitir o processamento de dados. Também define peopleware como as pessoas que trabalham com tecnologia da informação.
O documento resume conceitos básicos de informática, definindo-a como o tratamento automático da informação utilizando computadores. Explica que computadores são máquinas para processar dados e gerar informações, e que o processamento de dados envolve a coleta de dados, seu tratamento e a geração de informações.
Este documento resume um trabalho de conclusão de curso sobre a avaliação de ferramentas de realidade virtual e aumentada como suporte ao manual do proprietário. O trabalho analisou diferentes aplicativos para visualização de modelos 3D em realidade virtual e aumentada, classificando-os quanto ao tipo de imersão, possibilidades de interação e capacidade de medir. O modelo BIM de um projeto foi publicado nesses aplicativos e testado em um celular. Concluiu-se que essas ferramentas podem auxiliar na interpretação do manual do proprietário
Este documento discute a simulação de infraestruturas computacionais para computação ubíqua, apresentando conceitos de computação ubíqua e grids computacionais. Também resume ferramentas de simulação como Bricks, GangSim, OptorSim e GridSim, descrevendo suas funcionalidades. Por fim, apresenta um estudo de caso utilizando a ferramenta de simulação SimGrid.
Este documento apresenta uma tese de doutorado sobre abstrações para linguagens de programação visando aplicações móveis em ambientes pervasivos. A tese propõe o ISAMadapt, uma linguagem e ferramenta para projetar aplicações adaptativas para dispositivos móveis em ambientes pervasivos considerando o contexto do usuário e do ambiente.
O documento discute a Internet das Coisas (IoT), definindo-a como uma extensão da Internet que conecta objetos do dia-a-dia com capacidade de processamento e comunicação. A IoT possibilita novas aplicações para a academia e indústria, mas também apresenta desafios técnicos e sociais. O texto descreve o estado da arte de IoT, abordando questões teóricas e práticas.
1) O documento discute os conceitos de computação ubíqua, móvel e pervasiva, como essas tecnologias estão presentes no dia-a-dia das pessoas e como as interfaces devem ser projetadas para esses sistemas.
2) É explicado que a computação ubíqua tem como objetivo tornar a interação com computadores mais natural, integrando a tecnologia às ações cotidianas das pessoas de forma imperceptível.
3) Características como affordance, interfaces multimodais e reconhecimento de contexto são importantes para o desenvolvimento
O documento discute a computação ubíqua, na qual computadores se tornam onipresentes em objetos do dia a dia de forma invisível ao usuário. Apresenta dois cenários que ilustram como dispositivos inteligentes e móveis podem coordenar-se para fornecer acesso imediato a serviços e aumentar as capacidades humanas de forma transparente. Também discute desafios como mobilidade, contexto e uso eficiente de recursos em redes sem fio.
O documento descreve o desenvolvimento do ACUMAAF, um ambiente de computação ubíqua para monitoramento e avaliação de atividade física de participantes de grupos. O ACUMAAF coleta dados fisiológicos em tempo real por meio de sensores sem fio e disponibiliza indicadores para apoiar políticas de promoção da atividade física.
Este documento descreve uma dissertação de mestrado sobre uma proposta de arquitetura de middleware chamada UbiquitOS para facilitar a adaptabilidade de serviços em sistemas de computação ubíqua. A dissertação apresenta o contexto da computação ubíqua e revisa projetos anteriores, abordando especificamente a adaptabilidade de serviços. Em seguida, discute como a adaptabilidade de serviços pode reduzir o desperdício de recursos e propõe o UbiquitOS como uma solução, descrevendo seu modelo de
O documento discute a computação ubíqua, definindo-a como um novo paradigma de computação caracterizado pela proatividade, onipresença, imperceptibilidade e naturalidade. Ele apresenta conceitos básicos da computação ubíqua, suas características, tecnologias essenciais, áreas de aplicação e exemplos de sistemas desenvolvidos, incluindo na educação, saúde, negócios e residências.
O documento descreve um sistema de monitoramento de temperatura corporal humana em tempo real utilizando software embarcado e computação ubíqua, com o objetivo de auxiliar a equipe médica. O sistema foi desenvolvido com base em pesquisa bibliográfica sobre computação ubíqua, pervasiva, física e sistemas em tempo real. O protótipo utiliza uma placa Arduino Uno conectada a sensores de temperatura para coletar e transmitir dados dos pacientes.
1. O documento discute algoritmos de pesquisa e ordenação em sistemas de informação.
2. São apresentados oito algoritmos de ordenação: inserção direta, seleção direta, bubblesort, mergesort, heapsort, quicksort, shellsort e radixsort.
3. Cada algoritmo é explicado com exemplos passo a passo utilizando vetores e figuras ilustrativas.
Este estudo comparou o desempenho de algoritmos de ordenação como Bubble Sort, Insertion Sort, Selection Sort, Merge Sort e Quick Sort em vetores de diferentes tamanhos e ordenações. Os resultados mostraram que Merge Sort e Quick Sort tiveram os melhores tempos de execução, enquanto Bubble Sort teve os piores tempos.
Este documento apresenta o plano de aula para a disciplina Introdução à Ciência da Computação II. Serão estudados algoritmos de busca, ordenação e estruturas de dados, com foco na análise da complexidade de tempo e memória. Os alunos implementarão e testarão algoritmos em laboratório e produzirão relatórios. A avaliação inclui atividades e trabalhos ao longo do semestre.
1. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 1/18
amador programa
blog para programadores amadores que amam programar!
LINGUAGEM C
Listas encadeadas em C: conceitos, criação e manipulação de
listas simples
por Anderson Freixo • 30 out 2020 • 1 Comentário
Nessa série de posts, veremos como implementar o tipo abstrato lista em C utilizando uma estrutura de dados chamada de lista encadeada (linked
list). Depois de entender como funciona
uma lista encadeada (https://pt.wikipedia.org/wiki/Lista_ligada), fica muito fácil implementar outros dois tipos abstratos de dados: pilhas (stacks) e
filas (queues).
Começaremos com as listas encadeadas simples, depois com as listas duplamente encadeadas, e, por fim, as listas circulares. Então, não deixe de
acompanhar os posts!
Qual a diferença entre tipo abstrato de dados e
estrutura de dados?
Muita gente usa os termos tipo abstrato de dados (https://pt.wikipedia.org/wiki/Tipo_abstrato_de_dado) (TAD, para os íntimos) e estrutura de dados
(https://pt.wikipedia.org/wiki/Estrutura_de_dados) de forma intercambiável. Mas existe uma diferença fundamental entre os dois. Resumidamente,
o
TAD é uma ideia, um modelo que descreve as características de determinado objeto e que tipo de operações podem ser feitas sobre ele. Já a
estrutura de dados é a implementação real desse tipo abstrato numa linguagem de programação. Essa estrutura é implementada utilizando-se
outros tipos de dados mais básicos, como inteiros, ponteiros, etc., em conjunto.
2. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 2/18
Quando implementamos um tipo abstrato, é importante que aqueles que utilizam nosso código não tenham que se preocupar com a forma como
esse tipo foi implementado. Basta que ele saiba como utilizá-lo, ou seja, o usuário se utiliza de uma abstração. Enquanto nós, que implementamos
esse tipo abstrato através de algoritmos e estruturas de dados, devemos fornecer a esse usuário uma interface para manipular esse tipo abstrato. A
interface é o conjunto de objetos e funções que fornecemos ao usuário para que ele possa usufruir dessa abstração. Essa interface geralmente é
estruturada na forma de uma biblioteca.
O que é uma lista?
No caso em questão, o tipo abstrato de dados que queremos implementar é uma lista. Uma lista é um agrupamento de valores. Diferente de um
conjunto, os elementos de uma lista são ordenados e
seus valores podem se repetir. Quando digo ordenados, não quero dizer que os elementos se encontram necessariamente em ordem crescente ou
decrescente, mas sim que existe um primeiro elemento, seguido por um segundo elemento e assim por diante. Ou seja, os elementos são dispostos
de forma sequencial, numa ordem fixa.
Mas para que essa lista tenha alguma utilidade é preciso que exista a possibilidade de realizar certas operações na mesma. Por exemplo, adicionar
itens, remover itens, contar a quantidade de
itens, verificar o valor de determinado item, etc. Contanto que a lista cumpra esses requisitos, você pode implementá-la das mais variadas formas.
Entretanto, as duas formas mais comuns de
implementação de uma lista são através de vetores ou de listas encadeadas.
O que são listas encadeadas
Listas encadeadas são estruturas de dados formadas pelo agrupamento de outras estruturas menores chamadas de nós ou células.
Os nós de uma lista encadeada simples precisam armazenar apenas duas informações. A primeira é o valor do elemento da lista, que pode ser de
qualquer tipo (caractere, inteiro, etc). A segunda informação é o endereço de memória do nó referente ao próximo elemento da lista.
3. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 3/18
Anatomia do nó, ou célula, de uma lista encadeada simples.
A lista encadeada é basicamente isso. Um grupo de nós, no qual cada nó aponta para o próximo. Para percorrer a lista, você só precisa saber o
endereço do primeiro nó, e a partir dele, você
acha o endereço do próximo, que terá o endereço do seguinte, e por aí vai. Precisamos também marcar o fim da lista de algum modo.
Convencionalmente, delimitamos o fim da lista encadeada fazendo com que o ponteiro do último elemento aponte para NULL, a constante que
indica um ponteiro nulo, em C.
4. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 4/18
Uma lista encadeada simples vista ao microscópio.
Implementando uma lista encadeada em C
Como já disse anteriormente, uma lista encadeada é composta por nós. Para implementar esses nós, utilizamos uma struct com duas variáveis. Uma
armazenará o valor do elemento da lista, e a
outra variável será um ponteiro para o próximo nó. Em nosso exemplo, faremos uma lista para armazenar inteiros. Então o nosso código vai ficar
assim:
typedef struct _lista_no{
int dado;
struct _lista_no * prox;
} lista_no;
5. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 5/18
No exemplo acima, utilizamos typedef para que possamos declarar nossos nós utilizando a sintaxe
lista_no novo_no;
Sem o typedef, teríamos que declarar os nós com a sintaxe
struct lista_no novo_no;
E a vida é muito curta pra a gente escrever struct toda hora. Geralmente, não precisamos dar um nome para um struct se definimos o tipo com
typedef, mas nesse caso é necessário, pois declaramos um ponteiro para um nó dentro da própria struct do nó, logo, precisamos saber o nome do
tipo. Por isso, chamamos a struct de _lista_no.
Esse é um nome temporário que será utilizado apenas nesse momento. A partir de agora, utilizaremos apenas o nome de tipo lista_no para criar
novos nós.
Agora que já temos a estrutura básica de nossa lista, precisamos implementar as funções a serem utilizadas para manipulá-la.
Criando uma lista nova
Para facilitar as coisas, vamos definir para nossa estrutura um nó chamado de “cabeça” da lista. A cabeça da lista não armazenará nenhum dado.
Ela serve apenas para apontar para o primeiro elemento propriamente dito. Caso não utilizássemos um nó fixo para apontar para o início da lista, o
ponteiro para o início da lista seria alterado toda vez que o primeiro elemento fosse removido. Para contornar isso, precisaríamos utilizar ponteiros
para ponteiros (double indirection), o que seria uma complicação a mais nesse momento. Entretanto, uma “lista sem cabeça” funciona muito bem
para implementar pilhas, então voltarei nesse assunto no futuro.
Nosso código para iniciar a lista vai ficar assim:
6. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 6/18
lista_no * lista_cria(void){
lista_no * cabeca = malloc(sizeof(lista_no));
cabeca -> prox = NULL;
return cabeca;
}
Primeiro, alocamos um espaço na memória (https://pt.wikipedia.org/wiki/Aloca%C3%A7%C3%A3o_din%C3%A2mica_de_mem%C3%B3ria_em_C)
para armazenar um nó, que chamei de cabeca. A função malloc() retornará um ponteiro para um espaço de memória de tamanho suficientemente
grande para armazenar os valores de uma struct do tipo lista_no. Como disse anteriormente, por convenção, o valor NULL significa “fim da lista”,
por isso definimos prox (ponteiro para o próximo) como NULL.
Agora, para criar uma nova lista, basta definirmos uma variável do tipo lista_no * com o valor retornado por lista_cria(), assim:
lista_no * lista = lista_cria();
Não se esqueça de incluir o arquivo de cabeçalho <stdlib.h> para podermos utilizar a função malloc() .
Inserindo elementos na lista encadeada
Os três tipos de inserção tradicionais em uma lista consistem em:
Inserir no início da lista;
Inserir no final da lista;
Inserir numa posição específica da lista.
De todas essas, inserir elementos no início da lista é certamente o mais trivial:
7. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 7/18
void lista_insere(lista_no * lista, int val){
lista_no * novo_no = malloc(sizeof(lista_no));
novo_no -> dado = val;
novo_no -> prox = lista -> prox;
lista -> prox = novo_no;
}
Trocando em miúdos o processo é o seguinte:
1. Cria um novo nó e define o valor do elemento;
2. O novo nó aponta para o nó para o qual a cabeça da lista aponta;
3. Agora a cabeça da lista aponta para o novo nó.
Com essa simples dança das cadeiras de ponteiros, conseguimos inserir um nó no início da lista, sem precisar reordenar todos os outros elementos!
Processo de inserção de um nó no início de uma lista encadeada com cabeça.
Interlúdio: imprimindo a lista encadeada
8. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 8/18
Antes de continuarmos com as outras funções de inserção, vamos logo implementar a função de imprimir a lista na tela, para que você possa ver
seu código funcionando.
Para imprimir cada elemento, precisamos bolar um jeito de percorrer nossa lista. Na verdade, isso é muito simples, e utilizaremos o mesmo
algoritmo para percorrer a lista em diferentes funções, com pequenas modificações. Como é certo que nossa lista termina com NULL, para passear
por cada item da lista, basta o seguinte código:
while(lista){
lista = lista -> prox;
}
Quando fazemos comparações, a constante NULL equivale a 0, então while(lista) equivale a while(lista != NULL). O que estamos fazendo é
simplesmente passar para o próximo item da lista a cada iteração, e então paramos quando chegamos no ponteiro nulo. Agora basta inserirmos
dentro do laço o que queremos fazer a cada iteração. Em nosso caso, queremos imprimir cada elemento. Podemos fazer isso com um comando
como:
printf("[%d]->", lista -> dado);
Mas como nossa lista tem uma “cabeça” cuja variável dado não foi definida, antes de começarmos a iteração, precisamos pular para o primeiro nó
válido da lista. Nossa função completa fica assim:
void lista_imprime(lista_no * lista){
lista = lista -> prox;
while(lista){
printf("[%d]->", lista -> dado);
lista = lista -> prox;
}
printf("NULLn");
}
9. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 9/18
Vale lembrar que quando alteramos o valor de lista dentro da função, perdemos a referência ao início da lista. O que significa que não temos mais
como acessar o início da lista depois do laço while dentro da função. Isso não importa já que retornaremos para main() logo depois, e as alterações
na variável lista não modificam a variável original. Mas caso você não queira perder a referência ao início da lista (talvez para percorrê-la
novamente), basta declarar uma variável auxiliar:
void lista_imprime(lista_no * lista){
lista_no * aux = lista -> prox;
while(aux){
printf("[%d]->", aux -> dado);
aux = aux -> prox;
}
printf("NULLn");
}
Agora que já podemos criar a lista, inserir elementos e imprimir, podemos fazer o nosso primeiro teste. No momento, nosso código para
manipulação de listas já tem o seguinte:
10. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 10/18
#include <stdio.h> /*lista_imprime */
#include <stdlib.h> /*malloc() */
typedef struct _lista_no{
int dado;
struct _lista_no * prox;
} lista_no;
lista_no * lista_cria(void){
lista_no * cabeca = malloc(sizeof(lista_no));
cabeca -> prox = NULL;
return cabeca;
}
void lista_insere(lista_no * lista, int val){
lista_no * novo_no = malloc(sizeof(lista_no));
novo_no -> dado = val;
novo_no -> prox = lista -> prox;
lista -> prox = novo_no;
}
void lista_imprime(lista_no * lista){
lista = lista -> prox;
while(lista){
printf("[%d]->", lista -> dado);
lista = lista -> prox;
}
printf("NULLn");
}
Agora já podemos testar nosso programa. Vamos definir nosso main() e utilizar as funções que acabamos de criar. O código abaixo:
11. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 11/18
int main(void){
lista_no * lista = lista_cria();
lista_insere(lista, 1);
lista_insere(lista, 4);
lista_insere(lista, 2);
lista_imprime(lista);
}
Deve mostrar a seguinte saída:
[2]->[4]->[1]->NULL
Como inserimos cada item no início, a ordem dos elementos é inversa à ordem em que os adicionamos. Agora vamos ver como inserir itens no fim
da lista.
Inserindo itens no final da lista encadeada
Numa lista encadeada simples, tudo que temos é um ponteiro para o início da lista. Desse modo, para inserir itens no fim da lista precisamos
percorrer toda a lista até encontrar o ponteiro nulo e
então “encaixar” o novo elemento. Evidentemente, esse é um processo muito mais “caro” em termos de processamento e vai ficando cada vez mais
caro à medida que novos itens vão sendo acrescentados à lista. Nos próximos posts, vamos ver como podemos contornar esse fato, mas por
enquanto, vamos nos resignar e seguir em frente.
O início da nossa função lista_apensa() será igual ao da função lista_insere(), exceto em um ponto: como nosso novo item será o último da lista,
então o valor de novo_no -> prox deverá ser NULL.
Além disso, vamos modificar um pouco nosso algoritmo para percorrer listas. No caso da função de imprimir, chegamos até o valor NULL, depois
de passar pelo último item válido da lista. Nesse caso, não queremos que o valor da variável lista chegue a ser NULL. Queremos que ela pare a
iteração no último item válido da lista, para que possamos “ajustar nossos ponteiros” (entendeu o trocadilho?). Vejamos como fica nossa função:
12. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 12/18
void lista_apensa(lista_no * lista, int val){
lista_no * novo_no = malloc(sizeof(lista_no));
novo_no -> dado = val;
novo_no -> prox = NULL; /*O novo elemento vai ser o ultimo*/
while(lista -> prox){
lista = lista -> prox;
}
lista -> prox = novo_no;
}
Perceba que agora não precisamos pular a cabeça da lista explicitamente. Nesse código iteramos sobre cada item a partir do segundo nó (como a
cabeça é o primeiro nó, o segundo nó é o primeiro que armazena efetivamente um valor). Caso a lista esteja vazia, lista -> prox será igual a NULL,
então o código do laço não chega a ser executado. Caso a lista não esteja vazia, ele percorre toda a lista até que o prox do nó atual seja igual NULL.
Em outras palavras, a variável lista para quando armazena o nó do último elemento válido.
Nesse ponto, tudo que precisamos fazer é alterar a variável prox desse nó para que aponte para o nó recém criado.
Utilizando essa mesma lógica e com o auxílio de uma variável funcionando como contador, podemos criar uma função com o protótipo:
void lista_insere_indice(lista_no * lista, int indice, int val);
que armazene o novo nó num índice específico da lista. Para inserir o item 5 no início da lista, devemos chamar a função assim:
lista_insere_indice(lista, 0, 5);
Nesse caso, a função deve se comportar exatamente como lista_insere(lista, 5). Para inserir um item depois do primeiro elemento, devemos indicar:
lista_insere_indice(lista, 1, 5);
13. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 13/18
E assim por diante. A implementação dessa função fica como dever de casa! O outro dever de casa é implementar as funções:
int lista_pega(lista_no * lista, int indice);
void lista_muda(lista_no * lista, int indice, int val);
A primeira função deve retornar o valor armazenado em determinado índice da lista. Já a segunda deve alterar o valor de determinado índice. A
implementação dessa função será muito semelhante à função lista_insere_indice().
Removendo itens da lista encadeada
O processo de remover itens da lista é muito semelhante ao de adicionar. Entretanto, teremos que ter o cuidado adicional de liberar o espaço da
memória alocado com o malloc() utilizando free(). Vejamos o código seguinte:
void lista_remove_prox(lista_no * lista){
lista_no * seguinte = lista -> prox;
if (seguinte){
lista -> prox = seguinte -> prox;
free(seguinte);
}
}
Assim como adicionar itens no início da lista, remover também exige pouco mais que ajustar alguns ponteiros. A lógica é a seguinte: a lista aponta
para o próximo elemento; para remover o próximo, basta fazer com que a lista passe a apontar para o próximo do próximo, que atualmente é o
segundo elemento.
14. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 14/18
Processo de remoção de um nó do início de uma lista com cabeça.
Aqui, criamos uma variável seguinte para armazenar o endereço de memória que precisamos liberar (o próximo da lista). Se não fizéssemos isso, ao
ajustar o ponteiro lista -> prox para apontar para o próximo do próximo (lista -> prox = lista-> prox -> prox), perderíamos a referência ao elemento
antes de liberá-lo. A função continuaria funcionando e cumprindo seu objetivo, mas o espaço alocado para o nó a ser eliminado ficaria inutilizado. É
como se o nó removido continuasse
existindo, “perdido” do resto da lista porque ninguém aponta mais pra ele. Para evitar esse fim trágico para nosso querido nó, devemos libertá-lo
com a função free(), evitando assim que ele se torne uma alma penada.
15. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 15/18
O fenômeno da célula penada. Como ninguém aponta para ela, ninguém sabe que ela existe.
Perceba o uso do if na terceira linha. Ele serve para
nos certificarmos de que seguinte não é NULL. Pois
se tentassemos acessar NULL -> prox, nosso
programa daria erro!
Utilizando esse código na cabeça da lista encadeada,
removemos o primeiro item da lista (lembrando
outra vez que como a cabeça não armazena nada, os
itens da lista são armazenados a partir do segundo
nó desta). Entretanto, a mesma função serve para
remover qualquer nó da lista, desde que passemos
para a função o nó anterior ao que desejamos
remover. Então, podemos reaproveitar esse código
para implementar uma função que remova o último item da lista, ou determinado item baseado em seu índice, ou em seu valor.
Para removermos um item baseado em seu valor, podemos fazer o seguinte:
void lista_remove_val(lista_no * lista, int val){
lista_no * anterior = lista;
lista_no * atual = lista -> prox;
while(atual){
if (atual -> dado == val){
lista_remove_prox(anterior);
return;
}
anterior = atual;
atual = atual -> prox;
}
}
Bom, talvez esse negócio de “atual é igual ao próximo do atual” e “anterior é igual a atual” dê um nó na cabeça num primeiro momento. Mas a
lógica é bem simples. O nosso laço while é bem semelhante ao que já utilizamos anteriormente para percorrer a lista. A diferença é que agora, a
cada iteração, salvamos o endereço do nó que está sendo processado no momento, antes de passar para a próxima iteração (na iteração seguinte, a
16. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 16/18
variável anterior terá o valor do nó da iteração anterior, antes que alteremos novamente seu valor). Assim, quando encontrarmos o valor que
desejamos no nó atual, enviamos o anterior para nossa função de remover o próximo nó.
Você pode utilizar um raciocínio semelhante para implementar uma função que remova o último item da lista, ou que remova um item baseado no
índice da lista. Esse vai ser seu dever de casa do post de hoje!
Nossa interface para listas utilizando a estrutura de listas encadeadas simples já está ficando bem robusta. Para concluí-la, vamos desenvolver nossa
última função: void lista_limpa(lista_no *lista).
Esta função será utilizada para remover todos os nós de determinada lista, com exceção da cabeça.
Vejamos:
void lista_limpa(lista_no *lista){
lista_no * seguinte = lista -> prox;
while(seguinte){
lista -> prox = seguinte -> prox;
free(seguinte);
seguinte = lista -> prox;
}
}
Quase nada de novo no front. A lógica da função é: enquanto a variável prox da cabeça não apontar para NULL, a variável prox da cabeça passa a
apontar para o elemento seguinte ao próximo, liberando a memória alocada para o elemento para o qual a cabeça inicialmente apontava.
Perceba que essa função guarda muito da mecânica da nossa conhecida…
void lista_remove_prox(lista_no * lista){
lista_no * seguinte = lista -> prox;
if (seguinte){
lista -> prox = seguinte -> prox;
free(seguinte);
}
}
17. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 17/18
Na verdade, lista_limpa() faz a mesma coisa, só que repetidamente. Podemos então utilizar
nossa lista_remove_prox() dentro de lista_limpa(), ao invés de reescrever o código todo.
void lista_limpa(lista_no *lista){
while(lista -> prox)
lista_remove_prox(lista);
}
Simples, não?
Depois de utilizar essa função, a lista terá apenas a cabeça, que poderá ser reutilizada depois. Caso o usuário não precise mais da cabeça da lista, ele
mesmo deve manualmente liberar a cabeça da lista chamando free() e se comprometer a alterar o valor da variável para NULL, já que agora ela
aponta pra lixo de memória.
Claro que essa é uma abordagem perigosa, o correto seria que nossa própria função fizesse esse trabalho de limpeza. Mas, como vimos
anteriormente, se modificarmos o valor da variável que aponta para a cabeça da lista dentro de uma função, esse valor permanece intacto fora dela.
Se quiséssemos mudar efetivamente o endereço contido em nossa variável lista, precisaríamos utilizar os temidos ponteiros para ponteiros. A
questão é que criamos uma lista com cabeça justamente pra fugirmos deles! Por isso é que vou tratar desse assunto no próximo post sobre listas
encadeadas, quando vamos conhecer a lenda das listas sem cabeça (https://amadorprograma.com/2021/07/16/listas-encadeadas-sem-cabeca/)!
Tags: estrutura de dados linguagem c listas encadeadas
← Turbinando vetores e structs em C99
DFS Sudoku Solver: um resolvedor de jogos de sudoku em Python →
1 comment for “Listas encadeadas em C: conceitos, criação e manipulação de
listas simples”
18. 11/10/21, 12:44 Listas encadeadas em C: conceitos, criação e manipulação de listas simples – amador programa
https://amadorprograma.com/2020/10/30/listas-encadeadas-em-c/ 18/18
1.
Pingback: Listas encadeadas sem cabeça – amador programa
Blog no WordPress.com.