已知集合A和B的元素分別用不含頭結點的單鏈表存儲,函數difference()用於求解集合A與B的差集,並將結果保存在集合A的單鏈表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成計算後A={10,20,30}。
鏈表結點的結構類型定義如下:
struct node
{
int elem;
node* next;
};
思路:
遍歷A的每一個結點,通過A來遍歷B中的每一個結點。
當pa爲空時結束總循環。
如果此時pa所指的結點與pb所指的結點元素相同,或者pb爲空時跳出內循環。
如果此時pb存在,則說明找到了,這時候就要刪除。
如果pb此時指向空了,則pa要向後走一步。
void difference(node** LA,node* LB)
{
if(LA == NULL || *LA == NULL || LB == NULL)
return ;
node* pa = *LA;
node* pb = *LB;
node* del = NULL;
node* pre = NULL;
//退出循環兩個條件,pa爲空
while(pa)
{
//pb每一次都要從頭開始找
pb = LB;
while(pb && pb -> elem != pa -> elem)
pb = pb -> next;
//如果這裏pb還存在也就是說滿足pa,pb兩個值相同
if(pb)
{
//如果pre爲空
if(pre == NULL)
*LA = pa -> next;
else
pre -> next = pa -> next;
del = pa;
pa = pa -> next;
free(del);
}
else
{
pre = pa;
pa = pa -> next;
}
}
}