阅读下列函数说明、图和C代码,将应填入(n)处的字句写在对应栏内。 【说明】 当一元多项式aixi中有许多系数为零时,可用一个单链表来存储,每个节点存储一个非零项的指数和对应系数。 为了便于进行运算,用带头节点的单链表存储,头节点中存储多

admin2009-02-15  31

问题 阅读下列函数说明、图和C代码,将应填入(n)处的字句写在对应栏内。
   【说明】
   当一元多项式aixi中有许多系数为零时,可用一个单链表来存储,每个节点存储一个非零项的指数和对应系数。
   为了便于进行运算,用带头节点的单链表存储,头节点中存储多项式中的非零项数,且各节点按指数递减顺序存储。例如:多项式8x5-2x2+7的存储结构为:
   
   函数中使用的预定义符号如下:
   #define EPSI le-6
   struct Node(                   /*多项式中的一项*/
          double c;               /*系数*/
          int e;                  /*指数*/
          struct Node *next;
   };
   typedef struct{                /*多项式头节点*/
         int n;                   /*多项式不为零的项数*/
         struct Node *head;
   }POLY;
   【函数】
   void Del(POLY *C, struct Node *p)
   /*若p是空指针则删除头节点,否则删除p节点的后继*/
   {
        struct Node *t;
        /*C是空指针或C没有节点*/
        if(C==NULL||C->head==NULL)return;
        if((1)){/*删除头节点*/
                t=C->head;
                C->head=t->next;
                return;
        }/*if*/
        t=p->next;
        p->next=t->next;
   };/*Del*/
   void Insert(POLY *C, struct Node *pC)
   /*将pC节点按指数降序插入到多项式C中*/
   /*若C中存在pC对应的指数项,则将系数相加;若其结果为零,则删除该节点*/
        {
           struct Node *t, *tp;
           /*pC为空指针或其系数近似为零*/
           if(pC==NULL || fabs(pC->c) < EPSI)return;
                if(C->head==NULL){ /*若C为空, 作为头节点插入*/
                C->head=pC;
                pC->next=NULL;
                C->n++;
                return;
           }/*if*/
           /*若pC的指数比头节点的还大, 插入到头节点之前*/
           if(pC->e>C->head->e){
                   (2);
                 C->head=pC;
                 C->n++;
                 return;
           }/*if*/
             (3);
           t=C->head;
           while(t!=NULL){
                 if(t->e>pC->e){
                       tp=t;
                       t=t->next;
                 }
                 else if(t->e==pC->e){/*C中已经存在该幂次项*/
                       t->c+=pC->c;/*系数相加*/
                       if(fabs(t->c)<EPSI){/*系数之和为零*/
                               (4);/*删除对应节点*/
                             C->n--;
                       }
                         (5);
           }
           else t=NULL;/*C中已经不存在该幂次项*/
       }/*while*/
       if(t==NULL){/*适当位置插入*/
            pC->next=tp->next;
            tp->next=pC;
            C->n++;
       }/*if*/
   };/*Insert*/

选项

答案(1) p==NULL (2) pC->next=C->head->next (3) tp=NULL (4) Del(C, tp) (5) break

解析 根据注释,Del函数当p是空指针时,删除头节点,因此易知(1)空应填p==NULL。
   (2)空是插入头节点的特殊情况,应填pC->next=C->head->next。
   由注释可知空(4)是删除操作,需调用Del函数,进一步确定实参。此处需要删除节点t,结合Del函数的说明,实参p需要空指针(NULL)或t节点的前驱指针,由if(t->e>pC->e){tp =t;t=t->next;}可知,tp正是t节点的前驱指针,因此应填Del(C,tp)。由此也可以确定空(3),当需要删除头节点时,tp应是空指针,因此空(3)应填tp=NULL。
   至于空(5),应填break。此时,节点p已正确处理完毕,应该结束while循环,而且必须终止,否则while循环结束后t值为NULL,将会错误地执行插入操作。
转载请注明原文地址:https://jikaoti.com/ti/72i7FFFM
0

相关试题推荐
最新回复(0)