Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C by Teste ( 2 years ago )
Para fazer com que a opção 2 funcione corretamente, precisamos implementar uma lista encadeada duplamente, onde cada nó aponta para o próximo e para o anterior nó na lista. Atualmente, o código só usa um ponteiro para o nó anterior, então não é possível percorrer a lista do primeiro para o último nó.

Primeiro, vamos corrigir a estrutura da lista para suportar a lista duplamente encadeada. Em seguida, vamos ajustar as inserções e a exibição dos nós para que possamos percorrer a lista em ambas as direções.

Aqui está a versão corrigida do código:

```c
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

struct funcionario {
    int matricula;
    char nome[20];
    struct funcionario *anterior;
    struct funcionario *proximo;
};

int main() {
    setlocale(LC_ALL, "Portuguese");
    int opc;
    struct funcionario *head = NULL;  // Ponteiro para o primeiro elemento da lista
    struct funcionario *tail = NULL;  // Ponteiro para o último elemento da lista

    do {
        system("cls");
        printf("O que deseja fazer:\n");
        printf("1 - Inserir\n");
        printf("2 - Listar\n");
        printf("3 - Editar\n");
        printf("4 - Remover\n");
        printf("5 - Sair\n\n");
        printf("Opção: ");
        scanf("%d", &opc);
        system("cls");

        switch (opc) {
            case 1: {
                printf("Novo funcionário\n\n");

                struct funcionario *novo = (struct funcionario *) malloc(sizeof(struct funcionario));

                printf("Digite a matricula: ");
                scanf("%d", &novo->matricula);

                printf("Digite o nome.....: ");
                scanf(" %[^\n]", novo->nome);

                novo->anterior = tail;
                novo->proximo = NULL;

                if (tail != NULL) {
                    tail->proximo = novo;
                } else {
                    head = novo;
                }

                tail = novo;

                printf("\nFuncionário cadastrado com sucesso!");

                break;
            }
            case 2: {
                int opt;
                printf("Como gostaria de ver os registros:\n\n");
                printf("1 - Do último para o primeiro\n");
                printf("2 - Do primeiro para o último\n\n");
                printf("Opção: ");
                scanf("%d", &opt);

                printf("Funcionários cadastrados\n\n");

                if (opt == 1) {
                    struct funcionario *funcAtual = tail;
                    while (funcAtual != NULL) {
                        printf("RA..: %d\n", funcAtual->matricula);
                        printf("NOME: %s\n\n", funcAtual->nome);
                        funcAtual = funcAtual->anterior;
                    }
                } else if (opt == 2) {
                    struct funcionario *funcAtual = head;
                    while (funcAtual != NULL) {
                        printf("RA..: %d\n", funcAtual->matricula);
                        printf("NOME: %s\n\n", funcAtual->nome);
                        funcAtual = funcAtual->proximo;
                    }
                } else {
                    printf("Opção inválida!\n");
                }

                break;
            }
            case 3: {
                printf("Editar funcionário\n\n");
                int matricula;
                printf("Digite a matricula: ");
                scanf("%d", &matricula);

                struct funcionario *funcAtual = head;
                while (funcAtual != NULL) {
                    if (matricula == funcAtual->matricula) {
                        printf("Nome anterior: %s\n", funcAtual->nome);
                        printf("Digite o novo nome: ");
                        scanf(" %[^\n]", funcAtual->nome);
                        printf("Nome alterado com sucesso!");
                        break;
                    }
                    funcAtual = funcAtual->proximo;
                }
                if (funcAtual == NULL) {
                    printf("Matricula não encontrada!");
                }

                break;
            }
            case 4: {
                printf("Excluir funcionário\n\n");
                int matricula;
                printf("Digite a matricula: ");
                scanf("%d", &matricula);

                struct funcionario *funcAtual = head;
                while (funcAtual != NULL) {
                    if (matricula == funcAtual->matricula) {
                        printf("Funcionário removido: %s\n", funcAtual->nome);

                        if (funcAtual->anterior != NULL) {
                            funcAtual->anterior->proximo = funcAtual->proximo;
                        } else {
                            head = funcAtual->proximo;
                        }

                        if (funcAtual->proximo != NULL) {
                            funcAtual->proximo->anterior = funcAtual->anterior;
                        } else {
                            tail = funcAtual->anterior;
                        }

                        free(funcAtual);
                        break;
                    }
                    funcAtual = funcAtual->proximo;
                }
                if (funcAtual == NULL) {
                    printf("Matricula não encontrada!");
                }

                break;
            }
            case 5: {
                printf("By... see you later :-)\n\n");
                break;
            }
            default:
                printf("Opção inválida!!!\n");
        }
        system("pause>>null");
    } while (opc != 5);

    // Liberar memória ao sair
    struct funcionario *funcAtual = head;
    while (funcAtual != NULL) {
        struct funcionario *prox = funcAtual->proximo;
        free(funcAtual);
        funcAtual = prox;
    }

    return 0;
}
```

As alterações principais feitas no código são:

1. Modificação da estrutura `funcionario` para incluir um ponteiro `proximo`.
2. Introdução de dois ponteiros, `head` e `tail`, para apontar para o início e o fim da lista, respectivamente.
3. Alteração na lógica de inserção para ajustar os ponteiros `proximo` e `anterior` corretamente.
4. Implementação de uma exibição de registros para percorrer a lista tanto do primeiro para o último quanto do último para o primeiro.
5. Ajustes na remoção de funcionários para manter a integridade dos ponteiros da lista duplamente encadeada.
6. Liberação da memória alocada ao sair do programa.

Com essas alterações, a opção 2 funcionará conforme o esperado, permitindo listar os funcionários em ambas as

 

Revise this Paste

Your Name: Code Language: