コンパイルエラーは出ないのですが、アクセス違反が起こるなどうまく動きません。
標準入力から入力し、標準出力に出力するようにしています。
どこが悪いか教えていただけるとありがたいです。
お願いします。
#include <stdio.h>
#include <stdlib.h>
typedef struct _cards {
struct _cards *prev;
int start;
int end;
struct _cards *next;
} cards;
int main(void) {
/*情報変数*/
int syafflenum;
int howmanycards;
int p,q,r;
/*シャッフル用変数*/
int i;
cards* first; /*カードの最初*/
cards* points[6]; /*シャッフルするポイント*/
int s1,s2; /*シャッフルする位置*/
int currentnum; /*今何枚目のカードか*/
int nownum; /*今の束に何枚のカードがあるか*/
cards* currentcard; /*現在操作中のカード*/
/*シャッフルの境目*/
cards* s1last;
cards* s2first;
cards* s2last;
cards* s3first;
/*カードを数える*/
int count;
int flag;
int start;
int end;
/*情報の読み込み*/
scanf("%d",&howmanycards);
scanf("%d",&syafflenum);
scanf("%d %d %d",&p,&q,&r);
/*カードの準備*/
first=malloc(sizeof(cards));
first->prev=NULL;
first->start=1;
first->end=howmanycards;
first->next=NULL;
/*シャッフル*/
for(i=0;i<syafflenum;i++) {
/*どこをシャッフルするか*/
scanf("%d %d",&s1,&s2);
/*シャッフル位置の特定*/
currentnum=0;
currentcard=first;
/*シャッフルの一段目*/
while(currentcard!=NULL) {
nownum=currentcard->end-currentcard->start+1;
/*printf("d1-%d %d %d\n",currentnum,currentcard->end,currentcard->start);*/
if(currentnum+nownum>s1) {
s1last=malloc(sizeof(cards));
s1last->prev=currentcard->prev;
s1last->start=currentcard->start;
s1last->end=currentcard->start+(currentnum+nownum-s1-2);
s2first=malloc(sizeof(cards));
s2first->prev=s1last;
s2first->start=currentcard->start+(currentnum+nownum-s1-1);
s2first->end=currentcard->end;
s2first->next=currentcard->next;
s1last->next=s2first;
if(s2first!=NULL)currentcard=s2first;
currentnum+=nownum-s1;
break;
} else if(currentnum+nownum==s1) {
/*printf("a1-%d %d\n",currentnum,nownum);*/
s1last=currentcard;
s2first=currentcard->next;
currentnum+=nownum;
if(s2first!=NULL)currentcard=s2first;
break;
}
currentnum+=nownum;
if(currentcard->next!=NULL)currentcard=currentcard->next;
else break;
}
/*シャッフルの二段目*/
while(currentcard!=NULL) {
nownum=currentcard->end-currentcard->start+1;
/*printf("d2-%d %d %d\n",currentnum,currentcard->end,currentcard->start);*/
if(currentnum+nownum>s2) {
s2last=malloc(sizeof(cards));
s2last->prev=currentcard->prev;
s2last->start=currentcard->start;
s2last->end=currentcard->start+(currentnum+nownum-s2-2);
s3first=malloc(sizeof(cards));
s3first->prev=s1last;
s3first->start=currentcard->start+(currentnum+nownum-s2-1);
s3first->end=currentcard->end;
s3first->next=currentcard->next;
s2last->next=s3first;
if(s3first!=NULL)currentcard=s3first;
currentnum+=nownum-s2;
break;
} else if(currentnum+nownum==s2) {
/*printf("a2-%d %d\n",currentnum,nownum);*/
s2last=currentcard;
s3first=currentcard->next;
currentnum+=nownum;
if(s3first!=NULL)currentcard=s3first;
break;
}
currentnum+=nownum;
if(currentcard->next!=NULL)currentcard=currentcard->next;
else break;
}
/*最後を特定する*/
while(currentcard!=NULL && currentcard->next!=NULL) {
currentcard=currentcard->next;
}
/*シャッフル*/
points[0]=first;
points[1]=s1last;
points[2]=s2first;
points[3]=s2last;
points[4]=s3first;
points[5]=currentcard;
/*for(count=0;count<6;count++)printf("%p\n",points[count]);*/
first=points[4];
s1last=points[5];
/*s2first=points[2];
s2last=points[3];*/
s3first=points[0];
currentcard=points[1];
first->prev=NULL;
s1last->next=s2first;
s2first->prev=s1last;
s2last->next=s3first;
s3first->prev=s2last;
currentcard->next=NULL;
}
/*条件に合うカードを数える*/
count=0;
flag=0;
currentnum=0;
currentcard=first;
/*printf("a%p\n",currentcard);*/
while(currentcard!=NULL) {
/*printf("c:%d %d\n",currentcard->start,currentcard->end);*/
/*for(i=currentcard->start;i<=currentcard->end;i++)printf("card:%d\n",i);*/
nownum=currentcard->end-currentcard->start+1;
if(flag==0) {/*最初~p*/
if(currentnum+nownum>=p) {
start=currentcard->start+p-currentnum-1;
if(currentcard->end<=r)count+=currentcard->end-start+1;
else if(start<=r)count+=r-start+1;
flag=1;
}
} else if(flag==1) {/*p~q*/
if(currentnum+nownum>q) {
end=currentcard->end-(currentnum+nownum-q);
if(end<=r)count+=end-currentcard->start+1;
else if(currentcard->start<=r)
count+=r-currentcard->start+1;
flag=2;
} else {
if(currentcard->end<=r)
count+=currentcard->end-currentcard->start+1;
else if(currentcard->start<=r)
count+=r-currentcard->start+1;
}
}
currentnum+=nownum;
currentcard=currentcard->next;
}
/*結果の出力*/
printf("%d\n",count);
/*メモリ解放*/
while(first!=NULL) {
currentcard=first->next;
free(first);
first=currentcard;
}
return 0;
}