Cod sursa(job #1256466)

Utilizator TeodorescuVladTeodorescu Vlad TeodorescuVlad Data 6 noiembrie 2014 12:44:23
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.84 kb
#include<fstream>
using namespace std;
ifstream f ("radixsort.in");
ofstream g ("radixsort.out");

struct nod
{
    int nr;
    nod *adr;
};

int N,A,B,C;
nod *prim, *ultim, *primu, *Ci[10], *Cf[10];

void push(int x, int cif)
{
    nod *nou, *u;
    if(Ci[cif]==NULL)
    {
        Ci[cif] = new nod;
        Ci[cif]->nr=x;
        Ci[cif]->adr = NULL;
        Cf[cif]= Ci[cif];
    }
    else
    {
        nou = new nod;
        nou->nr= x;
        Cf[cif]->adr=nou;
        Cf[cif]=nou;
        Cf[cif]->adr= NULL;
    }
}

void pop(int cif)
{
    nod *p, *nou;

    while(Ci[cif] != NULL)
    {
        if(prim==NULL)
           {
                prim =new nod;
                prim->nr=Ci[cif]->nr;
                prim->adr=NULL;
                ultim=prim;
           }
        else
        {
            nou =new nod;
                nou->nr=Ci[cif]->nr;
                ultim->adr=nou;
                ultim=nou;
                nou->adr=NULL;
        }
        p=Ci[cif];
        Ci[cif]=Ci[cif]->adr;
        delete p;
    }
}

void citire()
{
    int x;
    nod *nou;
    f>>N>>A>>B>>C;
    while(N)
    {
        if(prim==NULL)
           {
                prim =new nod;
                prim->nr=B;
                prim->adr=NULL;
                ultim=prim;
           }
        else
        {
            nou =new nod;
                nou->nr=(A*x+B)%C;
                ultim->adr=nou;
                ultim=nou;
                nou->adr=NULL;
        }
        N--;
        x=ultim->nr;
    }
}

void copie()
{
    nod *nou, *p, *ultimu;
    p=prim;
    primu=NULL;
    while(p)
    {
    if(primu==NULL)
        {
            primu =new nod;
            primu->nr=p->nr;
            primu->adr=NULL;
            ultimu=primu;
        }
    else
        {
            nou =new nod;
            nou->nr=p->nr;
            ultimu->adr=nou;
            ultimu=nou;
            nou->adr=NULL;
        }
        p=p->adr;
    }
}

void afis_provizoriu()
{
   nod *p;
    p=primu;
    while(p)
    {
        g<<p->nr<<" ";
        for(int i=1;i<=10;i++)
            p = p ->adr;
    }
}

void rezolva()
{
    int cif, pu=1, ok;
    nod *p, *nou, *k;
    citire();
    do
    {
        ok=0;
        copie();
        while(prim != NULL)
        {
            cif=((prim->nr)/pu)%10;
            if(prim->nr/pu !=0)
                ok=1;
            push(prim->nr, cif);
            p=prim;
            prim = prim ->adr;
       delete p;
        }

        if(pu==1000)
        {
            pu++;
            pu--;
        }
        if(ok)
        {
            for(cif =0; cif<=9;cif++)
            pop(cif);

        }
        pu=pu*10;
    }
    while(ok);
}


int main ()
{
    rezolva();
    afis_provizoriu();
    return 0;
}