Mazinha_Dantas 0 Denunciar post Postado Maio 9, 2007 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
Kandrade 7 Denunciar post Postado Maio 9, 2007 voce entendeu o algoritmo?sabe como funciona uma lista? e nao consigo fazer uma função para alterar um determinado dadopara 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 = 2while(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 necessariasobs: 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
Mazinha_Dantas 0 Denunciar post Postado Maio 9, 2007 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
Kandrade 7 Denunciar post Postado Maio 9, 2007 ó 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
Mazinha_Dantas 0 Denunciar post Postado Maio 9, 2007 Oi amigopela sua dica, eu consegui fazer a alteraçãoagora preciso entender como ordenarme ajuda p.f. ???ObrigadaMarisa Compartilhar este post Link para o post Compartilhar em outros sites
Mazinha_Dantas 0 Denunciar post Postado Maio 9, 2007 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
Mazinha_Dantas 0 Denunciar post Postado Maio 9, 2007 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
Kandrade 7 Denunciar post Postado Maio 9, 2007 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
Mazinha_Dantas 0 Denunciar post Postado Maio 9, 2007 Hummmmm nao entendi.... desculpaq linha eu tenho q alterar e porque ??valewMarisa Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Maio 9, 2007 é 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
Mazinha_Dantas 0 Denunciar post Postado Maio 9, 2007 ah sim, ja arrumei este Obrigada por enquanto até amanhã valew http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Marisa Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Maio 10, 2007 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
Mazinha_Dantas 0 Denunciar post Postado Maio 10, 2007 valewvou tentar entender, e jah pra adiantar o que quer dizer buff ??? :unsure: Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Maio 10, 2007 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