#include #include #include #define Q(name,n,typ) \ typ Q##name[(n)+1]; \ int Q##name##Tail=0,Q##name##Head=0; \ int Qempty##name() \ { return Q##name##Tail==Q##name##Head; } \ \ int Qenqueue##name(typ x) \ { \ Q##name[Q##name##Tail++]=x; \ if (Q##name##Tail==(n)+1) \ { \ printf("Qenqueue%s error\n",#name); \ Q##name##Tail=0; \ } \ if (Qempty##name()) \ exit(0); \ } \ \ typ Qdequeue##name() \ { \ typ temp; \ if (Qempty##name()) \ { \ printf("Qdequeue%s error\n",#name); \ exit(0); \ } \ temp=Q##name[Q##name##Head++]; \ if (Q##name##Head==(n)+1) \ Q##name##Head=0; \ return temp; \ } Q(TenInts,10,int) Q(HundredDoubles,100,double) typedef struct { char name[50]; int age; float gpa; } person; Q(FiftyPersons,50,person) Q(TenVoidPtrs,10,void*) main() { int i,*k; person p,*q; for (i=0;i<10;i++) QenqueueTenInts(i); for (i=0;i<10;i++) if (i!=QdequeueTenInts()) exit(0); if (QemptyTenInts()) printf("TenInts works\n"); for (i=0;i<100;i++) QenqueueHundredDoubles(i); for (i=0;i<100;i++) if (i!=QdequeueHundredDoubles()) exit(0); if (QemptyHundredDoubles()) printf("HundredDoubles works\n"); strcpy(p.name,"Joe"); p.gpa=3.3; for (i=0;i<50;i++) { p.age=i; QenqueueFiftyPersons(p); } for (i=0;i<50;i++) { p=QdequeueFiftyPersons(); if (p.age!=i) exit(0); } if (QemptyFiftyPersons()) printf("FiftyPersons works\n"); for (i=0;i<5;i++) { k=(int*)malloc(sizeof(int)); (*k)=i; QenqueueTenVoidPtrs((void*) k); } for (i=0;i<5;i++) { q=(person*)malloc(sizeof(person)); strcpy(q->name,"Alice"); q->gpa=i; q->age=i; QenqueueTenVoidPtrs((void*) q); } for (i=0;i<5;i++) if (*(int*)QdequeueTenVoidPtrs()!=i) exit(0); for (i=0;i<5;i++) { q=(person*)QdequeueTenVoidPtrs(); if (strcmp(q->name,"Alice") || q->gpa!=i || q->gpa!=i) exit(0); } if (QemptyTenVoidPtrs()) printf("TenVoidPtrs works\n"); }