考研联系第三题
问题:在一个递增有序的单链表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,试表中不再有重复元素,例如(7,10,10,21,30,42,42,42,51,70)将变化为(7,10,21,30,42,51,70).
算法思想:由于是有序表,所有相同值域的结点都是相邻的。用p扫描递增单链表L,若*p结点的值域等于其后继结点的值域,则删除后者,否则p移向下一个结点。
代码如下:
void Del_Same(LinkList &L){
//L是递增有序的单链表,本算法删除表中数值相同的元素
LNode *p=L->next ,*q; //p为扫描工作指针
if(p==NULL)
return;
while(p->next!=NULL){
q=p->next; //q指向*p的后继结点
if(p->data==q->data){ //找到重复值的结点
p->next=q->next; //释放*q的结点
free(q); //释放相同元素值的结点
}
else
p=p->next;
}
}