Jump to content

duvida em apontadores


iniciante

Recommended Posts

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

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

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

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

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

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

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.