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 : C, Learn C, linguagem C
0 thoughts on “C, exercício de análise”