Ajuda com este exercício

Olá, boa tarde.

Tenho uma matéria de Estrutura de Dados na faculdade onde utilizamos a linguagem C para estudo. Na semana retrasada foi passado uma lista onde em sua maioria consegui resolver por ter conhecimento com outras linguagens, mas tive problemas com o exercício 4 devido ao fato de que neste exercício tem um assunto que não entendi muito bem, que é sobre lista-ligada simples.
Tentei resolver vendo algumas video aulas falando sobre o assunto e mesmo assim ainda é nebuloso para mim, então optei por pedir ajuda no fórum com este exercício.

“Faça um programa em C em que o usuário entra com
uma série de números inteiros, e armazene cada um desses números em uma
lista-ligada simples. O usuário deve informar, inicialmente, quantos números
vão ser inseridos. Depois, o programa deve imprimir a lista ligada, na mesma
ordem em que os elementos foram digitados pelo usuário. Depois, o programa
solicita que o usuário digite mais um número, e deve verificar se esse número
se encontra na lista de números digitados.”

Têm alguma ideia que possa me ajudar a resolver?
Obrigado!
Victor.

Edit: já tenho o seguinte código que tive como ideia para realizar a definição do tamanho, mas agora não sei como progredir.

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

struct Numeros {
int valor;
struct Numeros *proximo;
};

typedef struct Numeros numeros;

int main(){

int tamanhoLista;

numeros *pontoInicial;
numeros *proximoPonto;

printf("Digite o tamanho da lista:\n");
scanf("%d", &tamanhoLista);

pontoInicial = (numeros *)malloc(tamanhoLista);

return 0;

}

Pensei numa solução assim:

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

typedef struct Elemento {
  int valor;
  struct Elemento* proximo;
} Elemento;

typedef struct Lista {
  struct Elemento* primeiro;
} Lista;

Lista* criar() {
  return calloc(1, sizeof(Lista));
}

void adicionar(Lista* lista, int valor) {
  if (lista != NULL) {
    if (lista->primeiro == NULL) {
      lista->primeiro = calloc(1, sizeof(Elemento));
      lista->primeiro->valor = valor;
    } else {
      Elemento* elemento = lista->primeiro;

      while (elemento->proximo != NULL)
        elemento = elemento->proximo;

      elemento->proximo = calloc(1, sizeof(Elemento));
      elemento->proximo->valor = valor;
    }
  }
}

void destruir(Lista* lista) {
  if (lista != NULL) {
    Elemento* e = lista->primeiro;

    while (e != NULL) {
      Elemento* proximo = e->proximo;
      free(e);
      e = proximo;
    }

    free(lista);
  }
}

bool contem(Lista* lista, int valor) {
  for (Elemento* n = lista->primeiro; n != NULL; n = n->proximo)
    if (n->valor == valor)
      return true;
  return false;
}

void mostrar(Lista* lista) {
  for (Elemento* n = lista->primeiro; n != NULL; n = n->proximo)
    printf("%d\n", n->valor);
}

Lista* lista;

void pedirParaInserirValores() {
  int quantidade = 0;

  printf("Quantos itens deseja inserir? ");
  scanf("%d", &quantidade);

  for (int i = 0; i < quantidade; i++) {
    int valor = 0;
    printf("Entre com o %dº valor: ", i + 1);
    scanf("%d", &valor);
    adicionar(lista, valor);
  }
}

void mostrarValoresInseridos() {
  puts("Vc inseriu os seguintes valores");
  mostrar(lista);
}

void procurarUmValor() {
  int valor = 0;

  printf("Qual valor deseja procurar? ");
  scanf("%d", &valor);

  if (contem(lista, valor))
    puts("O valor desejado foi encontrado!");
  else
    puts("O valor não foi encontrado!");
}

int main() {
  lista = criar();

  pedirParaInserirValores();
  mostrarValoresInseridos();
  procurarUmValor();

  destruir(lista);

  return 0;
}

Obrigado amigo! Vou pegar sua solução e entender como ela funciona para fazer algumas alterações e aprender melhor o que acontece com a lista ligada.

Já fiz alguns testes com o seu código puro e deu tudo certinho!
Obrigado pela ajuda!

1 curtida

Oi, sou novo em C e gostaria de entender o que é esse “Elemento* próximo” que vc declarou aqui, isso me confundiu um pouco. Afinal vc esta referenciando o novo nome da struct dentro dela mesma?

Isso mesmo, estou referenciando a struct dentro dela mesma. É assim que uma linked list funciona, cada elemento possui uma referencia para o próximo elemento da sequencia.

Muito obrigado, esse lance de lista encadeada é novo kk

1 curtida