/* TestAry2TODouble.c */

#include <stdio.h>
#define NN 200
int Ary2TODouble(int*,int*,int*,int*,int*);

void main(void)
{
 int K,N,N2,              /* N pairs linked objects, N2 = 2N */
  A[]={1,2,2,3,4,6,0},
  B[]={2,3,5,5,5,0,0},
  AA[NN],BB[NN],DIV[NN];

  N=0; while (A[N]) N++;
  printf("N=%d\n",N);
  for (K=0; K<=N; K++) printf("%d ",A[K]); puts("");
  for (K=0; K<=N; K++) printf("%d ",B[K]); puts("");

  N2=Ary2TODouble(A,B,AA,BB,DIV); printf("N2=%d\n",N2);
  for (K=0; K<=N2; K++) printf("%d ",AA[K]); puts("");
  for (K=0; K<=N2; K++) printf("%d ",BB[K]); puts("");
  for (K=1; K<=N2; K++) printf("%d ",DIV[K]); puts("");

 getchar();
}

/*****************************/

int Ary2TODouble(int *P, int *Q, int *PP, int *QQ, int *RR)
{
 int CNT=0,I,J,K,M,TEMP,FIRSTOBJ,LASTOBJ, *R, C[NN],DIV[NN];

 R=C;
 while (*P)
   {
    *R = *P * 65536 + *Q;  CNT++;
     R++;
    if (*Q) {*R = *Q * 65536 + *P; CNT++;}
     R++; P++; Q++;
   }

 for (I=0; I<CNT; I++)
  {
   M=C[I]; K=I;
   for (J=I+1; J<CNT; J++) if (C[J]<M) {M=C[J]; K=J;}
   if (K!=I) {TEMP=C[I]; C[I]=C[K]; C[K]=TEMP;}
  }
 R=C;
 for (K=0; K<CNT; K++) {*PP = *R/65536; *QQ = *R%65536; PP++; QQ++; R++;}
 *PP=*QQ=0; K=CNT;

 PP--; K--;  LASTOBJ=*PP;

/* printf("*PP=%d\n",*PP); */
 QQ = PP; QQ--;
 while (K) {{if (*PP != *QQ) DIV[*PP] = K;  K--;} PP--; QQ--;}
 FIRSTOBJ=*PP;
 DIV[FIRSTOBJ]=K;

 /* printf("*PP=%d\n",*PP);
 for (K=1; K<=LASTOBJ; K++) printf("%d %d   ",K,DIV[K]); puts("\n"); */

 R=DIV;
 for (K=FIRSTOBJ; K<=LASTOBJ; K++) {RR++; R++; *RR=*R;}

 return CNT;
}




