[JAVA] Hashing - Tentativa Linear - Problema Aniversariante

AJUDA JAVA!!!

Olá preciso de ajuda para resolver os métodos e atributos que faltam para adicionar nomes e aniversariantes maiores de 18 anos.
Ps.: Minha grade foi alterada e tive que pegar matérias avançadas sem terminar LPI…

Segue problema e algoritmo necessário:

Faça um programa que apresente o menu de opções abaixo. As operações devem ser implementadas em uma tabela hashing. Utilize como chave da tabela o mês de aniversário. Suponha que a tabela possua tamanho 20 e que seja implementada como uma de endereçamento aberto (tentativa linear).
Menu
1 – Cadastrar amigo (nome, dia e mês de aniversário)
2 – Consultar aniversariantes de um mês
3 – Contar as pessoas com idade superior a 18
4 – Excluir uma pessoa pelo nome
5 – Sair

import java.util.Scanner;

public class Hash_Aberto1 {
	public static class hash {
		
		int chave;
		char livre;  //L = livre O = ocupado, R = removido
	}
	
	static int tam=20; //tamanho função hashing
	static hash tabela[]=new hash[tam];
	static Scanner entrada = new Scanner(System.in);
	
	public static void inserir(int pos, int n) {
		
		int i=0;
		while (i < tam 
				&& tabela[(pos+i)%tam].livre != 'L' 
				&& tabela[(pos+i)%tam].livre != 'R')
				i = i+1;
		if (i < tam) {
				tabela[(pos+i)%tam].chave = n; 
				tabela[(pos+i)%tam].livre = 'O'; 
		}
		
		else
			System.out.println("Tabela Cheia");
	}
	
	public static void remover(int n) {
		
		int posicao = buscar(n);
		
		if (posicao < tam)
				tabela[posicao].livre = 'R';
		else
			System.out.println("Elemento não encontrado");
	}
	
	public static int buscar(int n) {
		
		int i=0;
		int pos=funcao_hashing(n);
		
		while (i < tam 
				&& tabela[(pos+i)%tam].livre != 'L'
				&& tabela[(pos+i)%tam].chave != n)
			i = i+1;
		if 
				(tabela[(pos+i)%tam].chave == n
				&& tabela[(pos+i)%tam].livre != 'R')
				return (pos+i)%tam;
		else
			return tam;

	}
	
	static int funcao_hashing(int num) {
		
		return num % tam;
		
	}
	
	static void mostrar_hash() {
		
		for(int i=0; i< tam; i++)
			if(tabela[i].livre == 'O')
				System.out.println("Entrada"+i+ ": "
						+ tabela[i].chave + " " 
						+ tabela[i].livre);
		
	}
	
	public static void main(String[] args) {
		
		int op, pos;
		int num, i;
		
		// inicialização da tabela
		for(i = 0; i < tam; i++) {
			
			tabela[i] = new hash();
			tabela[i].livre = 'L';
		}
	
		do {
			
			System.out.println("\nMenu\n");
			System.out.println("1 - Cadastrar Amigo");
			System.out.println("2 - Consultar aniversariante de um mes");
			System.out.println("3 - Consultar pessoas com idade superior a 18 anos");
			System.out.println("4 - Excluir pessoa pelo nome");
			System.out.println("5 - Sair");

			
			op = entrada.nextInt();
				
			if (op < 1 || op > 5)
				System.out.println("Opcao Invalida!");
			else {
				
				switch(op) {
				
				case 1: 
					System.out.println("Digite nome e mes");
					num = entrada.nextInt();
					pos = funcao_hashing(num);
					inserir(pos, num);
				break;
				case 2:
					mostrar_hash();
					break;
				case 3:
					mostrar_hash();
					break;	
				case 4:
					System.out.println("Digite um nome");
					num = entrada.nextInt();
					remover(num);
					break;
				
				}
			}
		}
		
		while (op!=5);
	 }
		
	}

Por favor, formate o código. Tem um botão para isso no modo de edição.

1 curtida

No inserir tem um parâmetro n que vai ser armazenada no hash.chave, acredito que isto seja o mês de aniversário, então mude a classe hash para:

public static class hash {
  // int chave;
  int mesAniv; 
  int diaAniv;
  int anoNasc; // acredito que seja necessário para calcular a idade
  String nome;
  // char livre;
  boolean livre; // acho que só precisa saber se está livre ou não, se livre == false, então está ocupado
}

Arrume o inserir para armazenar também o nome, dia, mês e ano de nascimento.

Ainda tem outros problemas, mas recomendo resolver aos poucos.

Nunca use o nextInt, prefira fazer o seguinte:

op = Integer.parseInt(entrada.nextLine());
1 curtida