Ir para conteúdo
Fórum Script Brasil
  • 0

Lista duplamente encadeada


Pajé

Pergunta

Boa noite,

Estou tentando fazer um trabalho e travei numa sooicitação que é achar o menor e o maior elemento, colocando eles no inicio(menor) e no final(maior).

Fiz alguma coisa mas não funciona, acho que estou tento a lógica errada.

Olhem como esta ficando o que já fiz, mas na parte de troca_nodo é onde estou sofrendo. : )

Por favor, me ajudem .

/*

ENUNCIADO

SegundoTrabalho

Com base nos conceitos apresentados até o presente momento, construa um programa que faça um controle de dados de um aluno contendo a seguinte características:

•código do aluno

•nome do aluno

•G1

•G2.

O sistema deverá possuir um menu contendo as seguintes opções:

1.Cadastra novo aluno

2.Altera aluno de código...

3.Apaga aluno de código...

4.Lista os dados do aluno de código...

5.Lista os dados de todos os alunos

6.Sair

Após chamar selecionar uma das opções, o sistema deverá executar funções referentes a opção selecionada. Para realização deste sistema você deverá utilizar uma lista DUPLAMENTE encadeada com header.

O resultado da atividade deverá ser postado no moodle (no link abaixo) até o dia 23 de setembro as 18:00h.

*/

-----------------------------------------------------------

MEU PROGRAMA

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct nodo{ 
  struct nodo *anterior;
  int codigo;
  char nome[30];
  float idade;
  float salario;
  struct nodo *proximo;
};
struct header{
  struct nodo *inicio;
  int qtde;
  struct nodo *fim;
};

//---------------------------------------------------------------------------------------------
void nova_lista(struct header **lista,int *status){
     struct header *l;
     l=NULL;
     l=(struct header *)malloc(sizeof(struct header));
     if (l==NULL){
       *status=0;
     }else{
       l->inicio=NULL;
       l->fim=NULL;
       l->qtde=0;
       *status=1;
     }
  *lista=l;
}
//----------------------------------------------------------------------------------------------
void insere_direita(struct header *lista,int codigo,char nome[],float idade,float salario, int *status){
  struct nodo *p;
  *status=0;

  if (lista!=NULL){

      p=(struct nodo *) malloc(sizeof(struct nodo));
      if (p!=NULL){
        p->codigo=codigo;
        strcpy(p->nome,nome);
        p->idade=idade;
        p->salario=salario;
        p->anterior=lista->fim;
        p->proximo=NULL;
        if (lista->inicio==NULL){
           lista->inicio=p;
        }else{
          (lista->fim)->proximo=p;
        }
        lista->fim=p;
        lista->qtde=lista->qtde+1;

        *status=1;
      }
  }
}
//-----------------------------------------------------------------------------------------------
void lista_tudo(struct header *lista){
  struct nodo *p;

  printf("\n\n=========Listagem de dados==========\n\n");
  p=lista->inicio;
  while (p!=NULL){
        printf("====================\n");
        printf("Código = %d \n",p->codigo);
        printf("Nome = %s \n",p->nome);
        printf("Idade = %.2f \n",p->idade);
        printf("Salario = %.2f \n\n",p->salario);
        p=p->proximo;
  }
  printf("\n==================================\n\n");
}
//-----------------------------------------------------------------------------------------------
void lista_intervalo(struct header *lista,int salario){
  struct nodo *p;

  printf("\n\n=========Listagem de dados==========\n\n");
  p=lista->inicio;
  while (p!=NULL){
      if (p->salario>1000){
        printf("====================\n");
        printf("Código = %d \n",p->codigo);
        printf("Nome = %s \n",p->nome);
        printf("Idade = %.2f \n",p->idade);
        printf("Salario = %.2f \n\n",p->salario);
      } if (p->salario<1000 && p->salario>2000) {
                printf("====================\n");
                printf("Código = %d \n",p->codigo);
                printf("Nome = %s \n",p->nome);
                printf("Idade = %.2f \n",p->idade);
                printf("Salario = %.2f \n\n",p->salario);
          }     if (p->salario>2000) {
                 printf("====================\n");
                    printf("Código = %d \n",p->codigo);
                    printf("Nome = %s \n",p->nome);
                    printf("Idade = %.2f \n",p->idade);
                    printf("Salario = %.2f \n\n",p->salario);
           }
  p=p->proximo;
  }
  printf("\n==================================\n\n");
}
//--------------------------------------------------------------------------------------------------
[b]void troca_nodo(struct header *lista){
 struct nodo *aux,*m;
 int maior,menor;
 aux=*inicio;
 m=*inicio;
 maior=aux->idade;
 menor=m->idade;
 if (aux!=NULL){
    while (aux->proximo!=NULL){
      if (aux->idade > maior){
          *maior=aux;
          maior=aux->idade;
      }
      aux=aux->proximo;
    }
 }
 if (m!=NULL) {
      while (m->proximo!=NULL){
          if (m->idade < menor) {
             *menor=m;
             menor=m->idade;
         }
      }
      m=m->proximo
    }
    m->proximo=lista->inicio;
    aux->proximo=fim->inicio;
}[/b]//---------------------------------------------------------------------------------------------------------------
main(){
  struct header *lista;

  int status,valor,op=0;
  int codigo;
  char nome[30];
  float idade,salario;
  nova_lista(&lista,&status);
  while (op!=5){
        printf("\n\n======Informe a opção desejada====== Registros %d \n \n",lista->qtde);
        printf("1.Cadastra novo nome \n");
        printf("2.Troca de lugar os nodos...\n");
        printf("3.Lista o intervalo de salarios...\n");
        printf("4.Lista os dados de todos os nomes\n");
        printf("5.Sair\n");
        scanf("%d",&op);
        switch (op){
           case 1:
                printf("\n\n Cadastro =============== ");
                printf("Informe código:");
                scanf("%d",&codigo);
                fflush(stdin);
                printf("Informe nome:");
                gets(nome);
                fflush(stdin);
                printf("Informe Idade:");
                scanf("%f",&idade);
                fflush(stdin);
                printf("Informe Salario:");
                scanf("%f",&salario);
                fflush(stdin);
                insere_direita(lista,codigo,nome,idade,salario,&status);
                break;
            case 2:
             printf("Trocando os nodos de lugar:");
             troca_nodo(lista,codigo);
             break;
           case 3:
             printf("Informe o salario a pesquisar:");
             scanf("%f",&salario);
             fflush(stdin);
             lista_intervalo(lista,salario);
             break;
           case 4:
                lista_tudo(lista);
                break;
        } //fim do switch
  }
  system("pause");

}

Editado por Durub
Adicionar tags code [Durub]
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...