已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<iostream>
#include <assert.h>
using namespace std;
struct Node
{
int elem;
Node* next;
};
void PushBack(Node**LA, int data)
{
assert(LA);
Node* temp = new Node;
temp->elem = data;
temp->next = NULL;
if ((*LA) == NULL)
{
*LA = temp;
}
else
{
Node* pCur = *LA;
while (pCur->next)
{
pCur = pCur->next;
}
pCur->next = temp;
}
}
void Difference(Node** LA , Node* LB)
{
Node *pre, *pa, *pb, *q;
pre = NULL; //
pa = *LA; //指向A集合元素
while (pa)
{
pb = LB; //指向B集合的元素
while (pb && pa->elem!=pb->elem) //直到B集合元素和pa指向元素相等或者B集合遍历完
{
pb = pb->next;
}
if (pb) //找到相同的元素
{
if (pre == NULL) //A集合第一个元素需要删除
*LA = (*LA)->next;
else
pre->next = pa->next;
q = pa;
pa = pa->next;
free(q);
}
else
{
pre = pa;
pa = pa->next;
}
}
}