题目详情:已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
void difference(node** LA, node* LB)
链表结点的结构类型定义如下:
struct node
{
int elem;
node* next;
node(int val)
:elem(val)
, next(NULL)
{}
};
void difference(node** LA, node* LB)
思路分析:
用A中的数据去B中寻找,如果有则直接跳至下一个节点,如果没有则用一个新节点去记录他并且同时删除B中数据。
实现代码:
void difference(node** LA, node* LB)
{
assert(*LA);
assert(LB);
node* head = NULL;
node* begin = NULL;
node* node1 = *LA;
node* p2 = LB;
while (node1 != NULL)
{
int flag = 0;
node* prev2 = NULL;
node* node2 = p2;
while (node2 != NULL)
{
if (node1->elem == node2->elem)
{
flag = 1;
(prev2 == NULL) ? (p2 = node2->next) : (prev2->next = node2->next);//删除B中数据
break;
}
else
{
prev2 = node2;
node2 = node2->next;
continue;
}
}
if (flag == 0)
{
if (begin == NULL)
head = begin = node1;
else
{
begin->next = node1;
begin = begin->next;
}
}
node1 = node1->next;
}
*LA = head;
}