[Ajuda] Erro ao tentar imprimir de vetor de struct em C

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;
    }

Edite seu post, selecione o código e formate como botão de Texto pré formatado, identificado pelo símbolo </>.

O que exatamente não funciona no seu programa?

1 curtida

Meu erro:
1- Ele não insere as 3 letras que deveria inserir e nem os nomes.
2- Ao imprimir ele mostra no máximo duas letras, a outra letra vazia e não mostra nenhum nome.

Ideia do programa: Inserir com a função de hashing e um vetor de struct: posição aleatória mas dentro do tamanho do vetor de struct.
Obrigado pela atenção.