この問題(http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_C&lang=jp#)に対して以下のように解答し、入力例にある通り
7
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5
を入力すると、最後の「delete 5」だけ読み込まれずにscanfを一回受け付けるようになってしまいます。
また入力の際にまとめて貼り付けのではなく、
7→エンター→insert 5→エンター ・・・・
と入力すれば逆に最後のall_printfが機能しなくなります。
ソースコードを見返しても理由がわからないのですが、理由を教えて頂くことは可能でしょうか?
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node{ int key; struct node *next; struct node *before; }node; node *home=NULL; void insert(int x){ node *new=calloc(1, sizeof(node)); if(home == NULL){ home=new; new->key=x; new->before=NULL; new->next=NULL; } node *old_home=home; home=new; old_home->before=new; new->next=old_home; new->key=x; new->before=NULL; } void deleteFirst(){ node * old=home; if(home->next ==NULL)home=NULL; home=home->next; home->before=NULL; free(old); } void deleteLast(){ node *last; node *next; while((next->next) !=NULL){ next=next->next; } last=next; if(next->before ==NULL)home=NULL; (next->before)->next=NULL; free(last); } void delete(int x) { node *next; if (home == NULL) return; next = home; while (next != NULL) { if ((next->key) == x) { if (next == home) { deleteFirst(); return; } else if ((next->next) == NULL) { deleteLast(); return; } else { (next->before)->next = next->next; free(next); return; } } next = next->next; } return; } void all_printf() { node *next; while(next !=NULL){ int x=next->key; printf("%d ",x); next=next->next; } /*ここより上は処理なので参考までに載せています*/ } int main(){ int i,m,n; char order[13]; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%s",order); if(strcmp(order,"insert")==0){ scanf(" %d",&m); insert(m); }else if (strcmp(order,"delete")==0){ scanf(" %d",&m); delete(m); }else if (strcmp(order,"deleteFirst")==0){ deleteFirst(); }else if (strcmp(order,"deleteLast")==0){ deleteLast(); } } all_printf(); return 0; }