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

链表的结点类型定义如下。
typedef struct Node
int data;
struct Node *next;
NODE;
[C语言函数]
void compress (NODE *head)
NODE *ptr, *q, *s,*t;
ptr = head -> next;/* 取得第一个元素结点的指针*/
while (ptr && (1) )
q = ptr -> next;
while(q && (2) )/*处理重复元素*/
q = q -> next;
s = (3) ;
ptr -> next = q; /* 保留重复序列的第一个结点,将其余结点从链表中删除*/
while( s && (4) )/* 逐个释放被删除结点的空间*/
t = s-> next; free(s) ; s = t;
(5) = ptr -> next;
/* end of while */
/* end of compress */