填空题[说明] 某超市集团为发展业务向社会公开招聘N个工种的工作人员,每个工种各有不同的编号(1~M)和计划招聘人数。每位应聘者需申报两个工种,并参加集团组织的考试。该集团公司将按应聘者的成绩从高分至低分的顺序进行排队录取。具体录取原则是:从高分到低分依次对每位应聘者先按其第一志愿录取;当不能按其第一志愿录取时,便将他的成绩扣去5分后,重新排队,并按其第二志愿考虑录取。 以下C程序为输出各工种实际招聘的应聘人员,每个工种都保留一个录取者的有序队列。录取处理循环直至招聘额满或已对全部应聘者都做了录取处理后跳出。 在C程序中,类型STU包含有应聘者的基本信息:编号、成绩、志愿、排队成绩和录取志愿号。数组rz[]的每个元素对应一个工种,包含计划招聘人数和已录取的人数。 [C程序代码] #include #define N 36 #define EDMARK 5 typedef struct stu int no, total, z[2], sortm, zi; struct stu *next; STU; struct rznode int lmt , count; STU *next; rz [N] ; STU *head = NULL, *over = NULL; int all FILE *fp; char dataf [ ] = "zp2008.dat"; print (STU *p) for (;p!=NULL; p = p->next) printf("%d(%d)/t", p->no, p->total) ;
insert(STU **p, STU *u) STU *v, *q; for (q = *p;q != NULL; v = q , (1) ) if ( q-> sortm < u->sortm) break; if ( q == *p) (2) ; else (3) ; u->next = q ;
main ( ) int zn, i, no, total, z1, z2 ; STU *p, *v, *q; fp = fopen (dataf, "r") ; if (fp == NULL) printf ("Can't open file %s./n",dataf); exit (0) ;
fscanf (fp,"%d",&zn) ; for (all = 0, i = i; i <= zn; i++) fscanf (fp, "%d", &rz [ i ].imt ); rz [i] .count = 0; rz[i] .next = NULL; all += (4) ;
for (;;) if ((fscanf(fp,"%d%d%d%d",&no,&total,&z1,&z2)) != 4 ) break; p = ( STU *) malloc (sizeof (STU)) ; p->no = no; p->total = p->sortm = total; p->zi = 0; p->z[0] : z1; p->z[1] = z2; (5) ;
fclose (fp); for (;all && head != NULL;) p = head; head = head->next; if (rz[p->z[p->zi]].count < (6) ) rz[p->z[p->zi]].count ++; insert( &rz[p->z[p->zi]].next,p); all--; continue;
if (p->zi >= 1 ) p->next = over; over = p; continue;
p->sortm -= DEMARK; (7) ; insert( &head, p);
for ( i = 1; i <= zn; i++ ) printf("%d:/n",i); print( rz[i ].next); printf("/n");