V!OLADOR, eu assisti aos vídeos e li o programa do link que você me enviou, percebi até que o cara tinha um método para descartar os anagramas repetidos.
Entretanto ainda não consegui terminar esse programa, eu não sou muito bom programando e estou travado de novo... já tem algumas horas que estou tentando resolver esse problema mas nada vem a minha cabeça.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX 255
//Structs
typedef struct lista{
char letra[MAX];
struct lista* prox;
};
//Funções
//Função comparativa que permite uso do qsort
int compare(const void* a, const void* b)
{
return (*(char*)a - *(char*)b);
}
//Função de Troca de caracters
void troca(char* a, char* b)
{
char t = *a;
*a = *b;
*b = t;
}
int findCeil(char palavra[], char primeiro, int left, int h)
{
int ceilIndex = left;
for (int i = left + 1; i <= h; i++)
if (palavra[i] > primeiro && palavra[i] < palavra[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
//Função que printa as pemutações
void sortedPermutations(char palavra[])
{
int size = strlen(palavra);
qsort(palavra, size, sizeof(palavra[0]), compare);
bool isFinished = false;
while (!isFinished) {
static int x = 1;
printf("%d %s \n", x++, palavra);
int i;
for (i = size - 2; i >= 0; --i)
if (palavra[i] < palavra[i + 1])
break;
if (i == -1)
isFinished = true;
else {
int ceilIndex = findCeil(palavra, palavra[i], i + 1, size - 1);
troca(&palavra[i], &palavra[ceilIndex]);
qsort(palavra + i + 1, size - i - 1, sizeof(palavra[0]), compare);
}
}
}
//n! formula de permu
//n!/(n - k)!
//Função que printa as pemutações
void sortedArrangement(char palavra[], int arranjos)
{
int size = strlen(palavra);
qsort(palavra, size, sizeof(palavra[0]), compare);
bool isFinished = false;
while (!isFinished) {
static int x = 1;
printf("%d %s \n", x++, palavra);
int i;
for (i = size - 2; i >= 0; --i)
if (palavra[i] < palavra[i + 1])
break;
if (i == -1)
isFinished = true;
else {
int ceilIndex = findCeil(palavra, palavra[i], i + 1, size - 1);
troca(&palavra[i], &palavra[ceilIndex]);
qsort(palavra + i + 1, size - i - 1, sizeof(palavra[0]), compare);
}
}
}
//Corpo do codigo
int main(){
//Variaveis
char palavra[255], aux;
int tam, i, j, permu = 1;
bool tf;
printf("Digite uma palavra SEM ACENTOS para checar suas Permutacoes, Arranjos e Combinacoes\n");
//Limpa o Buffer, tirando todo o lixo
setbuf(stdin, 0);
//Ler a string, precisa de uma FILE, no caso standard input
fgets(palavra, 255, stdin);
//Limpando os espacos que nao foram utilizados
palavra[strlen(palavra) - 1] = '\0';
//Adquirindo o tamanho da palavra
tam = strlen(palavra);
int cont[tam];
//Verificando se existem letras que se repetem
for(i=0; palavra[i] != '\0'; i++){
for(j=0; palavra[j] != '\0'; j++){
if((palavra[i] == palavra[j])&&(i != j)){
tf = true;
break;
}else{
tf = false;
}
}
}
//Inicio das operacoes
if(tf){
for(i=0; palavra[i] != '\0'; i++){
for(j=0; palavra[j] != '\0'; j++){
if((palavra[i] == palavra[j])&&(i != j)){
}
}
}
//MOSTRA AS PERMUTACOES
sortedPermutations(palavra);
}else{
//MOSTRA AS PERMUTACOES
sortedPermutations(palavra);
//MOSTRA OS ARRANJOS
printf("Informe o numero de Arranjos:");
int arranjos;
scanf("%d", &arranjos);
printf("\n");
sortedArrangement(palavra, arranjos)
//MOSTRA AS COMBINACOES
printf("Informe o numero de Combinacoes:");
int combinacao;
scanf("%d", &combinacao);
printf("\n");
}
return 0;
}
Eu estou tentando inserir a Lista encadeada no lugar da String padrão e também tentei alterar a função de Permutação para Fazer os Arranjos e as Combinações mas nenhuma das lógicas que fiz deu certo, então apaguei do programa (provavelmente devia ter deixado para verem minha lógica), o ultimo protótipo salvo foi esse, se alguém puder dar uma olhada no código, o enunciado do problema foi postado na cabeça do tópico!