注:为什么要定义LA为指针的指针?
答:因为最后需要把结果存储在A中,
若定义为与LB同样的类型,赋值给pa,当删除pa所指向的第一个A集合中的值时,虽然pa指向的位置改变指向下一个位置。
但是LA指向的还是原来的地址。这是错误的。
如果使用指针的指针,发生上述情况时,LA指向的是第一个元素的地址,而第一个元素的地址随着pa的改变而改变,
因此LA还是指向新的第一个元素的地址。这是正确的。
#include<stdio.h>
struct node
{
int elem;
struct node* next;
};
void difference(node** LA,node* LB) //LA为指向集合A的指针的指针
{
node*pa,*pb,*pre,*q;
pre=NULL;
pa=*LA; //解引用操作,pa指向A集合的第一个元素位置
while(pa)
{
pb=LB; //pb指向集合B的第一个元素
while(pb && pa->elem!=pb->elem) //在链表B中寻找与pa所指元素相等的节点
pb=pb->next;
if(pb) //在B中找到了与pa所指元素相等的结点
{
if(!pre) //pa所指元素与B中元素相等的是现在A中的第一个元素
*LA=pa->next; //删除A中第一个元素
else //pa所指元素与B中元素相等的不是现在A中的第一个元素
pre->next=pa->next;
q=pa; //无论是上面哪种情况都要删除pa节点
pa=pa->next;
free(q);
}
else //在B中没找到与pa所指元素相等的结点
{
pre=pa; //不删除pa所指向的A集合中的结点。
pa=pa->next;
}
}
}