Ir ao conteúdo
  • Cadastre-se

C Programa em C para cadastro


Luan Porto

Posts recomendados

Estou tentando fazendo um programa em C que tenha um cadastro de um código, idade e o nome, salvando os dados em uma lista encadeada, com isso, quero incluir, quero listar com o critério de idade, alterar somente o nome e a idade e excluir. Não estou conseguindo sair do lugar, não consigo de maneira alguma fazer, travei no começo da inclusão. Alguém poderia dar uma luz?

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

typedef struct aux{
	int chave;
	struct aux *dir;
}NO;


typedef NO* PONT;

PONT inicializa(){
	return(NULL);
}

PONT r = inicializa();

PONT criaNovoNo(int ch){
	PONT novoNo = (PONT)malloc(sizeof(NO));
	novoNo->chave = ch;
	novoNo->dir = NULL;
	return(novoNo);
}

PONT adiciona(PONT raiz, PONT no){
	if(raiz==NULL) return(no);
	else
		raiz->dir = adiciona(raiz->dir, no);
	return(raiz);
}


PONT contem(int ch, PONT raiz){
	if(raiz==NULL) return(NULL);
	if(raiz->chave == ch) return (raiz);
	else
		return(contem(ch, raiz->dir));
}

void incluir(PONT r){
	int valor=0,idade=0,resultado;
	char nome[100];
	FILE *cadastro; 
		
		system("cls");
		printf("-------- Cadastro --------\n\n");
		printf("Digite o Numero de Inscricao: ");
		scanf("%i",&valor);
		
	while(valor!=0){
		printf("\nDigite a Sua Idade:");
		scanf("%i",&idade);
		printf("\nDigite o Seu Nome:");
		cadastro=fopen("cadastro.txt","a");
		scanf("%s",nome);
		fprintf(cadastro,"%s",nome);
		fclose(cadastro);
		PONT adiciona = contem(idade, r);
		system("pause");
		system("cls");
		printf("-------- Cadastro --------\n\n");
		printf("Digite o Numero de Inscricao: ");
		scanf("%i",&valor);
		
	}

}


void alterar(){

	
}

void mostrarLista(){
 
}

void excluir(){
	
}
int main(void){
	int opc=0;
	while(opc != 5){
		system("cls");
		printf("---------Lista Encadeada---------\n\n");
		printf("1 - Incluir\n");
		printf("2 - Buscar\n");
		printf("3 - Alterar\n");
		printf("4 - Listar\n");
		printf("5 - Sair\n");
		printf("-----------------------------------\n\n");
		printf("Opção: ");
		scanf("%i",&opc);
		switch(opc){
			case 1:
				incluir(r);
				break;
			case 2:
				alterar();
				break;
			case 3:
				mostrarLista();
				break;
			case 4:
				break;
		}
	}
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Para criar uma lista dinâmica, você precisa de uma struct para ser a lista e outra para ser o nó.

typedef struct no {
  // Aqui vem o item
  struct no *proximo;  // Isso aponta para o proximo elemento da lista
} No;

typedef struct lista {
  No *primeiro;        // Isso aponta para o primeiro elemento da lista
} Lista;

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Seu programa não está bom. E assim vai ter muito trabalho pra testar e não precisa.

typedef struct aux{
	int chave;
	struct aux *dir;
}NO;


typedef NO* PONT;

PONT inicializa(){
	return(NULL);
}


Essa é sua lista. Deve focar primeiro nos dados antes de escrever o programa. Aí tem pouca informação.

 

Tem pouco conteúdo aí. E vai ter que arrumar dentro do programa. Muito já podia estar já aí dentro.
 

Que pretende com inicializa()? Não faz sentido. Devolver NULL é o mesmo que escrever

PONT* lista = 0;

Não serve para nada.

 

main() deve ser a última função de seu programa e não a primeira. Quando você abre o programa espera ver main(). Na verdade conforme seus programas aumentarem de tamanho talvez se acostume a deixar main() em um arquivo separado, pra não ficar compilando toda hora coisas em que não está mais mexendo, porque é mais esperto fazer assim.

 

Uma lista ligada não é um objetivo. É uma ferramenta
 

Entenda que sua lista é só um jeito de você agrupar os itens de cadastro, nesse caso. No seu próximo uso pode a tal lista de livros, a playlist com as músicas ou os itens da nota fiscal, para citar os exercícios mais comuns ;) . Mas a lista é a mesma. É muito importante você considerar isso. 

  • a lista pode ter ponteiros para frente e para trás. Não faz diferença para programar. Mas vai preferir ter os dois.
  • a lista tem nós, os tais Nodes
  • os Nodes tem Elementos, que aqui são o cadastro.
  • use ponteiros para todos eles para ficar genérico. Vai gostar na semana que vem quando for mudar algo ou fazer uma lista de outras coisas

O que define a lista?

 

sem inventar nada, pode ver no livro ou nas outras linguagens: 

  • a lista tem um tamanho
  • tem um total atual de itens
  • tem um endereço de início e de fim
  • pode ter um nome ou uma identificação porque se você tem mais de uma pode ser útil pra diferenciar

Então isso já deve fazer parte da lista e não de variáveis em seu programa. Só vai dar mais trabalho se não fizer assim. Em especial se pensar em ter mais de uma. 

 

Não use um menu antes de terminar de escrever as funções

 

Resista até o 'último momento a escrever um menu ou ficar lendo dados do teclado. Só vai atrasar. Uma lista é uma lista. Um cadastro dentro de uma lista é um cadastro. Por exemplo, se vai alterar um registro escreva

int alterar(Elemento* de, Elemento* para, Lista* lista);

e teste assim:

    n = alterar(antes, para, cadastro1);

É mais esperto assim. E você pode testar milhares de alterações em um loop. Ou ficar digitando no teclado um elemento, depois uma alteração, depois mostra... Leva uma era e não precisa.

 

Um exemplo de Lista:

 

Veja essa declaração de Lista de Nodes com Elementos e veja se entende a diferença:

 

Um elemento

typedef struct
{
	int chave;
}   Elemento;

Assim quando a programação lista estiver ok você pode alterar para incluir nome, endereço, idade, espaçonave, planeta, o que seja. E não mexer na lista.

 

Um nó da lista

typedef struct um_no
{
	Elemento* el;
	struct um_no* A; // Antes
	struct um_no* D; // Depois
}	No;

Um nó tem um ponteiro para um elemento. Sem entrar no mérito do que é. Isso é muito importante. A lista é uma ferramenta. Uma abstração. E tem que ficar assim, abstrata. Genérica. Você vai usar depois. E depois. Com outros tipos de elementos.

 

Se não quer tratar ponteiros pros dois lados não use os dois. Mas aí para voltar um cara tem que ir pro início e contar um por um ou ficar salvando os ponteiros, o que é igualmente chato.

 

A lista

typedef struct
{
	char*   nome;
	int     maximo;
	int     quantos;
	No*     inicio;
	No*     fim;
}	Lista;

Pois é: a lista tendo DENTRO dela esses valores facilita muito a sua vida pra escrever o programa. Sempre tem um limite pra se defender, um máximo de itens. Tem um contador atualizado, tem um nome até, que pode deixar como  NULL, mas pode usar na hora de listar, por exemplo.

 

Você sempre tem um ponteiro para o início, mas pense bem: se tiver um para o fim inserir no final fica bem fácil. Se tiver um para o início inserir no início fica muito fácil. Mas se tiver os dois a vida fica bem mais simples. E manter os dois atualizados é trivial. Mas achar o outro se só tem um é uma m#$%a porque tem que percorrer a lista toda.

 

Inserir onde afinal?


Em geral: inserir no início, no final e em alguma ordem. É isso que vai usar. Inserir na ordem pode ser também genérico, basta que você tenha uma função que compara dois elementos. Se mudar a lógica você muda só a função que compara. Sem novidades porque o próprio compilador C faz isso em qsort() por exemplo.

 

Como criar uma lista assim?

Lista* inicializa(char* nome, int limite)
{
	Lista* l;
	l = (Lista*)malloc(sizeof(Lista));
	l->nome = malloc(strlen(nome) + 1);
	strcpy(l->nome, nome);
	l->maximo = limite;
	l->quantos = 0;
	l->inicio = NULL;
	l->fim = NULL;
	return l;
};

Nada de especial: declara um ponteiro para a lista, preenche os campos e retorna. Já faz sentido assim.


Compare com o que usou

PONT inicializa() {
	return NULL;
}

Como usar? 

	Lista* uma = inicializa("Exemplo 1", 12);
	Lista* outra = inicializa("Outro Exemplo", 15);

Veja como só ao declarar você já cria alguma informação: cada lista agora tem um nome, uma capacidade e um endereço.

 

Confirme se entendeu a diferença e os detalhes se se interessou por esse caminho

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...