iniciante Posted December 25, 2009 at 10:36 PM Report Share #302413 Posted December 25, 2009 at 10:36 PM alguem me pode dar um pequeno codigo de exmplo de como posso passar o primeiro elemento de uma lista duplamente ligada para o fim da mesma? é urgente continuação de boas festar para todos RC Link to comment Share on other sites More sharing options...
_deXter Posted December 26, 2009 at 10:30 AM Report Share #302440 Posted December 26, 2009 at 10:30 AM Mostra aí o que já tens feito... Link to comment Share on other sites More sharing options...
iniciante Posted December 26, 2009 at 12:00 PM Author Report Share #302447 Posted December 26, 2009 at 12:00 PM Mostra aí o que já tens feito... eu tenho estas duas listas e um array que aponta para alista..isto é um trabalho de sistemas oeprativos typedef struct lista_pcb { int pid; /* pid*/ int prioProc; int tempProc; int tempUsado; time_t time; struct lista_pcb *next; /* Próximo elemento da lista*/ struct lista_pcb *prev; /* Elemento anterior da lista */ }PCB; // Estrutura Inicio de Lista typedef struct queue_head { struct proc *next; struct proc *last; }queue_t; queue_t array_queue[10];// Tabela das Ready Queues para adicionar a lista elementos eu adicono assim: p->prioProc = prioProc; p->tempProc = tempProc; p->pid =pid++; p->time = time(NULL); q = &array_queue[prioProc]; if (q->next == 0) { q->next = p; q->last = p; } else { r = q->last; r->next = p; q->last = p; } p->next=0; agora quero ser o primeiro elemento da lista 0 e dps de o ler polo na ultima posicao da lista RC Link to comment Share on other sites More sharing options...
_deXter Posted December 26, 2009 at 12:26 PM Report Share #302448 Posted December 26, 2009 at 12:26 PM Esse código colocado às postas fica um pouco confuso. Até porque acho que devem faltar aí coisas, por exemplo: onde está definida a struct proc que usas na queue_t ? ou então a lista_pbc é a tal proc... Que é o que me parece. Bom, de qualquer forma, o que necessitas de fazer para passar o primeiro elemento para o fim da lista é algo como: - através do queue_head acedes ao último elemento da lista e colocas o next desse elemento a apontar para o next da queue_head, ou seja, o ultimo elemento deixa de o ser e passa a ter um elemento seguinte que será o novo último - colocas o last do queue_head a apontar para o actual next da mesma, ou seja, o actual primeiro elemento passará a ser o último - colocas o next do queue_head a apontar para o next do next da queue_head, ou seja, o actual segundo elemento passará a ser o primeiro - finalmente, defines o prev do actual primeiro (next) como sendo NULL. Ou seja, como é o primeiro não tem elemento anterior a ele. Acho que não me esqueci de nada. Link to comment Share on other sites More sharing options...
iniciante Posted December 26, 2009 at 12:56 PM Author Report Share #302451 Posted December 26, 2009 at 12:56 PM Esse código colocado às postas fica um pouco confuso. Até porque acho que devem faltar aí coisas, por exemplo: onde está definida a struct proc que usas na queue_t ? ou então a lista_pbc é a tal proc... Que é o que me parece. Bom, de qualquer forma, o que necessitas de fazer para passar o primeiro elemento para o fim da lista é algo como: - através do queue_head acedes ao último elemento da lista e colocas o next desse elemento a apontar para o next da queue_head, ou seja, o ultimo elemento deixa de o ser e passa a ter um elemento seguinte que será o novo último - colocas o last do queue_head a apontar para o actual next da mesma, ou seja, o actual primeiro elemento passará a ser o último - colocas o next do queue_head a apontar para o next do next da queue_head, ou seja, o actual segundo elemento passará a ser o primeiro - finalmente, defines o prev do actual primeiro (next) como sendo NULL. Ou seja, como é o primeiro não tem elemento anterior a ele. Acho que não me esqueci de nada. ficaria algo assim: for(; q->next->next!=NULL ; p= q->next); q->last=q->next; q->next=NULL; q->next=q->next->next; p->prev=NULL; ? isto do aspontadores baralham-me todo mesmo =s RC Link to comment Share on other sites More sharing options...
skin Posted December 26, 2009 at 01:27 PM Report Share #302452 Posted December 26, 2009 at 01:27 PM ? isto do aspontadores baralham-me todo mesmo =s Espero que ajude: http://joaopedropereira.com/blog/2009/11/26/apontadores-c/ Our lives begin to end the day we become silent about things that matter - Martin Luther King Link to comment Share on other sites More sharing options...
_deXter Posted December 26, 2009 at 01:52 PM Report Share #302458 Posted December 26, 2009 at 01:52 PM Repara que tens acesso directo ao último elemento da lista, portanto é desnecessário percorrer toda a lista com aquele for. Depois, tens ali uma instrução que não faz sentido (q->next=NULL;), visto que logo de seguida voltas a defini-lo com: q->next=q->next->next; Assumindo q como a cabeça da lista, ficaria algo como: q->last->next = q->next // o ultimo elemento da lista passa a ter um elemento a seguir a si q->last=q->next; // o ultimo elemento da lista deixa de o ser e dá lugar ao novo ultimo elemento, que ainda é também o primeiro q->last->last = NULL; // o novo ultimo elemento deixa de ter elemento seguinte q->next=q->next->next; // o segundo passa a primeiro q->next->prev=NULL; // o novo primeiro deixa de ter antecedente Link to comment Share on other sites More sharing options...
iniciante Posted December 27, 2009 at 01:01 PM Author Report Share #302547 Posted December 27, 2009 at 01:01 PM Repara que tens acesso directo ao último elemento da lista, portanto é desnecessário percorrer toda a lista com aquele for. Depois, tens ali uma instrução que não faz sentido (q->next=NULL;), visto que logo de seguida voltas a defini-lo com: q->next=q->next->next; Assumindo q como a cabeça da lista, ficaria algo como: q->last->next = q->next // o ultimo elemento da lista passa a ter um elemento a seguir a si q->last=q->next; // o ultimo elemento da lista deixa de o ser e dá lugar ao novo ultimo elemento, que ainda é também o primeiro q->last->last = NULL; // o novo ultimo elemento deixa de ter elemento seguinte q->next=q->next->next; // o segundo passa a primeiro q->next->prev=NULL; // o novo primeiro deixa de ter antecedente já percebi a ideia...mas continuo sem conseguir..estou a compilar isto em linux entao quando meto por exemplo a linha de codigo "q->last->next= q->next;" da-me este erro "dereferencing pointer to incomplete type".. bem mas obrigado na mesma pela ajuda xD RC Link to comment Share on other sites More sharing options...
_deXter Posted December 27, 2009 at 07:13 PM Report Share #302648 Posted December 27, 2009 at 07:13 PM Provavelmente o q não é um apontador, logo tens que usar q.last e não q->last. Link to comment Share on other sites More sharing options...
iniciante Posted December 27, 2009 at 08:10 PM Author Report Share #302653 Posted December 27, 2009 at 08:10 PM Provavelmente o q não é um apontador, logo tens que usar q.last e não q->last. é...o q é um apontador para: // Estrutura Inicio de Lista typedef struct queue_head { struct proc *next; struct proc *last; }queue_t; e dps tenho p e r a apontar para typedef struct lista_pcb { int pid; /* pid*/ int prioProc; int tempProc; int tempUsado; time_t time; struct lista_pcb *next; /* Próximo elemento da lista*/ struct lista_pcb *prev; /* Elemento anterior da lista */ }PCB; RC Link to comment Share on other sites More sharing options...
_deXter Posted December 27, 2009 at 08:21 PM Report Share #302654 Posted December 27, 2009 at 08:21 PM Bom, o problema é com desreferenciação, tenta perceber o que se passa. Se quiseres colocar o código inteiro aqui, posso ver o que se passa. Agora aos pedaços é complicado. Link to comment Share on other sites More sharing options...
iniciante Posted December 27, 2009 at 09:27 PM Author Report Share #302664 Posted December 27, 2009 at 09:27 PM por aqui o codigo inteiro é complicado...isto é um projecto uiniversitario e muitos dos meus colegas conhecem o site...nao posso publicar assim o meu trabalho inteiro =/ RC Link to comment Share on other sites More sharing options...
_deXter Posted December 27, 2009 at 09:56 PM Report Share #302675 Posted December 27, 2009 at 09:56 PM Eu percebo, mas nesse caso o melhor que te posso dizer é: verifica a forma como e quando utilizas o ->. Se o usas então o "objecto" terá que ser um apontador, caso contrário deves fazer o acesso ao atributo utilizando um ".": objecto.atribute . Se poderes colocar a declaração dos objectos também pode ajudar... Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now