• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

iniciante

duvida em apontadores

13 mensagens neste tópico

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  :wallbash:

continuação de boas festar para todos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Provavelmente o q não é um apontador, logo tens que usar q.last e não q->last.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 =/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora