Você está na página 1de 3

#include <sys/time.

h>
#include <iostream>
using namespace std;
#define max 10
/* ========================================================================= */
typedef struct {
int matricula;
char nome[50];
float salario;
/* outros componentes */
}TipoItem;
typedef struct Celula_str {
TipoItem Item;
Celula_str *Prox;
}Celula;
typedef struct {
Celula *Primeiro, *Ultimo;
}TipoLista;
/* ========================================================================= */
//Funcao que cria uma lista encadeada vazia
void FLVazia(TipoLista *Lista)
{
Lista->Primeiro = new Celula[1];
Lista->Ultimo = Lista->Primeiro;
Lista->Primeiro->Prox = NULL;
}
//Funcao que verifica se a lista esta vazia
int Vazia(TipoLista Lista)
{
return (Lista.Primeiro == Lista.Ultimo);
}

//Funcao que insere um novo item no final da lista


void InsereNoFim(TipoItem x, TipoLista *Lista)
{
Lista->Ultimo->Prox = new Celula[1];
Lista->Ultimo = Lista->Ultimo->Prox;
Lista->Ultimo->Item = x;
Lista->Ultimo->Prox = NULL;
}
// Função insere um novo item entre a celula apontada por
// p e a seguinte. Supõe-se que p != NULL.
void Insere(TipoItem x, Celula *p)
{
Celula *nova;
nova = new Celula[1];
nova->Item = x;
nova->Prox = p->Prox;
p->Prox = nova;
}
// Funcao para imprimir os elementos da lista
void Imprime(TipoLista Lista)
{
if (Vazia(Lista)){
cout << "\nErro, lista esta vazia" << endl;
return;
}
Celula *Aux;
Aux = Lista.Primeiro->Prox;
cout << "\nConteudo da lista:\n";
while (Aux != NULL)
{
cout << Aux->Item.matricula << "\t" << Aux->Item.nome << "\t" << Aux->It
em.salario << endl;
Aux = Aux->Prox;
}
}
//Função recebe um inteiro chave e uma lista encadeada.
//A função devolve o endereço de uma celula que contém chave.
//Se tal celula não existe, a função devolve NULL.
Celula *busca (int mat, TipoLista Lista)
{
Celula *p;
p = Lista.Primeiro;
while (p != NULL && p->Item.matricula != mat)
p = p->Prox;
return p;
}
void Troca (Celula *p, TipoLista *Lista){
Celula *aux;
aux = Lista->Primeiro;
while(aux->Prox != p)
aux = aux->Prox;
aux->Prox = p->Prox;
p->Prox = aux->Prox->Prox;
aux->Prox->Prox = p;
if(p->Prox == NULL)
Lista->Ultimo = p;
}

/* ========================================================================== */
int main(int argc, char *argv[])
{
TipoLista lista;
TipoItem item, itemMenorSalario;
Celula *p;
int i, n, mat;
FLVazia(&lista);
cout << "\nInforme a quantidade de funcionários: ";
cin >> n;
p = lista.Primeiro;
for(i = 0; i < n; i++){
cout << "\n Dados do funcionario\n";
cout << "\nInforme a matricula do funcionario: ";
cin >> item.matricula;
cout << "\nInforme o nome do funcionario: ";
cin >> item.nome;
cout << "\nInforme o salario do funcionario: ";
cin >> item.salario;
if(Vazia(lista) || p->Prox == NULL){
InsereNoFim(item, &lista);
}
else{
while(p->Prox != NULL && item.salario > p->Prox->Item.salario)
p = p->Prox;
if(p->Prox == NULL){
InsereNoFim(item, &lista);
}
else{
Insere(item, p);
}
//cout << p->Item.salario;
}
p = lista.Primeiro;
}
Imprime(lista);
cout << "\nInforme a matricula do funcionario que deseja trocar de posicao:
";
cin >> mat;
p = busca(mat, lista);
if(p != NULL && p->Prox != NULL)
Troca(p, &lista);
else
cout << "\nNao e possivel trocar a celula de posicao.\n";
Imprime(lista);
return(0);
}