最近再刷数据结构时写了一个单链表排序算法,这个算法中要注意的点是,不能把第二个while中的两个条件位置颠倒。如果把这两个条件位置颠倒了,即while(p->data==q->data&&q!=NULL),从表面上看逻辑和while(q!=NULL&&p->data==q->data)是一样的,但是实际上不一样。如果条件颠倒为while(p->data==q->data&&q!=NULL),在q为NULL时,编译器从左向右判断,既然q为NULL,那就没有q->data了,并且编译器不再判断第二个条件,所以编译器引发内存错误。
void DeleteRepeated(LinkList L)
{
Node*p,*q;
p=L->next;
while(p)
{
q=p->next;
while(q!=NULL&&p->data==q->data)//两个条件不可颠倒!
{
p->next=q->next;
free(q);
q=p->next;
}
p=p->next;
}
}