列表

详情


阅读以下说明和C函数,将应填入n处的语句或语句成分写在答题纸的对应栏内。
【说明】
已知单链表L含有头结点,且结点中的元素值以递增的方式排列。下面的函数DeleteList在L中查找所有值大于minK且小于maxK的元素,若找到,则逐个删除,同时释放被删结点的空间。若链表中不存在满足条件的元素,则返回-1,否则返回0。
例如,某单链表如图4-1所示。若令minK为20、maxK为50,则删除后的链表如图4-2所示。

图4-1

图4-2
链表结点类型定义如下:
typedef struct Node{
int data;
struct Node *next;
}Node, *LinkList;

【C函数】
int DeleteList (LinkList L, int minK, int maxK)
{  /*在含头结点的单链表L中删除大于minK且小于maxK的元素*/
     (1)   *q = L, *p = L->next;  /*p指向第一个元素节点*/
    int delTag = 0;
     while ( p )
       if  ( p->data <= minK )
       { q = p;  p =   (2)  ;  }
       else
     if ( p->data < maxK )  {  /*找到删除满足条件的节点*/
  q->next =   (3)  ;   free(p);  
p =   (4)  ;  delTag = 1;
    } 
    else  break;
   if (   (5)   )  return -1;
    return 0;
}

参考答案:

(1)Node
(2)p->next
(3)p->next
(4)q->next
(5)!delTag,或delTag==0,或delTag!=1

详细解析:

函数DeleteList(LinkList L,int mink,int maxK)的功能是在L在含头结点的单链表L中删除大于minK且小于maxK的元素,因此除了头指针L意外,至少还需要两个临时指针,一个用于遍历链表中的元素,另外一个用于删除结点时重新链接结点,p和q就起这样的作用。
空(1)处用于定义指针变量p和q,由于p和q之前已经有“*”,因此,应填入“Node”,若填入“LinkList”,则p和q为指向指针变量的指针变量,伺候对它们的使用方式就不正确了。
  由于链表中的元素已经按照顺序排列,所以在第一个大于minK的元素之前都可以令指针一直沿着指针链后移,即“q=p; p=p->next”,直到p指向第一个大于minK的元素结点为止,在此过程中,q始终指向p所指结点的前驱。因此,空(2)处应填入“p->next”.

上一题