Jump to content
Diogo Matias

inserçao ordenada numa lista ligada

Recommended Posts

Diogo Matias

Boas pessoal,

tenho uma funçao que nao esta completa em relaçao á inserçao ordenada, apenas verifico o primeiro e o ultimo elemento. Mas com esta funçao em vez de inserir cada elemente uma vez acaba por inserir duas vezes. A funçao é extensa pois utilizo varias structs e o que desejo é inserir as datas ordenadas. Espero que alguem me possa ajudar no meu erro

void inserir(List original, hora inteiro,hora inteira,data day,char *nome, char *local){

List base = original;
List aux = original->next;
List novo;
while(aux!= NULL){
	aux=aux->next;
	base=base->next;
}
if ((original->next == NULL) || (day.ano>base->date.ano) || ((day.ano == base->date.ano) && (day.mes > base->date.mes)) || ((day.ano==base->date.ano) && (day.mes == base->date.mes) && (day.dia >base->date.dia))){
	novo=(lista*)malloc(sizeof(lista));
	novo->time.horas = inteiro.horas;
	novo->time.minutos = inteiro.minutos;
	novo->timee.horas = inteira.horas;
	novo->timee.minutos = inteira.minutos;
	novo->date.dia = day.dia;
	novo->date.mes = day.mes;
	novo->date.ano = day.ano;
	novo->name = nome;
	novo->place = local;
	novo->next = aux;
	base->next = novo;
}
base = original;
aux = original->next;
if ((day.ano < base->date.ano) || ((day.ano == base->date.ano) && (day.mes < base->date.mes)) || ((day.ano==base->date.ano) && (day.mes == base->date.mes) && (day.dia <base->date.dia))){
	novo=(lista*)malloc(sizeof(lista));
	novo->time.horas = inteiro.horas;
	novo->time.minutos = inteiro.minutos;
	novo->timee.horas = inteira.horas;
	novo->timee.minutos = inteira.minutos;
	novo->date.dia = day.dia;
	novo->date.mes = day.mes;
	novo->date.ano = day.ano;
	novo->name = nome;
	novo->place = local;
	novo->next = aux;
	base->next = novo;
}
}

Edited by Rui Carlos
Formatação do código.

Share this post


Link to post
Share on other sites
HappyHippyHippo

só olharei para o código depois de o colocares dentro das tags correcta (se não sabes como, vê no link de ajuda no final da página)

no entanto, uma coisa podes alterar :


novo = malloc(sizeof(lista)); // remove o cast
*novo->time = inteiro; // copia integral da estrutura de uma só vez !!!
// etc ...
[/Code]


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Diogo Matias
void inserir(List original, hora inteiro,hora inteira,data day,char *nome, char *local){

List base = original;
List aux = original->next;
List novo;
while(aux!= NULL){
aux=aux->next;
base=base->next;
}
if ((original->next == NULL) || (day.ano>base->date.ano) || ((day.ano == base->date.ano) && (day.mes > base->date.mes)) || ((day.ano==base->date.ano) && (day.mes == base->date.mes) && (day.dia >base->date.dia))){
novo=(lista*)malloc(sizeof(lista));
novo->time.horas = inteiro.horas;
novo->time.minutos = inteiro.minutos;
novo->timee.horas = inteira.horas;
novo->timee.minutos = inteira.minutos;
novo->date.dia = day.dia;
novo->date.mes = day.mes;
novo->date.ano = day.ano;
novo->name = nome;
novo->place = local;
novo->next = aux;
base->next = novo;
}
base = original;
aux = original->next;
if ((day.ano < base->date.ano) || ((day.ano == base->date.ano) && (day.mes < base->date.mes)) || ((day.ano==base->date.ano) && (day.mes == base->date.mes) && (day.dia date.dia))){
novo=(lista*)malloc(sizeof(lista));
novo->time.horas = inteiro.horas;
novo->time.minutos = inteiro.minutos;
novo->timee.horas = inteira.horas;
novo->timee.minutos = inteira.minutos;
novo->date.dia = day.dia;
novo->date.mes = day.mes;
novo->date.ano = day.ano;
novo->name = nome;
novo->place = local;
novo->next = aux;
base->next = novo;
}
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

Mas com esta funçao em vez de inserir cada elemente uma vez acaba por inserir duas vezes.

void inserir(List original, hora inteiro,hora inteira,data day,char *nome, char *local){

 // ...

 if ((original->next == NULL) || (day.ano>base->date.ano) || ((day.ano == base->date.ano) && (day.mes > base->date.mes)) || ((day.ano==base->date.ano) && (day.mes == base->date.mes) && (day.dia >base->date.dia))){
   // uma vez
   novo=(lista*)malloc(sizeof(lista));
   // ...
 }

 // ...

 if ((day.ano < base->date.ano) || ((day.ano == base->date.ano) && (day.mes < base->date.mes)) || ((day.ano==base->date.ano) && (day.mes == base->date.mes) && (day.dia <base->date.dia))){
   // duas vezes
   novo=(lista*)malloc(sizeof(lista));
   // ...
 }
}

afinal o que queres fazer ?

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
KTachyon

Cria uma função que transforma os dados temporais num timestamp e faz uma comparação directa.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.