Chain words crossword-style
ANSI C, 385 390 Characters

int N,a=1,x,y,d=1,u,k,l;int main(int c,char**v){for(;a&lt;c;)N+=strlen(v[a++]);int H=N*2,W=N*4,m=H,n=N,q=m,w=n;char*p,F[W][H],*o;memset(F,32,W*H);for(a=1;a&lt;c;a++){q=(x=m)&lt;q?m:q;w=(y=n)&lt;w?n:w;m=-1;for(p=v[a];*p;p++){F[x][y]=*p;if(m&lt;0&amp;&amp;a&lt;c-1&amp;&amp;(o=strchr(v[a+1],*p))){u=o-v[a+1];m=d?x:x-u*2;n=d?y-u:y;}if(d)x+=2;else y++;}d=!d;}for(l=w;l&lt;H;l++){for(k=q;k&lt;W;)putchar(F[k++][l]);putchar(10);}}


Call it like this: ./crossword This site graduated finally

Ungolfed version:

int N,a=1,x,y,d=1,u,k,l;
int main(int c, char **v) {
    for(;a&lt;c;)
        N+=strlen(v[a++]);
    int H = N*2, W = N*4, m = H, n = N, q=m, w=n;
    char *p,F[W][H], *o;
    memset(F, 32, W*H);
    for (a=1; a &lt; c; a++) {
        q=(x=m)&lt;q?m:q;
        w=(y=n)&lt;w?n:w;
        m=-1;
        for (p=v[a]; *p; p++) {
            F[x][y] = *p;
            if (m&lt;0&amp;&amp;a&lt;c-1&amp;&amp;(o = strchr(v[a+1], *p))) {
                u = o-v[a+1];
                m = d ? x : x-u*2;
                n = d ? y-u : y;
            }
            if (d) x+=2; else y++;
        }
        d=!d;
    }
    for (l = w; l &lt; H; l++) {
        for (k = q; k &lt; W;)
            putchar(F[k++][l]);
        putchar(10);
    }
}


Thank you tucuxi for the tips!