C, exercício de análise

assunto: lista ligada simples
pergunta: Escreva a função pdados troca(pdados p); Esta função recebe o endereço do primeiro elemento de uma lista ligada simples, constituída por nós do tipo dados. Se a lista tiver menos de três elementos, ou se o nome armazenado no primeiro nó começar por Z, a função não faz nenhuma alteração. Caso contrário, troca o primeiro com o último elemento: o primeiro passa a ser o último e o último passa a ser o primeiro. Devolve o endereço do primeiro elemento da lista depois da alteração

typedef struct t dados, *pdados;
struct t{
   char nome[100];
   int id;
   pdados prox; 
};

resposta:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct t dados, *pdados;

struct t {
    char nome[100];
    int id;
    pdados prox;
};
int totalElementos(pdados exame) {
    int conta = 0;
    if (exame == NULL) {
        printf("\n[erro] lista vazia");
        return conta;
    } else {
        while (exame != NULL) {
            conta++;
            exame = exame->prox;
        }
    }
    printf("\nexistem %d pessoas da lista", conta);
    return conta;
}

int letraZ(pdados exame) {
    if (exame->nome[0] == 'Z' || exame->nome[0] == 'z') {
        printf("\nsim existe um Z na primeira letra do primeiro nome da lista");
        return 1;
    }
    return 0;
}

pdados troca(pdados t) {
    pdados copiaPrimeiraPosicao;
    pdados copiaUltimaPosicao;
    pdados aux;
    aux = t;


    pdados ajudaUltimaPosicao;

    pdados ajudaPrimeiraPosicao;
    copiaPrimeiraPosicao = NULL;
    copiaUltimaPosicao = NULL;
    ajudaUltimaPosicao = NULL;
    ajudaPrimeiraPosicao = NULL;

    if (totalElementos(t) > 3 || letraZ(t) == 1) {
        printf("\nvou trocar");
        //estou na primeira posição
        if (t->prox == NULL) {
            //mas é o unico elemento, não existe troca
            return t;
        } else {
            //vou para a ultima posicao
            while (aux->prox != NULL) {
                aux = aux->prox;
            }

            //fazer uma copia da primeira posicao
            copiaPrimeiraPosicao = malloc(sizeof (dados));
            copiaPrimeiraPosicao->id = t->id;
            strcpy(copiaPrimeiraPosicao->nome, t->nome);
            copiaPrimeiraPosicao->prox = NULL;

            //fazer uma copia da ultima posicao
            copiaUltimaPosicao = malloc(sizeof (dados));
            copiaUltimaPosicao->id = aux->id;
            strcpy(copiaUltimaPosicao->nome, aux->nome);


            //organizar
            t->id = copiaUltimaPosicao->id;
            strcpy(t->nome, copiaUltimaPosicao->nome);
            t->prox = t->prox;

            aux->id = copiaPrimeiraPosicao->id;
            strcpy(aux->nome, copiaPrimeiraPosicao->nome);
            aux->prox = copiaPrimeiraPosicao->prox;
        }
    } else {
        printf("\nnao troquei nada\n");
        return t;
    }
    return t;
}

void listar(pdados exame) {
    if (exame == NULL) {
        printf("\n[erro] lista vazia");
        return;
    } else {
        printf("\n--listagem dos elementos--\n");
        while (exame != NULL) {
            printf("\n%d\t%s", exame->id, exame->nome);
            exame = exame->prox;
        }
    }
}

pdados adicionarLista(pdados exame) {
    pdados novo = NULL;
    pdados aux = NULL;

    novo = malloc(sizeof (dados));
    if (novo == NULL) {
        printf("\nerro: alocacao de memoria");
        free(novo);
        return NULL;
    } else {
        printf("\nqual o id\n");
        scanf(" %d", &novo->id);

        printf("\nqual o nome\n");
        scanf("%s", novo->nome);
        novo->prox = NULL;

        if (exame == NULL) {
            exame = novo;
        } else {
            aux = exame;
            while (aux->prox != NULL) {
                aux = aux->prox;
            }
            aux->prox = novo;
        }
    }
    return exame;
}

int main(int argc, char** argv) {
    pdados exame = NULL;
    int continuar = 0;
    do {
        exame = adicionarLista(exame);
        listar(exame);
        printf("\nmais algum? 1-nao/0-sim\n");
        scanf("%d", &continuar);

    } while (continuar == 0);


    exame = troca(exame);
    listar(exame);


    return (EXIT_SUCCESS);
}
Tags : , ,

0 thoughts on “C, exercício de análise”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.