I'm creating a program that inverts the non-vowel sequences of a word represented by a list that is simply chained, without head, and without sentinel. That is, each node in the list has a letter field. My work is to invert the non-vowel sequences (spaces, consonants, and scores) from this list without modifying the original list.
The algorithm itself is ready and working. My problem is in how to transform functions of type LISTA*
into functions of type NO*
and what are the implications of this change.
Typedefs:
// elemento da lista
typedef struct estr {
char letra;
struct estr *prox;
} NO;
typedef struct {
NO *inicio;
} LISTA;
Functions to change:
//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 of the type:
NO* teste = null;
teste = decodificar(p);
Full program: link