Você está aqui: C ::: Estruturas de Dados ::: Lista Ligada Simples

Inserindo depois de um determinado nó em uma lista encadeada simples usando a linguagem C

Quantidade de visualizações: 1382 vezes
Inserindo depois de um determinado nó em uma lista encadeada simples usando C

Em algumas situações nós precisamos inserir o novo nó depois de um determinado nó na lista encadeada simples. Veja, por exemplo, uma lista com o seguintes valores:

45 | 3 | 98 | 47

Suponha que queremos inserir o valor 50 depois do 98, então o novo conteúdo da lista será:

45 | 3 | 98 | 50 | 47

Observe que neste exemplo eu tratei o caso de inserir depois do primeiro nó, ou seja, depois do 45, mas não tratei a lista vazia. Há também a questão do erro de acesso de memória caso o usuário queira inserir depois de um nó não existente (não tratada). Veja o código completo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
 
// estrutura Nó
struct No{
  int valor;
  struct No *proximo;
};
// fim da estrutura Nó
 
// função que permite exibir os valores de
// todos os nós da lista
void exibir(struct No *n){
  if(n != NULL){
    do{
      printf("%d\n", n->valor);
      n = n->proximo;
    }while(n != NULL);
  }
  else
    printf("A lista esta vazia\n\n");
}
 
// função que permite inserir um novo nó
// depois de um determinado valor
struct No *inserir_depois_valor(struct No *n, int v, 
  int v_depois){
  // reserva memória para o novo nó
  struct No *novo = (struct No*)malloc(sizeof(struct No));
  novo->valor = v;

  struct No *temp = n; // aponta para o início da lista
  // guarda o nó depois do nó atual
  struct No *depois = temp;
  
  // enquanto for diferente do valor que estamos procurando
  while(depois->valor != v_depois){
    depois = temp; // depois recebe temp
    // e temp recebe o seu próximo
    temp = temp->proximo;
  }
  
  // ATENÇÃO: não estamos tratando a condição
  // de lista vazia. Para isso veja minha dica
  // sobre como inserior no início da lista
  
  // vamos inserir depois do primeiro nó
  if(depois == n){
    // o próximo do novo nó aponta para
    // o segundo nó
    novo->proximo = n->proximo;
    // o primeiro nó aponta para o novo nó
    n->proximo = novo;
  }
  else{
    // o proximo do anterior é o novo nó
    depois->proximo = novo;
    // e o próximo do novo nó é temp
    novo->proximo = temp;
  }

  return n;
}

// função que permite inserir nós no
// final da lista.
// veja que a função recebe o valor a ser
// armazenado em cada nó e um ponteiro para o
// início da lista. A função retorna um
// ponteiro para o início da lista
struct No *inserir_final(struct No *n, int v){
  // reserva memória para o novo nó
  struct No *novo = (struct No*)malloc(sizeof(struct No));
  novo->valor = v;
 
  // verifica se a lista está vazia
  if(n == NULL){
    // é o primeiro nó...não deve apontar para
    // lugar nenhum
    novo->proximo = NULL;
    return novo; // vamos retornar o novo nó como sendo o início da lista
  }
  else{ // não está vazia....vamos inserir o nó no final
    // o primeiro passo é chegarmos ao final da lista
    struct No *temp = n; // vamos obter uma referência ao primeiro nó
    // vamos varrer a lista até chegarmos ao último nó
    while(temp->proximo != NULL){
      temp = temp->proximo;
    }
    // na saída do laço temp aponta para o último nó da lista
   
    // novo será o último nó da lista...o campo próximo dele deve
    // apontar para NULL
    novo->proximo = NULL;
    // vamos fazer o último nó apontar para o nó recém-criado
    temp->proximo = novo;
    return n; // vamos retornar o início da lista intacto
  }
}
 
int main(int argc, char *argv[])
{
  // declara a lista
  struct No *inicio = NULL;
 
  // vamos inserir quatro valores no final
  // da lista
  inicio = inserir_final(inicio, 45);
  inicio = inserir_final(inicio, 3);
  inicio = inserir_final(inicio, 98);
  inicio = inserir_final(inicio, 47);
 
  // vamos exibir a lista
  puts("Valores atuais:\n");
  exibir(inicio);
  
  // vamos inserir o valor 50 depois do 3
  inicio = inserir_depois_valor(inicio, 50, 3);
  
  // vamos exibir a lista novamente
  puts("\nValores agora:\n");
  exibir(inicio);
  
  puts("\n\n");
  system("pause");
  return 0;
}


Link para compartilhar na Internet ou com seus amigos:

C ::: Desafios e Lista de Exercícios Resolvidos ::: Arrays e Matrix (Vetores e Matrizes)

Exercício Resolvido de C - Usando um laço for para percorrer os elementos de uma matriz e exibir a soma dos valores positivos e a quantidade de valores negativos

Quantidade de visualizações: 11688 vezes
Exercícios Resolvidos de C - Usando um laço for para percorrer os elementos de uma matriz e exibir a soma dos valores positivos e a quantidade de valores negativos

Pergunta/Tarefa:

Considere a seguinte matriz de inteiros:

// uma matriz de inteiros contendo sete elementos
int valores[] = {-3, 9, 12, -34, -2, 20, 10};


Escreva um programa C que usa um laço for para percorrer todos os elementos desta matriz e exibir a soma dos valores positivos e a quantidade de valores negativos. Seu programa deverá exibir uma saída com a mensagem:

A soma dos valores positivos é: 51
A quantidade de valores negativos é: 3


Resposta/Solução:

Veja abaixo a resolução completa para esta tarefa:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  // uma matriz de inteiros contendo sete elementos
  int valores[] = {-3, 9, 12, -34, -2, 20, 10};
    
  // o primeiro passo é criar uma variável que vai receber a soma
  // dos valores positivos
  int soma_positivos = 0;

  // agora uma variável para receber a quantidade de valores negativos
  int quant_negativos = 0;
  
  int i;

  // agora vamos usar uma laço for para percorrer todos os elementos
  // da matriz
  for(i = 0; i < 7; i++){
    // vamos verificar se o valor do elemento atual é negativo
    if(valores[i] < 0){
      quant_negativos++;  
    }
    else{ // o valor é positivo
      soma_positivos = soma_positivos + valores[i]; 
    }
  }

  // vamos exibir a soma dos valores positivos
  printf("A soma dos valores positivos é: %d\n", soma_positivos);

  // vamos exibir a quantidade de valores negativos
  printf("A quantidade de valores negativos é: %d\n", quant_negativos);

  system("PAUSE");	
  return 0;
}



C ::: Dicas & Truques ::: Strings e Caracteres

Como inverter (reverter) o conteúdo de uma string em C usando uma função str_reverse() personalizada

Quantidade de visualizações: 23669 vezes
O código abaixo mostra como você pode implementar uma função que inverte o conteúdo de uma string. Veja que o argumento para um função é um ponteiro para a string a ser invertida:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>

// função que reverte uma string
void str_reverse(char* str)
{
  char ch;
  int i, j;

  for(i = 0, j = strlen(str) - 1;  i < j;  ++i, --j)
  {
    ch = str[i];
    str[i] = str[j];
    str[j] = ch;
  }
}

int main(int argc, char *argv[])
{
  char nome[] = "Osmar J. Silva";

  // original
  printf("Original: %s\n", nome);

  // inverte
  str_reverse(nome);
  printf("Invertido: %s\n", nome);

  printf("\n\n");
  system("PAUSE");
  return 0;
}

Ao executar este código nós teremos o seguinte resultado:

Original: Osmar J. Silva
Invertido: avliS .J ramsO

Pressione qualquer tecla para continuar...


C ::: C para Engenharia ::: Geometria Analítica e Álgebra Linear

Como calcular a transposta de uma matriz em C - Curso de C para Geometria Analítica e Álgebra Linear

Quantidade de visualizações: 913 vezes
A matriz transposta de uma matriz A é a matriz AT. Tal matriz é obtida quando copiamos os elementos da matriz A para uma outra matriz (ou para ela mesma) e trocamos de posição as linhas e colunas. Dessa forma, a primeira linha da matriz A se transforma na primeira coluna da matriz transposta, a segunda linha da matriz A se transforma na segunda coluna da matriz transposta e assim por diante.

Em termos de notação, podemos dizer, de forma algébrica, que:

ATji = Aij

Onde i representa as linhas e j representa as colunas, tanto na matriz original quanto na matriz transposta.

É importante estar atento à quantidade de linhas e colunas na matriz original e na matriz transposta equivalente. Assim, se a matriz original for 3x2, a matriz transposta será 2x3.

Antes de vermos o código C, dê uma olhada na seguinte matriz de duas linhas e três colunas:

\[A = \left[\begin{matrix} 3 & 5 & 7 \\ 1 & 2 & 9 \end{matrix}\right] \]

Sua matriz transposta correspondente é:

\[A^T = \left[\begin{matrix} 3 & 1 \\ 5 & 2 \\ 7 & 9 \end{matrix}\right] \]

E agora veja o código C que declara uma matriz 2x3 e gera a matriz transposta 3x2:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(int argc, char *argv[]){
  setlocale(LC_ALL,""); // para acentos do português
	
  // vamos declarar e construir uma matrix
  // 2x3 (duas linhas e três colunas
  int matriz[2][3] = {{3, 5, 7}, {1, 2, 9}};
  int i, j;  
    
  // vamos exibir os valores da matriz
  printf("Elementos da matriz:\n");
  for(i = 0; i < 2; i++){
    for(j = 0; j < 3; j++){
      printf("%5d  ", matriz[i][j]);
    }
    printf("\n");
  }
    
  // como temos uma matriz 2x3, a transposta deverá ser
  // 3x2, ou seja, três linhas e duas colunas
  int linhas = 3; // linhas da matriz original
  int colunas = 2; // colunas da matriz original
  int transposta[linhas][colunas]; 
    
  // e agora vamos preencher a matriz transposta
  for(i = 0; i < 2; i++){
    for(j = 0; j < 3; j++){
      transposta[j][i] = matriz[i][j];
    }
  }
    
  // vamos exibir os valores da matriz transposta
  printf("Elementos da matriz transposta:\n");
  for(i = 0; i < 3; i++){
    for(j = 0; j < 2; j++){
      printf("%5d  ", transposta[i][j]);
    }
    printf("\n");
  }
  
  printf("\n\n");
  system("PAUSE");	
  return 0;
}

Ao executar este código C nós teremos o seguinte resultado:

Elementos da matriz:
    3      5      7  
    1      2      9  
Elementos da matriz transposta:
    3      1  
    5      2  
    7      9  



Vamos testar seus conhecimentos em JavaScript

Qual o resultado da execução do seguinte código JavaScript?

document.write(false == '0');

A) 0

B) false

C) 1

D) true

E) Erro de execução
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Engenharia Civil - Instalações Hidráulicas Prediais

Materiais empregados para instalação de água fria e esgoto

A instalação de água fria utilizando cano de PVC rígido da cor marrom exige uma série de cuidados, como, por exemplo, a questão da limpeza e da eliminação de sujeira em seu interior. Caso isso não seja feito, pode obstruir toda a rede quando ela for ligada à rede da rua. Nesse sentido, uma evolução tecnológica que facilita o manuseio de tubos e conexões na hora da montagem é:

A) o emprego de adesivo PVC de secagem rápida.

B) a utilização de anéis de vedação de borracha, o que facilita a execução.

C) a utilização de engate rápido superfície sobre superfície, eliminando anéis de vedação.

D) a utilização de conexão vedada com gaxeta, que pode ser regulada posteriormente.

E) o sistema de encaixe de topo, que dispensa acessórios de união entre canos, realizado por fricção.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em JavaScript

Dentro de qual elemento HTML nós inserimos nossos códigos JavaScript?

A) <js>

B) <scripting>

C) <javascript>

D) <script>
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Java

Analise o seguinte código Java

double a = 0.0 / 0;
System.out.println(a);

Qual é o resultado de sua execução?

A) Infinity

B) NaN

C) Uma exceção java.lang.ArithmeticException: / by zero

D) 0
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Python

Qual o resultado da execução do seguinte código Python?

estados = {"SP": "SÃO PAULO", "GO": "GOIÁS",
  "RJ": "RIO DE JANEIRO"}
estados.pop("RJ")
print(estados)

A) {'SP': 'SÃO PAULO', 'GO': 'GOIÁS'}

B) {'RJ': 'RIO DE JANEIRO'}

C) Um erro TypeError: pop expected at least 1 argument, got 0 na linha 3

D) {'SP': 'SÃO PAULO', 'GO': 'GOIÁS', 'RJ': 'RIO DE JANEIRO'}

E) {'GO': 'GOIÁS', 'RJ': 'RIO DE JANEIRO'}
Verificar Resposta Estudar Cards Todas as Questões

Desafios, Exercícios e Algoritmos Resolvidos de C

Veja mais Dicas e truques de C

Dicas e truques de outras linguagens

Códigos Fonte

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento
Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidadesControle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades
Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: Delphi
6º lugar: C
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2024 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 46 usuários muito felizes estudando em nosso site.