Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Mazinha_Dantas

Lista Ligada

Recommended Posts

Pessoal estou tentando terminar esta agenda de compromissos e nao consigo fazer uma função para alterar um determinado dado, e também preciso ordenar os dados por data e prioridade do compromisso.o algoritmo possui como base de busca o códigoalguem poderia me dar uma luzagradeçoMarisa Dantassegue o código funcionando/*Este algoritmo simula uma lista encadeada simples, com suas respectivas funções padrão: inserir, remover, exibir, pesquiisar.Elaborado pelo professor Gerson RissoUNIBAN - Universidade Bandeirante de São Paulo*///DIRETIVAS#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <conio.h>#define MAX 80//ESTRUTURAstruct codigo{ int n; int data; char compromisso[MAX]; int prioridade; int tempo; struct codigo *ant;};typedef struct codigo no;//Protótipos das funçõesvoid insere(); void exibe();void pesquisar();void remover();int tamanhoLista();no *aux, *atual2, *atual, *exibir, *pesquisa, *antes, *depois;int contador; int tamanhoLista() { return contador; } //EXCLUIR void remover() { int Vpesq; antes=depois=NULL; atual2=atual; printf("Digite o código a ser removido: "); scanf("%d", &Vpesq); while(atual2!=NULL) { if(Vpesq==atual2->n) break; atual2=atual2->ant; } if(atual2==NULL) { printf("Valor não encontrado!\n"); system("pause"); } else { contador--; atual2=atual; while(atual2!=NULL) { if(Vpesq==atual2->n) break; antes=atual2; atual2=atual2->ant; } if(Vpesq==atual2->n) if(atual2==atual) { atual=atual->ant; aux=atual; atual2->ant=NULL; free(atual2); } else { depois=atual2->ant; antes->ant=depois; atual2->ant=NULL; free(atual2); } } } //PESQUISAR void pesquisar() { int Vpesq=0; printf("Digite o codigo para a pesquisa\n"); scanf("%d",&Vpesq); pesquisa=atual; while(pesquisa!=NULL) { if(Vpesq==pesquisa->n) { printf("Codigo: %d\n", pesquisa->n); printf("Data: %d\n", pesquisa->data); printf("Compromisso: %d\n", pesquisa->compromisso); printf("Prioridade: %d\n", pesquisa->prioridade); printf("Tempo de Duracao: %d\n", pesquisa->tempo); system("pause"); break; } pesquisa=pesquisa->ant; } if(pesquisa==NULL) { printf("Valor nao encontrado!\n"); system("pause"); } }//INSERIR void insere() { atual=(no*)malloc(sizeof(no)); contador++; printf("Digite o codigo: "); scanf("%d",&atual->n); printf("Digite a data: "); scanf("%d",&atual->data); printf("Digite o compromisso: "); scanf("%s",&atual->compromisso); printf("Digite a prioridade: "); scanf("%d",&atual->prioridade); printf("Digite o tempo: "); scanf("%d",&atual->tempo); atual->ant=aux; aux=atual; }//EXIBIR void exibe() { if(aux==NULL) printf("A lista esta vazia!\n"); exibir=atual; while(exibir!=NULL) { printf("\nCodigo: %d ",exibir->n); printf("\nData: %d ",exibir->data); printf ("\nCompromisso: %s\n\n", exibir->compromisso); exibir=exibir->ant; } printf("\n"); system("pause"); }//PRINCIPALint main(){ contador=0; int opc, r; aux=NULL; do{ system("cls"); printf(" =======================\n"); printf(" Lista encadeada simples\n"); printf(" =======================\n"); printf("Operacoes: \n\n"); printf("[1] - Inserir \n[2] - Exibir\n[3] - Pesquisar\n[4] - Remover\n"); printf("[5] - Tamanho da lista\n[6] - Sair\n\n"); printf("Digite uma opcao <- "); scanf("%d",&opc); switch(opc) { case 1: insere(); break; case 2: exibe(); break; case 3: pesquisar(); break; case 4: remover(); break; case 5: r=tamanhoLista(); printf("A lista contem %d elemento(s)\n",r); system("pause"); break; case 6: system("exit"); break; default: printf("Opcao invalida \n"); system("pause"); } }while(opc!=6);}

Compartilhar este post


Link para o post
Compartilhar em outros sites

voce entendeu o algoritmo?sabe como funciona uma lista?

e nao consigo fazer uma função para alterar um determinado dado

para alterar um determinado dado da lista voce deve fazer uma busca em algum campo da struct, de preferencia a campos que nunca se repete. Com isso voce garante que só aquele dado será alterado. Ex:quero alterar o dado que possui codigo->n = 2
while(lista->n != 2) // faz uma busca na lista ate encontrar o elemento que tem n = 2   lista = lista -> ant;// agora estamos no elemento que possui o n = 2// faca as alteracoes necessarias
obs: o ponteiro lista não deve ser a sua referencia para o primeiro elemento, pois ele a cada interação do laço estará num elemento diferente. Portanto voce deve ter a referencia do primeiro elemento da lista em outro ponteiro.

e também preciso ordenar os dados por data e prioridade do compromisso.

varias maneiras pra fazer a ordenação.por exemplo ordenação da prioridade:- acha o elemento com maior prioridade.- retira ele da lista.- refaz a ligação.- insere o elemento na nova posição.- refaz a ligação.outro exemplo:- acha o elemento mais antigo "data".- troca ele de posição com o primeiro elemento.- refaz as ligações.- ache o segundo elemento mais antigo- troca ele de posição com o segundo elementoe assim por diante.a idéia do segundo é ter um ponteiro que ache o elemento e outro que a cada troca é incrementado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendo nada de listameu professor passou esse trabalho pra entregar só com o código, eu coloquei os demais itens que ele pediu q é data, compromisso, prioridade e tempo, e algumas coisas que eu mexi, fuçando.... mais ja pesquisei meios de ordenação e alteração e nao consigo terminar de jeito nenhum, por isso pedi ajuda ao forum. fazer uma busca pelo código eu ja entendi só preciso alterar o compromisso pra uma outra data, ou seja remarcar.sem perder a ordenaçãopreciso de ajuda nisso, nao to entendendo como fazer !!!qto a ordenação vou tentar fazer aquiobrigadaMarisa

Compartilhar este post


Link para o post
Compartilhar em outros sites

ó preciso alterar o compromisso pra uma outra data, ou seja remarcar.sem perder a ordenaçãopreciso de ajuda nisso, nao to entendendo como fazer !!!

se a lista estiver ordenada e voce alterar a data de um elemento, isso pode fazer com que esse elemento fique fora de ordem.para resolver isso voce precisa a cada alteração realizar uma nova ordenação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

verifiquei e a alteração esta sendo feito só no ultimo item, coloquei um if caso o codigo seja nuloe deu erroo codigo ficou assim://ALTERAR void alterar_descricao() { int Vpes=0; printf("Digite o codigo que deseja fazer alteracao\n"); scanf("%d",&Vpes); alterar=atual1; atual1=(no*)malloc(sizeof(no)); printf("Digite o compromisso: "); scanf("%s",&atual->compromisso); atual1->ant=aux; aux=atual; printf("Alterado com sucesso!!!"); }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue o código inteiroa alteração esta sendo feita pelo registro q está no topo e* preciso alterar pelo codigo escolhido* preciso tbm de uma função q apartir do codigo escolhido me retorna a somatória do tempo* e preciso ordenar por data e depois por prioridadese alguem puder me ajudarnao entendo quase nda de listameu professor deu este exercicio para ser entregue, sem dar explicações.... loukotenho q entregar hoje ainda...rsAgradeçoMarisa Dantas//DIRETIVAS#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <conio.h>#define MAX 80//ESTRUTURAstruct codigo{ int n; int data; char compromisso[MAX]; int prioridade; int tempo; struct codigo *ant;};typedef struct codigo no;//Protótipos das funçõesvoid insere(); void exibe();void pesquisar();void remover();int tamanhoLista();no *aux, *atual2, *atual, *exibir, *pesquisa, *antes, *depois, *atual1, *alterar;int contador; int tamanhoLista() { return contador; } //EXCLUIR void remover() { int Vpesq; antes=depois=NULL; atual2=atual; printf("Digite o código a ser removido: "); scanf("%d", &Vpesq); while(atual2!=NULL) { if(Vpesq==atual2->n) break; atual2=atual2->ant; } if(atual2==NULL) { printf("Valor não encontrado!\n"); system("pause"); } else { contador--; atual2=atual; while(atual2!=NULL) { if(Vpesq==atual2->n) break; antes=atual2; atual2=atual2->ant; } if(Vpesq==atual2->n) if(atual2==atual) { atual=atual->ant; aux=atual; atual2->ant=NULL; free(atual2); } else { depois=atual2->ant; antes->ant=depois; atual2->ant=NULL; free(atual2); } } } //PESQUISAR void pesquisar() { int Vpesq=0; printf("Digite o codigo para a pesquisa\n"); scanf("%d",&Vpesq); pesquisa=atual; while(pesquisa!=NULL) { if(Vpesq==pesquisa->n) { printf("Codigo: %d\n", pesquisa->n); printf("Data: %d\n", pesquisa->data); printf("Compromisso: %s\n", pesquisa->compromisso); printf("Prioridade: %d\n", pesquisa->prioridade); printf("Tempo de Duracao: %d\n", pesquisa->tempo); system("pause"); break; } pesquisa=pesquisa->ant; } if(pesquisa==NULL) { printf("Valor nao encontrado!\n"); system("pause"); } }//INSERIR void insere() { atual=(no*)malloc(sizeof(no)); contador++; printf("Digite o codigo: "); scanf("%d",&atual->n); printf("Digite a data: "); scanf("%d",&atual->data); printf("Digite o compromisso: "); scanf("%s",&atual->compromisso); printf("Digite a prioridade: "); scanf("%d",&atual->prioridade); printf("Digite o tempo: "); scanf("%d",&atual->tempo); atual->ant=aux; aux=atual; }//EXIBIR void exibe() { if(aux==NULL) printf("A lista esta vazia!\n"); exibir=atual; while(exibir!=NULL) { printf("\nCodigo: %d ",exibir->n); printf("\nData: %d ",exibir->data); printf ("\nCompromisso: %s", exibir->compromisso); printf ("\nPrioridade: %d\n\n", exibir->prioridade); exibir=exibir->ant; } printf("\n"); system("pause"); } //ALTERAR DADOS void alterar_descricao() { int Vpes=0; printf("Digite o codigo que deseja fazer alteracao\n"); scanf("%d",&Vpes); alterar=atual1; atual1=(no*)malloc(sizeof(no)); printf("Digite o compromisso a alterar ou permaneca o mesmo: "); scanf("%s",&atual->compromisso); printf("Digite a data a alterar ou permaneca a mesma: "); scanf("%d",&atual->data); printf("Digite a prioridade a alterar ou permaneca a mesma: "); scanf("%d",&atual->prioridade); atual1=atual; //atual->ant=aux; aux=atual1; printf("Alterado com sucesso!!!"); } //PRINCIPALint main(){ contador=0; int opc, r; aux=NULL; do{ system("cls"); printf(" =======================\n"); printf(" Lista encadeada simples\n"); printf(" =======================\n"); printf("Operacoes: \n\n"); printf("[1] - Inserir \n[2] - Exibir\n[3] - Pesquisar\n[4] - Remover\n"); printf("[5] - Tamanho da lista\n[6] - Alterar Dados\n[7] - Sair\n\n"); printf("Digite uma opcao <- "); scanf("%d",&opc); switch(opc) { case 1: insere(); break; case 2: exibe(); break; case 3: pesquisar(); break; case 4: remover(); break; case 5: r=tamanhoLista(); printf("A lista contem %d elemento(s)\n",r); system("pause"); break; case 6: alterar_descricao(); break; case 7: system("exit"); break; default: printf("Opcao invalida \n"); system("pause"); } }while(opc!=7);}ERRO CORRIGINDO MINHA PERGUNTA* preciso tbm de uma função q apartir do codigo escolhido me retorna a somatória do tempoescolho a data e este me retorna a somatoria do tempo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

compilei seu código aqui, olha altere essa linha:

 

printf("Compromisso: %s\n", pesquisa->compromisso);

observe também que na leitura de compromisso voce deve digitar apenas uma palavra.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é bobeira, a lógica o que mais importa está correta.

 

é na função EXIBE, voce faz isso para mostrar o compromisso:

 

printf("Compromisso: %d\n", pesquisa->compromisso);

o correto é isso:

printf("Compromisso: %s\n", pesquisa->compromisso);

já que o elemento compromisso da estrutura é uma string.

 

 

hoje eu estava bem ocupado, amanhã eu te ajudo a ordenar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

vou postar a busca pronta, mas tente entender e pratique, pois só assim voce vai aprender de verdade.

 

int ordenar(){   if(contador<=1){ // um ou nenhum elemento nao recebe ordenacao	  printf("Nao ha o que ordenar!\n");	  system("pause");	  return 0;   }   int i;   // comeca a ordenacao   i=0;   while(i < contador){// atribuicao incial	  antes = atual;	  ant2 = atual;	  depois = atual->ant;	  while(depois!=NULL){		 if(depois->n < antes->n){ // se sim, troca deve ser feita			if(antes->n == aux->n){ // primeiro elemento da lista			   buff = depois->ant;			   depois->ant = antes;			   antes->ant = buff;   // reposiciona primeiro elemeto			   aux = depois;			   atual = depois;			}			else{ // qualquer elemento da lista que nao seja o primeiro			   buff = depois->ant;			   depois->ant = antes;			   antes->ant = buff;			   ant2->ant = depois;			}		 }// atualiza os ponteiros		 ant2 = antes;		 antes = depois;		 depois = depois->ant;	  }	  i++;   }   printf("Lista ordenada com sucesso\n");   system("pause");   return 0;}

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

o que quer dizer buff ???

nesse caso específico a variável buff armazena um endereco de memória que será perdido na troca. Ex:tenho que efetuar a troca de posicão entre dois elementos da lista.
if(depois->n < antes->n){ // se sim, troca deve ser feita   if(antes->n == aux->n){ // primeiro elemento da lista	  buff = depois->ant; // buff armazena o endereco do proximo elemento da lista, apartir de depois	  depois->ant = antes; // percebe que o valor eh perdido, pois preciso trocar a posicao	  antes->ant = buff; // olha o buff ai, ele guardou o endereco a quem depois apontava como proximo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.