Explicação do código
Meu código tem a ideia de ter três letras e delas fazer listas de cada letra.
Para fazer isso uso um vetor de struct e passo para a função de inserir depois para de imprimir o que tem nela.
Inicio o código pedindo que o usuário digite 3 letras [ vetor de struct do tipo letra], depois quantos nomes quiser [ dentro da struct letra faço com que aponte para outra struct]. Na struct de nomes faço com que ele aponte para ele mesmo e então faço a lista encadeada.
Problema
Ele no máximo exibe duas letras e o nomes não são mostrados que é o quero também mostrar.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define tamanho 3
/*
Use as letras
A, f
*/
typedef struct nomes vetnome;
typedef struct letras letra;
struct nomes{
char nome[30];
vetnome *pont;
};
struct letras{
char L[2];
int pos[3];
vetnome *pontpnome;
};
void inserir (vetnome **nom, letra *tabEsp2[tamanho]);
int chave(char nome2[30]);
void imprimir(letra *tabEsp2[tamanho]);
int chave(char nome[30])
{
char ale[30];
strcpy(ale[0],toupper(nome[0]));
unsigned int resultado= (int)ale[0]%tamanho;
if(resultado<0)
resultado=-resultado;
return resultado;
}
void inserir (vetnome **nom2,letra *tabEsp2[tamanho])
{
char nome[30];
puts("Digite um nome: ");
scanf("%s", &nome);
int chaveres=chave(nome);
if (tabEsp2[chaveres]->pos[chaveres]==0)
{
strncpy(tabEsp2[chaveres]->L,nome,1);
vetnome *novo;
novo=(vetnome *)malloc(sizeof(vetnome));
novo=*nom2;
if (novo==NULL)
return;
tabEsp2[chaveres]->pontpnome=novo;
tabEsp2[chaveres]->pos[chaveres]=1;
return;
} else
if(tabEsp2[chaveres]->pos[chaveres]!=0)
{
vetnome *aux2;
aux2=tabEsp2[chaveres]->pontpnome;
while(aux2->pont!=NULL)
{
aux2=aux2->pont;
}
vetnome *name=(vetnome *)malloc(sizeof(vetnome));
name=*nom2;
strcpy(name->nome,nome);
aux2->pont=name;
name->pont=NULL;
return ;
}
}
void imprimir(letra *tabEsp2[tamanho])
{
int num=0,qtd=0;
puts("Digite qual opção deseja: \n");
puts("[ 0 ] TUDO \n");
puts("[ 1 ] APENAS UMA DAS LISTAS DE LETRAS \n");
puts("[ 2 ] Sair \n");
scanf(" %d", &num);
if(num==0)
{
for(qtd=0;qtd<4;qtd++)
{
printf("Primeira Letra -> %c \n", tabEsp2[qtd]->L[0]);
vetnome *aux2;
aux2=tabEsp2[qtd]->pontpnome;
while(aux2!=NULL)
{
printf("\n Nome -> %s", aux2->nome,"--");
aux2 = aux2->pont;
}
}
}
system("pause");
}
int main()
{
int qtd=1,i=0,contd=0;
int chaveres=0;
char nome[30], resposta[30];
letra *tabEsp=(letra *)malloc(sizeof(letra)*3);
for(contd=0;contd<3;contd++)
{
tabEsp[contd].pos[contd]=0;
}
while(qtd<4)
{
printf("Insira 3 letras diferentes, você guardará nomes com essas iniciais depois desse processo: ");
vetnome *nom=(vetnome *)malloc(sizeof(vetnome));
inserir(&nom, &tabEsp);
system("pause");
system("cls");
qtd++;
}
puts("Aqui você irá colocar nomes dentro das 3 listas criadas! :)");
while((strcmp(strupr(resposta),"NAO"))!=0)
{
vetnome *nom=(vetnome *)malloc(sizeof(vetnome));
inserir(&nom, &tabEsp);
printf("Você quer continuar?[Sim/Nao]");
scanf("%s", &resposta);
system("pause");
system("cls");
}
imprimir(&tabEsp);
return 0;
}