Jump to content

inserçao ordenada numa lista ligada


Diogo Matias

Recommended Posts

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;
}
}
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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;
}
}
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

Link to comment
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.