已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
可以利用循环的思想,创造出一个笛卡尔积的效果。当链表1中的每个节点,对应到链表2的每个节点进行寻找,找到数值相同的,则释放当前链表1的节点,并指向下一个节点。
#include<iostream>
#include<stdlib.h>
#include<assert.h>
using namespace std;
struct node
{
int elem;
node* next;
node(int x = 0)
:elem(x)
, next(NULL)
{}
};
node* Create(int *data,size_t size)
{
assert(data);
node* head = new node(data[0]);
int i = 1;
node* pnode = NULL;
node* ptemp = head;
for (i; i < size;i++)
{
pnode = new node(data[i]);
ptemp->next = pnode;
ptemp = pnode;
}
return head;
}
void print(node *l)
{
assert(l);
while (l)
{
cout << l->elem << " ";
l = l->next;
}
cout << endl;
}
void difference(node** LA, node* LB)
{
node* pa = *LA;
node* pb = LB;
node* pre = NULL;
node* temp = NULL;
while (pa)
{
pb = LB;//保证每次从LB的第一个节点找起
while (pb&&pb->elem != pa->elem)//寻找PB中和PA相同的元素
pb = pb->next;
if (pb)//找到了
{
if (NULL == pre)//PA是头结点
*LA = pa->next;
else
{
pre->next = pa->next;//连接前后节点
}
temp = pa;
pa = pa->next;
free(temp);
}
else//没找到PA中的当前节点,继续寻找PA的下一个节点
{
pre = pa;
pa = pa->next;
}
}
}
int main()
{
int A[] = { 5, 10, 20, 15, 25, 30 };
int B[] = { 5, 15, 35, 25 };
int size1 = sizeof(A) / sizeof(A[0]);
int size2 = sizeof(B) / sizeof(B[0]);
node* L1 = Create(A,size1);
node* L2 = Create(B,size2);
print(L1);
print(L2);
difference(&L1,L2);
print(L1);
system("pause");
return 0;
}