[说明] 已知包含头节点(不存储元素)的单链表的元素已经按照非递减方式排序,函数compress(NODE *head)的功能是去掉其中重复的元素,使得链表中的元素互不相同。 处理过程中,当元素重复出现时,保留元素第一次出现所在的节点。

admin2012-04-11  71

问题 [说明]
   已知包含头节点(不存储元素)的单链表的元素已经按照非递减方式排序,函数compress(NODE *head)的功能是去掉其中重复的元素,使得链表中的元素互不相同。
   处理过程中,当元素重复出现时,保留元素第一次出现所在的节点。
   图8-29(a)、(b)是经函数compress(    )处理前后的链表结构示例图。

  链表的节点类型定义如下:
   typedef struct Node {
     int data;
     struct Node *next;
   }NODE;
   [C语言函数]
   void compress(NODE *head)
   {
     NODE *ptr, *q;
     ptr=  (1)  ;     /*取得第一个元素节点的指针*/
     while(  (2)   && ptr->next)  {
       q=ptr ->next;
       while(q &&  (3)  ){/*处理重复元素*/
           (4)  =q ->next;
         free(q);
         q=ptr->next;
       }
         (5)  =ptr->next;
     }    /*end of while*/
   }    /*end of compress*/

选项

答案head>next ptr ptr->data==q->data或其等价形式 ptr->next ptr

解析 本题考查的是对链表的查找、插入和删除等运算。要找到重复的元素并将其删除而使各元素互不相同。我们可以顺序遍历链表,比较逻辑上相邻的两个元素是否相同,如果相同则删除后一个元素,以此类推。代码如下:
   VOid Compress(NODE *head)
   {
     NODE *ptr, *q;
     ptr=head->next;     /*取得第一个元素节点的指针*/
     while(ptr && ptr->next)  {
       q=ptr->next;
       while(q && ptr->data==q>data)  {    /*处理重复元素*/
          ptr->next=q->next;
          free(q);
          q=ptr->next;
       }
       ptr=ptr->next;
     }    /*end of while*/
   }    /*end of compress*/
转载请注明原文地址:https://kaotiyun.com/show/UEVZ777K
0

最新回复(0)