Ir ao conteúdo
  • Cadastre-se
João Victor Simonassi Farias

Cadastro em c - como adicionar mais de um item ao elemento?

Recommended Posts

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


//CRIANDO A ESTRUTURA DO TIPO_LISTA
struct Tipo_Lista {  //Criando uma estrutura, vou poder usar variáveis do tipo lista, que irão suportar os dois itens abaixo
		int cod; // Código que vamos buscar, pesquisar, imprimir...
		struct Tipo_Lista *Prox;  //O ponteiro vai conter toda a estrutura
};


struct Tipo_Lista *Primeiro; //Aponta para o primeiro elemento inserido na lista
struct Tipo_Lista *Ultimo;  //Aponta para o último elemento inserido na lista


//FUNÇÃO PARA CRIAR A LISTA VAZIA
void FLVazia () {   //Função para finalmente criar a lista vazia
	struct Tipo_Lista *aux;   // Declaração de uma variável auxiliar do tipo lista                                                                                             ALOCA  #   TAMANHO DE
	aux = (struct Tipo_Lista*)malloc(sizeof(struct Tipo_Lista));   //alocando espaço na memória para "aux" com a função malloc    #####  VARIÁVEL = (TIPO DO ARQUIVO/VARIÁVEL) MALLOC (   SIZEOF  (TIPO DO ARQUIVO OU NOME DA VARIÁVEL)
	Primeiro = aux;
	Ultimo = Primeiro; //neste momento as três variáveis apontam para o local de origem da lista, o local de partida
}

//FUNÇÃO PARA INSERIR UM ELEMENTO
void Insere (int x) { //x = ao novo elemento a inserir, no caso o "cod", declarado na primeira estrutura
	struct Tipo_Lista *aux;
	aux = (struct Tipo_Lista*)malloc(sizeof(struct Tipo_Lista));
	aux->cod = x; // a seta (->) é porque nesse caso é um apontador. Se fosse um registrador normal, seria o "."
	Ultimo->Prox  = aux; //Agora só a variável "Ultimo" faz ligação com "aux", que é o próximo item
	Ultimo = Ultimo->Prox; //"Ultimo" recebe a posição de memória do ultimo item que foi inserido  ###    Ele saiu da posição que se encontrava na função "FLVazia"
	aux->Prox = NULL; //Serve como condição de parada
}

//FUNÇÃO PARA IMPRIMIR
void Imprime () {
	struct Tipo_Lista *aux;
	aux = Primeiro->Prox; //Recebe o "Primeiro.Prox", pra cair na segunda posição da fila. Só observar a primeira função!

		while(aux!= NULL) { // Enquanto a lista não chegar ao fim, ele fica dentro do laço
			printf("Item %d\n\n", aux ->cod);
			aux = aux->Prox;  //IMPORTANTE! "aux" recebe o valor da próxima posição da lista. Desta forma, a lista pode andar.
		}
}
//FUNÇÃO PARA PESQUISAR
void Pesquisa (int x) {  // "x" vai ser o item que você quer procurar (ELE VAI SER COMPARADO COM TODOS OS ITENS DA LISTA)
	struct Tipo_Lista *aux;//De novo rs
	int flag = 0; //O "flag" vai dar apenas um apoio pra saberse ele acgou ou não o item. Não entendi porque o nome é FLAG, se a tradução é BANDEIRA
	aux = Primeiro->Prox; //Primeira posição de memória que tem um item inserido

	while(aux != NULL){//Repete testando os espaços da lista. Se encontrou, ele para de procurar.
		if(aux->cod == x){//Se ele encontrou o item "x" no espaço de memória "aux->cod", ele entra na condicionál
			printf("Achou o item %d", x);
			flag=1; //Flag vira um para que ele não caia naquele if láááá de baixo.
			aux = NULL; //aux = NULL para sair do while
		}
		else{
			aux = aux->Prox; // Se ele não encontrou naquela posição (A que estava no if aqui em cima) ele anda uma posição e testa novamente. Se não, de novo... até o fim da lista.
		}
	}
	if(!flag){ //Percorreu a lista toda e não encontrou    (LEMBRANDO QUE 0=VERDADEIRO E 1= FALSO)
		printf("Item %d, não se encontra na lista", x);
	}
}



main() {
setlocale(LC_ALL, "portuguese");
FLVazia();


int opcao, volta;

int a=0, codigo;
while(1){
system("cls");
printf("\n\n ADICIONAR PRODUTO ------- [1]\n");
printf(" REMOVER PRODUTO ----------[2]\n");
printf(" VISUALIZAR PRODUTOS------ [3]\n");
printf(" PESQUISAR PRODUTOS------- [4]\n");
printf(" SAIR -------------------- [5]\n");

scanf("%d", &opcao);
            if(opcao == 1){ 
            do{
			printf("\nInforme o codigo do produto: ");
			scanf("%d", &codigo);
			Insere(codigo);
			printf("\nDeseja adicionar um novo produto? Sim = 1  ou  Não = 0  \n\n");
			scanf("%d", &volta);
			
		}while(volta == 1);
		}
		
		else if(opcao == 2)
		printf("Tô fazendo essa função ainda");
		
		else if(opcao == 3){
			Imprime();
		}
		
		else if(opcao == 4) {
			printf("Digite o código do produto para pesquisa: ");
			scanf("%d", &codigo);
			Pesquisa(codigo);
		}
		
		else if(opcao == 5)
		     exit(0);
		else
		     printf("Opção inválida!");
		     
system("pause");
}
	return 0;

}

Fala galera, estou tentando aprender sobre listas encadeadas, mas está complicado.Desenvolvi este código acima que cria uma lista de itens. O que gostaria de fazer agora é criar uma lista de cadastro de produtos. Por exemplo, para cada item adicionado eu tenha nome, código, preço... essas coisas, mas tudo em um item somente e repetir esse processo para cada item. Alguém tem alguma ideia de como fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É a mesma coisa acho... digo acho porque não sei se entendi corretamente o que você ta querendo.
Na sua estrutura Tipo_Lista você tem int cod, o caso seria ampliar essa estrutura com as variáveis que você necessitar(nome, código, preço...), e também alterar as funções que fazem a entrada para que não só leiam um cod, se não um nome, um preço, etc. Acho que é isso que você quer não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

para pesquisar está claro que dependendo do campo da estrutura você terá que ter uma ou mais funções pesquisar. Por exemplo para pesquisar por nome você precisa de uma função pesquisarNome("Fulano"). Para pesquisar por cod você tem ja sua função, você simplesmente teria que fazer um submenu que quando o usuario escolher PESQUISAR PRODUTOS você pergunte algo como:
1-Código
2-Nome
0-sair

E dependendo do escolhido você invoca uma ou outra função de pesquisa.

E também precisaria alterar as outras funções para poder ler nome, alterar nome, borrarr nome, etc, conforme sua necessidade.

Acho que deu para entender não?
 






 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×