"resposta" é do tipo char. você não pode ler %s caso contrário dará problema de segmentação de memória (você está escrevendo em partes da memória não alocadas e está bagunçando os ponteiros).
Perceba esse tipo de erro NÃO é alertado pelo compilador.
A solução é trocar por "%c", ou melhor ainda, adotar c++ ou outra linguagem mais moderna que tem ferramentas para prevenir esse tipo de coisa..
LEMBRANDO AINDA QUE você TEM QUE CHAMAR FREE PARA CADA MALLOC, C NÃO LIBERA A MEMÓRIA ALOCADA AUTOMATICAMENTE.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
typedef struct cadastro_produto{
char nome[30];
float preco_atacado;
float preco_varejo;
struct cadastro_produto *prox;
} produto;
int main (){
setlocale (LC_ALL, "Portuguese");
produto *ini, *fim;
char resposta;
ini = (produto *) malloc(sizeof(produto));
if (ini == NULL) return 0;
fim = ini;
while (1){
printf ("\nInforme o nome do produto: ");
scanf ("%s", fim->nome);
printf ("\nInforme o preço do produto no atacado: ");
scanf ("%f", &fim->preco_atacado);
printf ("\nInforme o preço do produto no varejo: ");
scanf ("%f", &fim->preco_varejo);
printf ("\nDeseja cadastrar outro produto? (s)im (n)ão: ");
scanf ("%c", &resposta);
while ((resposta != 'n') && (resposta != 'N') &&(resposta != 's') && (resposta != 'S')){
printf ("\nValor informado invalido");
printf ("\nDeseja cadastrar outro produto? (s)im (n)ão: ");
scanf ("%c", &resposta);
}
if (resposta == 'N' || resposta == 'n') break;
else /*(resposta == 'S' || resposta == 's')*/{
fim -> prox = (produto *) malloc (sizeof(produto));
if (fim -> prox == NULL) return 0;
fim = fim -> prox;
}
}
fim -> prox = NULL;
fim = ini;
while (fim != NULL){
printf ("\nProduto: %s", fim->nome);
printf ("\nPreço no atacado: %.2f", fim->preco_atacado);
printf ("\nPreço no varejo: %.2f\n\n", fim -> preco_varejo);
fim = fim -> prox;
}
return 0;
}