Pagini recente » Cod sursa (job #772039) | Cod sursa (job #3205863) | Cod sursa (job #2605972) | Cod sursa (job #2030422) | Cod sursa (job #43171)
Cod sursa(job #43171)
#include<stdio.h>
#include<stdlib.h>
#define NMAX 30000;
struct elem
{
int id;
elem* prev;
elem* next;
};
int main(void)
{
FILE *f;
int n;
int i,x;
int cursor;
elem* prim;
elem* e1;
elem* e2;
elem* curent;
int directie;
f=fopen("schi.in","rt");
fscanf(f,"%d",&n);
//stim ca primul care vine va fi mereu primul
prim=(elem*) calloc(1,sizeof(elem));
prim->id=1;
prim->next=NULL;
prim->prev=NULL;
cursor=1;
curent=prim;
fscanf(f,"%d",&x);
for(i=2;i<=n;i++)
{
fscanf(f,"%d",&x);
//muta cursorul pe pozitia x si insereaza valoarea i in fata cursorului
if(cursor>x) directie=-1; else directie=+1;
if(x==i) //insereaza la sfarsitul listei
{
while(cursor!=x-1) //avanseaza pana la pozitia i-1 in lista
{
cursor+=1;
curent=curent->next;
}
e1=(elem*) calloc(1,sizeof(elem));
e1->id=x;
e1->next=NULL;
e1->prev=curent;
curent->next=e1;
}
else //insereaza la o pozitie anume
{
while(cursor!=x)
{
cursor+=directie;
if(directie==-1)
curent=curent->prev;
else
curent=curent->next;
}
//insereaza un nou element
e1=(elem*) calloc(1,sizeof(elem));
e1->id=i;
e1->next=NULL;
e1->prev=NULL;
if(curent->prev!=NULL)
{
(curent->prev)->next=e1;
e1->prev=curent->prev;
}
e1->next=curent;
curent->prev=e1;
cursor+=1;
}
}
fclose(f);
//afiseaza
//aduce cursorul la 0
while(curent->prev!=NULL)
curent=curent->prev;
e1=curent;
f=fopen("schi.out","wt");
while(e1!=NULL)
{
fprintf(f,"%d\n",e1->id);
e1=e1->next;
}
fclose(f);
return 0;
}