Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- /**
- * Implemente as seguintes funções onde a função “crialista” cria uma lista
- * duplamente ligada onde cada nó contém uma das letras da string passada por parâmetro e
- * retorna um ponteiro para o primeiro nó. Já a função “inverte” recebe a lista criada pela
- * função anterior e inverte a ordem que as palavras estão na string retornando o ponteiro
- * para o primeiro nó da lista. Exemplo: entrada “Algoritmos e Estrutura de Dados 1” saída:
- * “1 Dados de Estrutura e Algoritmos”
- */
- typedef char TipoChave;
- typedef struct Registro {
- TipoChave Chave;
- } Registro;
- typedef struct No {
- Registro Reg;
- Apontador pEsq, pDir;
- } No;
- typedef struct No* Apontador;
- Apontador crialista(char *string);
- Apontador inverte(Apontador pCabeca);
- void main()
- {
- }
- Apontador crialista(char *string)
- {
- Apontador prox, pCabeca=malloc(sizeof(struct No));
- pCabeca->Reg.Chave = string[0];
- pCabeca->pEsq=NULL;
- if (strlen(string) > 1)
- {
- pCabeca->pDir=malloc(sizeof(struct No));
- pCabeca->pDir->pEsq=pCabeca;
- }
- else
- pCabeca->pDir=NULL;
- prox=pCabeca->pDir;
- for (int i=1; i<strlen(string); i++)
- {
- prox->Reg.Chave=string[i];
- if (string[i+1] != '\0')
- {
- prox->pDir=malloc(sizeof(struct No));
- prox->pDir->pEsq=prox;
- prox=prox->pDir;
- }
- else
- prox->pDir=NULL;
- }
- return pCabeca;
- }
- Apontador inverte(Apontador pCabeca)
- {
- int i=0;
- Apontador aux1, aux2, aux3, salvaEspaco, novaLista=malloc(sizeof(struct No));
- aux1=pCabeca;
- while (aux1 != NULL)
- {
- if (aux1->pEsq->Reg.Chave == ' ')
- salvaEspaco=aux1; //No final, salvaEspaco vai ser o primeiro no
- aux1=aux1->pDir;
- }
- //aux1=pCabeca;
- novaLista->Reg.Chave = salvaEspaco->Reg.Chave;
- novaLista->pEsq=NULL;
- novaLista->pDir=salvaEspaco->pDir;
- aux1=novaLista;
- aux2=salvaEspaco->pEsq;
- aux3=salvaEspaco->pEsq;
- while (aux1->pDir != NULL && aux2 != pCabeca)
- { //Necessita percorrer pela direita com o aux1 ate chegar ao fim da palavra, depois percorrer pela esquerda ate o comeco usando aux2 ou aux3, salvando as palavras a seguir do aux1 toda vez que achar um espaco
- aux1=aux1->pDir;
- while (aux1 == NULL && aux2 != NULL /*aux2 != pCabeca->pEsq*/)
- {
- aux2=aux2->pEsq;
- aux3=aux2;
- while (aux2->pEsq.Reg.Chave == ' ' && aux3->pDir != aux1)
- {
- i=1;
- aux1=aux3;
- aux1=aux1->pDir;
- aux3=aux3->pDir;
- }
- if (i==1)
- aux1=aux2;
- i=0;
- }
- }
- return pCabeca;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement