Ir ao conteúdo
  • Cadastre-se
kmynsky

Ajuda com ordenamento de Lista em C

Recommended Posts

Estou tentando fazer uma função de inserir itens ordenados em uma lista (função inserirOrd), para isto estou me baseando na função já implementada(e que funciona) AddItemList.

Porém ela está armazenando aparentemente só o primeiro elemento da lista.

Explicando mais sobre a função inserirOrd, a intenção é a seguinte, eu adiciono um item ordenando de forma crescente pelo campo "tempo_execucao", porém ao ter dois elementos com o mesmo tempo_execucao quero ordenar eles pelo campo "prioridade" também de forma crescente.

Quando uso a função o programa acaba com a mensagem:

Process returned -1073741819 (0xC0000005)

Todo resto está funcionando pois já vinha usando o código sem esta função, que foi a que criei por último.

Segue abaixo o código completo.

Se alguém puder dar uma ajuda, agradeço.


#include<stdio.h>
#include<string.h>
#include<malloc.h>
//Elemento da lista
typedefstruct _elemento{
int tempo_chegada;// TEmpo de chegada do processo.
int tempo_execucao;// Tempo que o processo vai ficar executando.
int prioridade;// Prioridade do processo.
}Elemento;
//Célula da lista
typedefstruct _cel Celula;
struct _cel{
ElementoProcesso;// Elemento que quero armazenar.
Celula*pprox;// Ponteiro contém o endereço de memória do próximo elemento da lista.
};
//A lista
typedefstruct _list{
Celula*pfirst;// Primeiro elemento da lista.
Celula*plast;// Último elemento da lista.
}Lista;
//Inicaliza a lista ligada
voidIniciaLista(Lista*pList)
{
pList->pfirst = NULL;
pList->plast = NULL;
}
// Verifica se a lista está vazia.
int isListEmpty(ListaList)
{
if(List.pfirst == NULL)
return1;// Retorna 1 se a lista está vazia.
else
return0;// Retorna 0 se a lista não está vazia.
}
//Insere item na lista
intAddItemList(Lista*pLista,int chegada,int execucao,int prioridade)
{
Celula*pCelAux;//célula auxiliar
//Aloca memória para o novo elemento
pCelAux =(Celula*)malloc(sizeof(Celula));
//Verifica se conseguiu alocar memória
if(pCelAux == NULL){
return0;
}
//Copia os elemento para a celula
pCelAux->Processo.tempo_chegada = chegada;
pCelAux->Processo.tempo_execucao = execucao;
pCelAux->Processo.prioridade = prioridade;
//Insere elemento na lista
//Se lista vazia
if(isListEmpty(*pLista)){
//Primeiro e ultimo elemento
pLista->pfirst = pCelAux;
pLista->plast = pCelAux;
//Marca fim da lista
pCelAux->pprox = NULL;
}
else{
//Caso já tenhamos itens na lista
//Inserimos sempre na ultima posição da lista
//ou seja, o que era o utlimo elemento aponta agora para pCelAux
pLista->plast->pprox = pCelAux;
pLista->plast = pCelAux;
//Marca fim da lista
pCelAux->pprox = NULL;
}
//Tudo OK
return1;
}
int inserirOrd (Lista*pLista,int chegada,int execucao,int prioridade){
Celula*pCelAux,*pAtu,*pAnt,*pAtuPercorre,*pAntPercorre ;//célula auxiliar
int igual=0;
pAntPercorre = NULL;
pAtuPercorre = pLista -> pfirst;
//Aloca memória para o novo elemento
pCelAux =(Celula*)malloc(sizeof(Celula));
//Verifica se conseguiu alocar memória
if(pCelAux == NULL){
return0;
}
//Copia os elemento para a celula
pCelAux->Processo.tempo_chegada = chegada;
pCelAux->Processo.tempo_execucao = execucao;
pCelAux->Processo.prioridade = prioridade;
//Insere elemento na lista
while( pAtuPercorre != NULL && pAtuPercorre->Processo.tempo_execucao < execucao){
if(pAtuPercorre->Processo.tempo_execucao == execucao){//Se o tempo de execução for igual é organizado pela prioridade.
igual=1;
pAtu=pAtuPercorre;
pAnt=pAntPercorre;
}
pAntPercorre = pAtuPercorre;
pAtuPercorre = pAtuPercorre -> pprox;
}
//Se lista vazia, insere no começo.
if(isListEmpty(*pLista)&& igual!=1){
//Primeiro e ultimo elemento
pLista->pfirst = pCelAux;
pLista->plast = pCelAux;
//Marca fim da lista
pCelAux->pprox = NULL;
}
if(igual==1){
while( pAtuPercorre != NULL && pAtu->Processo.tempo_execucao == execucao && pAtu->Processo.prioridade < prioridade){// Quanto menor o numero da prioridade primeiro é executado.
pAnt = pAtu;
pAtu = pAtu -> pprox;
}
}
if(!(isListEmpty(*pLista))&& igual!=1){
pCelAux -> pprox = pAnt -> pprox;
pAnt -> pprox = pCelAux;
}
return1;
}
//Imprime lista
voidImprimeLista(ListaList)
{
Celula*pAux;//ponteiro auxiliar
int i=0;
//Verifica se lista não está vazia
if(isListEmpty(List))
return;//Sai fora
/*
Procedimento de busca:
- Associamos pAux ao primeiro elemento da lista
- A cada giro do loop Associamos pAux ao proximo elemento da lista
apontado por pprox.
- Se paux for igual a NULL indica que chegamos ao fim da lista
*/
for(pAux =List.pfirst; pAux != NULL; pAux = pAux->pprox){
i++;
printf("\n Processo %d: \n Tempo chegada: %d \n Tempo execucao: %d \n Prioridade: %d \n", i, pAux->Processo.tempo_chegada, pAux->Processo.tempo_execucao, pAux->Processo.prioridade);
}
}
//Limpa elementos lista
voidLimpaLista(Lista*pList)
{
Celula*pAux;//ponteiro auxiliar
Celula*pRemove;//ponteiro do item a ser eleminado
//Verifica se lista não está vazia
if(isListEmpty(*pList))
return;//Sai fora
/*
Procedimento de busca:
- Associamos pAux ao primeiro elemento da lista
- A cada giro do loop Associamos pAux ao proximo elemento da lista
apontado por pprox.
- Se paux for igual a NULL indica que chegamos ao fim da lista
*/
pAux = pList->pfirst;
while(pAux != NULL){
pRemove = pAux;
pAux = pAux->pprox;
free(pRemove);
}
//Marca lista vazia
pList->pfirst = NULL;
pList->plast = NULL;
}
void main(void)
{
int*ptrNproc,*ptrTslice, T_slice,Nproc;//T_slice-> fatia de tempo, Nproc-> número de processos no arquivo.
Lista myList;//Lista
//Inicializa lista
IniciaLista(&myList);
//Verifica lista vazia
if(isListEmpty(myList))
printf("\nLista Vazia!");
//Adiciona elementos na lista
inserirOrd(&myList,3,10,2);
inserirOrd(&myList,4,12,1);
inserirOrd(&myList,9,15,2);
inserirOrd(&myList,11,15,1);
inserirOrd(&myList,12,8,5);
//Verifca lista vazia
//Verifica lista vazia
if(!isListEmpty(myList))
printf("\nLista com elementos! \n");
//Imprime itens da lista
ImprimeLista(myList);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×