Radix Sort implementado em C ++

Eu estou tentando melhorar o meu C ++, criando um programa que terá uma grande quantidade de números entre 1 e 10 ^ 6. Os intervalos que armazenam os números em cada passagem são uma matriz de nós (onde o nó é uma estrutura que criei contendo um valor e um próximo atributo do nó).

Depois de classificar os números em buckets de acordo com o valor menos significativo, tenho o final de um ponto de bucket para o início de outro bucket (para que eu possa rapidamente obter os números sendo armazenados sem interromper a ordem). Meu código não tem nenhum erro (seja compilação ou tempo de execução), mas eu acertei a parede sobre como vou resolver as 6 iterações restantes (desde que eu saiba o intervalo de números).

O problema que estou tendo é que inicialmente os números foram fornecidos para a função radixSort na forma de uma matriz int. Após a primeira iteração da classificação, os números agora são armazenados na matriz de estruturas. Existe alguma maneira que eu poderia retrabalhar o meu código para que eu tenha apenas um loop para as 7 iterações, ou eu vou precisar de um para loop que será executado uma vez e outro loop abaixo que será executado 6 vezes antes de retornar o completamente classificado Lista?

#include <iostream>
#include <math.h>
using namespace std;

struct node
{
    int value;
    node *next; 
};

//The 10 buckets to store the intermediary results of every sort
node *bucket[10];
//This serves as the array of pointers to the front of every linked list
node *ptr[10];
//This serves as the array of pointer to the end of every linked list
node *end[10];
node *linkedpointer;
node *item;
node *temp;

void append(int value, int n)
{
    node *temp; 
    item=new node;
    item->value=value;
    item->next=NULL;
    end[n]=item;
    if(bucket[n]->next==NULL)
    {
        cout << "Bucket " << n << " is empty" <<endl;
        bucket[n]->next=item;
        ptr[n]=item;
    }
    else
    {
        cout << "Bucket " << n << " is not empty" <<endl;
        temp=bucket[n];
        while(temp->next!=NULL){
            temp=temp->next;
        }
        temp->next=item;
    }
}

bool isBucketEmpty(int n){
    if(bucket[n]->next!=NULL)
        return false;
    else
        return true;
}
//print the contents of all buckets in order
void printBucket(){
    temp=bucket[0]->next;
    int i=0;
    while(i<10){
        if(temp==NULL){
            i++;
            temp=bucket[i]->next;                       
        }
        else break;

    }
    linkedpointer=temp;
    while(temp!=NULL){
        cout << temp->value <<endl;
        temp=temp->next;
    }
}

void radixSort(int *list, int length){
    int i,j,k,l;
    int x;
    for(i=0;i<10;i++){
        bucket[i]=new node;
        ptr[i]=new node;
        ptr[i]->next=NULL;
        end[i]=new node;
    }
    linkedpointer=new node;

    //Perform radix sort
    for(i=0;i<1;i++){
        for(j=0;j<length;j++){          
            x=(int)(*(list+j)/pow(10,i))%10;            
            append(*(list+j),x);
            printBucket(x); 
        }//End of insertion loop
        k=0,l=1;

        //Linking loop: Link end of one linked list to the front of another
        for(j=0;j<9;j++){
            if(isBucketEmpty(k))
                k++;
            if(isBucketEmpty(l) && l!=9)
                l++;
            if(!isBucketEmpty(k) && !isBucketEmpty(l)){
                end[k]->next=ptr[l];
                k++;
                if(l!=9) l++;   
            }

        }//End of linking for loop

        cout << "Print results" <<endl;
        printBucket();

        for(j=0;j<10;j++)
            bucket[i]->next=NULL;                       
        cout << "End of iteration" <<endl;
    }//End of radix sort loop
}

int main(){
    int testcases,i,input;
    cin >> testcases;
    int list[testcases];
    int *ptr=&list[0];
    for(i=0;i<testcases;i++){
        cin>>list[i];
    }

    radixSort(ptr,testcases);
    return 0;
}

questionAnswers(3)

yourAnswerToTheQuestion