Jump to content

Dividir uma lista ligada em duas


sustohouse
 Share

Recommended Posts

Tenho aqui mais um duvida, exercício de exame.

Temos a estrutura

typedef struct _no {
   int valor,i=1;
   struct _no *next;
} no;

É pretendido dividir a lista ligada em duas, ficando com o mesmo numero de nós, caso impar, a primeira lista ficará com mais um nó.

Até ao momento tenho:

void divide (no *p, no **p1, no **p2)  //p aponta para  a lista. p1 e p2 ponteiro de ponteiro para as novas listas
{
  no a=p;
  int contador=0,meio,i=1;
  float divisao,resto;

  while(a!=NULL)
  {
     contador++;
     a=a->prox;
  }
  
   resto=contador%2;
   divisao=contador/2;
   meio=divisao+resto;

   while(p!=NULL)  //nao sei o que aplicar neste ciclo 
   {
       if(i<=meio)
       {

       }

       else
       {

       }

    i++;
   }

}

Mais uma vez agradeço toda a ajuda.

Passarei a tentar ajudar neste grande forum  😛

Link to comment
Share on other sites

Não precisas de tanta coisa para dividir uma lista ligada ao meio.

Primeiro defines qual esse meio, seguindo as restrições que deste (de ser par ou ímpar). Depois percorres até a esse meio. Quando chegas lá, basicamente guardas o ponteiro que está na estrutura seguinte à que paraste (defines uma nova cabeça de uma nova lista) e depois metes o ponteiro da estrutura em que estás NULL.

here since 2009

Link to comment
Share on other sites

Depois de saber o meio, que já está resolvido na função vou correr o while até ao meio, certo?

Peço desculpa, mas não entendi,

Quando chegas lá, basicamente guardas o ponteiro que está na estrutura seguinte à que paraste (defines uma nova cabeça de uma nova lista) e depois metes o ponteiro da estrutura em que estás NULL.

Link to comment
Share on other sites

@Localhost, como referis-te no anterior post, confirma se eu entendi.

Vou correr a lista inicial, ao mesmo tempo que vou lendo vou ter de atribuir essa leitura a lista p1, quando chegar a meio digo que a lista p2 vai ser igual ao ponteiro de leitura na actual. É isso?

Link to comment
Share on other sites

Assim não estás a dividir a meio. Só precisas de um loop for que te percorre de 0 até meio-2 e vais actualizando o ponteiro. Quando chegas a meio tens de pôr o ponteiro de lá a NULL e tens de receber esse meio para p2.

here since 2009

Link to comment
Share on other sites

Até ao momento estou com este codigo

typedef struct _no {
   int valor;
   struct _no *next;
} no;



void divide (no *p, no **p1, no **p2)  //p aponta para  a lista. p1 e p2 ponteiro de ponteiro para as novas listas
{
  no a=p;
  int contador=0,meio,i;
  float divisao,resto;

  while(a!=NULL)
  {
     contador++;
     a=a->prox;
  }
  
   resto=contador%2;
   divisao=contador/2;
   meio=divisao+resto;

   p1=p;
   for(i=0;i<meio;i++)
      p=p->next;
   p2=p->next;
   p->next=NULL;

  
}

Obrigado a todos desde já  😛

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
 Share

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