0
I’m creating a program that reverses the non-vowel sequences of a word represented by a list simply chained, headless and without a sentinel. That is, each node in the list has a letter field. My job is to invert the non-vowel sequences(spaces, consonants and scores) of that list without modifying the original list.
The algorithm itself is already up and running. My problem is in how to transform type functions LISTA*
in functions of the type NO*
and what are the implications of that change.
Typedefs:
// elemento da lista
typedef struct estr {
char letra;
struct estr *prox;
} NO;
typedef struct {
NO *inicio;
} LISTA;
Functions to be changed:
//precisa ser do tipo NO*, bem como deve receber NO*
LISTA* clonarLista(LISTA* l){
LISTA* resp = malloc(sizeof(LISTA));
NO *corrente = l->inicio;
NO *anterior = NULL; //utilizar um nó anterior para ligar os vários elementos
while(corrente){ //agora com corrente em vez de l
NO *novo = (NO *) malloc(sizeof(NO));
novo->letra = corrente->letra;
novo->prox = NULL;
if (anterior == NULL){ //se é o primeiro fica no inicio da nova lista
resp->inicio = novo;
}
else { //se não é o primeiro liga o anterior a este pelo prox
anterior->prox = corrente;
}
anterior = novo;
corrente = corrente->prox;
}
return resp;
}
void inverter(LISTA* resp){
NO* atual = resp->inicio;
/*redefinir a lista para começar vazia, sendo que o ponteiro atual ainda
aponta para os seus elementos*/
resp->inicio = NULL;
while (atual != NULL){ //enquanto houver nós
NO* corrente = atual; //guardar nó corrente
atual = atual->prox; //avançar nó atual
corrente->prox = resp->inicio; //fazer o prox do corrente ser o 1 da lista invertida
resp->inicio = corrente; //o inicio passa a ser este ultimo nó
}
}
//precisa ser do tipo NO*, bem como deve receber NO*
void decodificar(LISTA* resp) {
NO* pNv = NULL; // Primeira não-vogal encontrada.
NO* ultNv = NULL; // Última não-vogal encontrada.
NO* atual = resp->inicio; // Ponteiro para percorrer a lista.
NO* anterior = NULL;
/* Laço para percorrer toda lista. */
while (atual != NULL) {
/* Enquanto atual apontar para uma não-vogal. */
if (verificaSequencia(atual)) {
/* Salva o primeiro caso encontrado de não-vogal. */
pNv = atual;
/* Procura na lista o último caso de não-vogal. */
while (atual->prox != NULL && verificaSequencia(atual->prox)) {
atual = atual->prox;
}
/* Quando a próxima letra for uma vogal, então foi atingido o fim da sequência de não-vogais. */
ultNv = atual;
/* Se existir uma sequência de não-vogais, ou seja, pNv e ultNv não apontarem para o mesmo elemento, então a troca de posições deve ser efetuada. */
if (pNv != ultNv) {
/* Chama uma função recursiva para efetuar a troca de posições sem precisar criar uma nova lista. */
NO* proximoOriginal = ultNv->prox;
inverterNvs(pNv->prox, pNv, ultNv);
pNv->prox = proximoOriginal;
if (anterior == NULL){
resp->inicio = ultNv;
}
else {
anterior->prox = ultNv;
}
atual = pNv;
}
}
/* Move para o próximo elemento. */
anterior = atual;
atual = atual->prox;
}
}
The program should work for calls like:
NO* teste = null;
teste = decodificar(p);
Full programme: https://repl.it/KrQg/5