题库 题库

【简答题】

试题三
阅读下列函数说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[函数3说明]
  函数ELEM *proc(FILE *fp)从文件fp中逐个读入职工的工号及其完成的产品数量,对相同工号的产品数量计入该职工完成的产品总数,并且按照产品总数降序排列,若多个职工完成的产品总数相同,则按工号升序排列。函数中建立了一个有序链表,来存储每个职工的工号和完成产品总数等数据,其结点类型为:
typedef struct ELE{
 int no; /*职工工号*/
 int num; /*完成的产品总数*/
 struct ELE *next;
}ELEM;

[函数3]
ELEM *proc(FILE *fp)
{
 int m,n;
 ELEM *u,*v,*p,*base;
 base = NULL; /*base是链表的首指针*/
 while(fscanf(fp,"%d%d",&n,&m) == 2){
  /*链表中是否存在工号为n的结点*/
  for(v = base;v != NULL && v->no != n; __(1)___);
  if(v != NULL) {/*若链表中已有工号为n的结点v,则将其从链表中脱钩*/
   if(__(2)__ base = v->next;
   else u->next = v->next;
   v->num += m; /*累加工号为n的职工完成的产品数量*/
  }
  else { /*创建一个工号为n的结点*/
   v = (ELEM *)malloc(sizeof(ELEM));
   v->no = n; v->num = m;
  }
  /* 寻找结点v的插入位置*/
  p = base;
  while(p != NULL)
   if(v->num > p->num || v->num == p->num && ___(3)___) break;
   else {u = p; p = p->next; }
  /* 将结点v插入链表*/
  if(p == base) __(4)__;
  else u->next = v;
  __(5)__;
 }
 return base;
}

参考答案

(1) u = v,v = v->next 或 u = v,v = u->next
(2) v == base 或 base->no == n
(3) v->no < p->no 或 v->no <= p->no
(4) base = v
(5) v->next = p

相关试题