So I have a square matrix composed of several linked lists, all containing random integers.
The data diagram looks like this so far:
Splitting a Matrix of Linked Lists-15c-000123103291042913021-png

Here's all the source code for now:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <crtdbg.h> 

typedef struct node{
    int          data;
    struct node *link;
} NODE;

typedef struct{
    int rows;
    int cols;
    NODE **m;
}MATRIX;


MATRIX *createMatrix(int rows, int cols);
MATRIX *buildRandomMatrix( int rows, int cols );
void   printMatrix( MATRIX *matrix );

NODE   *buildRandomList( int n );
void   printList( NODE *pList );

void split( MATRIX *matrix ); // must be changed

int main( void )
{
//  Local Definitions 
    MATRIX *matrix;

//  Statements 
    matrix = buildRandomMatrix( 6, 6 );
    //matrix = buildRandomMatrix( 3, 3 );
    //matrix = buildRandomMatrix( 2, 2 );
    //matrix = buildRandomMatrix( 1, 1 );
    //matrix = buildRandomMatrix( 0, 0 );
    //matrix = buildRandomMatrix( -10, -10 );
    //matrix = buildRandomMatrix( 5, 6 );

    if( !matrix )
        printf("Invalid sizes!\n");
    else
    {
        printf("ORIGINAL MATRIX:\n\n");
        printMatrix( matrix );

        split(matrix); // must be changed
        printf("NEW LISTS:\n\n");

        //printf( _CrtDumpMemoryLeaks() ? "Memory Leak\n" : "No Memory Leak\n");
    }

    system("pause");

    return 0;
}

/* ======================================================= 
   This function ...
     PRE:  matrix
     POST: ...
*/
void split( MATRIX *matrix ) // must be changed
{

    return;
}

// print up to here!
/* ********************************************************** */
/* ********************************************************** */
/* ********************************************************** */

/* ======================================================= 
   This function allocates a header structure for a MATRIX
   and a list of row NODE pointers
     PRE:  rows - the number of linked lists
           cols - the number of elements in each linked list
     POST: returns a pointer to the structure, all fields 
           initialized, OR NULL if not enough memory
*/
MATRIX *createMatrix(int rows, int cols)
{
    MATRIX *matrix;

    matrix = (MATRIX *) malloc(sizeof(MATRIX));
    if( matrix )
    {
        matrix->rows = rows;
        matrix->cols = cols;
        matrix->m    = (NODE **) calloc( rows, sizeof(NODE *));
        if( !matrix->m ) // not enough memory
        {
            free(matrix);
            matrix = NULL;
        }
    }
    return matrix;
}

/* ====================================================== 
   This function builds a matrix of rows linked lists, 
   each containing cols random numbers
     PRE: rows - the number of linked lists
          cols - the number of elements in each linked list
     
     POST: returns a pointer to MATRIX header structure
*/
MATRIX* buildRandomMatrix( int rows, int cols )
{
//  Local Definitions 
    MATRIX *matrix = NULL;
    int    r;

//  Statements 
    srand( time(NULL) );

    if ( rows > 0 && rows == cols )
    {
        matrix = createMatrix (rows, cols);
        for( r = 0; r < rows; r++ )
            matrix->m[r] = buildRandomList(cols);
    }// if
    return matrix;
}


/* ====================================================== 
   This function prints a matrix of rows linked lists,
   each containing cols random numbers
     PRE:  matrix - a pointer to the header structure of
                    a matrix
     POST: matrix printed
*/
void printMatrix( MATRIX *matrix )
{
//  Local Definitions 
    int r;

//  Statements 
    for( r = 0; r < matrix->rows; r++ )
    {
        printf( "Row #%d: ", r + 1 );
        printList(matrix->m[r]);
    }
    printf("\n\n\n");

    return;
}

/* ====================================================== 
   This function builds a linked list of n random numbers
     PRE:  n - number of nodes
     POST: returns a pointer to the first node 
*/
NODE *buildRandomList( int n )
{
//  Local Definitions 
    NODE * pList;
    NODE * pNew;
    NODE * pPre;
    int    i;

//  Statements 
    pList = NULL; //empty list
    if ( n > 0 )
    {
        // create the first node in the list
        pList = (NODE *) malloc(sizeof(NODE));
        if( pList == NULL )
        {
            printf( "Not enough memory\n" );
            exit(100);
        }
        pList->data = 1 + rand() % 99;
        // create the rest of the nodes        
        pPre = pList;
        for( i = 1; i < n; i++ )
        {
            pNew = (NODE *) malloc(sizeof(NODE));
            if( pNew == NULL )
            {
                printf( "Not enough memory\n" );
                exit(100);
            }
            pNew->data = 1 + rand() % 99;
            pPre->link = pNew;
            pPre = pNew;
        }
        pPre->link = NULL; // set the last node's link to NULL
    }
    return pList;
}


/* ====================================================== 
   This function prints a linked list
     PRE:  pList - pointer to the first node in the list
     POST: list printed
*/
void printList( NODE *pList )
{
   NODE *pCurr;
  
   pCurr = pList;
   while( pCurr != NULL )
   {
      printf( "%4d", pCurr->data );
      pCurr = pCurr->link;
   }
   printf("\n");

   return;
}
I need to get it to look like this:
Splitting a Matrix of Linked Lists-15c-00324234209r53204923402-png

I'm not entirely sure how to start codewise....
I know that I must rearrange the nodes in the lists but I am not sure how to do it.

Any and all feedback is appreciated