2つのチェーンテーブルAとBは、それぞれ2つのセットを表し、その要素がインクリメント配列されていることが知られている.アルゴリズムを設計して2つの集合AとBの差集合(すなわち、Aにのみ現れ、Bには現れない要素のみからなる集合)を求め、同じ形式で格納し、その集合の要素個数を返してください.

1543 ワード

2つのチェーンテーブルAとBは、それぞれ2つのセットを表し、その要素がインクリメント配列されていることが知られている.アルゴリズムを設計して2つの集合AとBの差集合(すなわち、Aにのみ現れ、Bには現れない要素のみからなる集合)を求め、同じ形式で格納し、その集合の要素個数を返してください.
コードは次のとおりです.
#include 
using namespace std;
struct LinkNode
{
	int data;
	LinkNode* next;
};
LinkNode* minus_LinkList(LinkNode* A, LinkNode* B)
{
	LinkNode* finalA = A;
	LinkNode* tempA = A->next;
	LinkNode* tempB = B->next;
	while (tempA && tempB)
	{
		if (tempB->data == tempA->data)
		{
			tempA=tempA->next;
			A->next = tempA;
		}
		else if (tempB->data < tempA->data)
		{
			tempB = tempB->next;
			B = B->next;
		}
		else
		{
			tempA = tempA->next;
			A = A->next;
		}
	}
	return finalA;
}
void print_LinkList(LinkNode* finalA)
{
	while (finalA->next)
	{
		cout << finalA->next->data << " ";
		finalA=finalA->next;
	}
}
LinkNode* Create_LinkList(int* arr,int len)
{
	LinkNode* temp = new LinkNode();
	temp->next = NULL;
	LinkNode* head = temp;
	for (int i = 0; i < len; ++i)
	{
		LinkNode* newN = new LinkNode();
		newN->data = arr[i];
		newN->next = NULL;
		temp->next=newN;
		temp = temp->next;
	}
	return head;
}
int main()
{
	int arrA[] = { 1, 3, 5, 7 };
	int arrB[] = { 2, 3, 4, 5,6,8 };
	LinkNode* A = Create_LinkList(arrA, sizeof(arrA) / sizeof(int));
	LinkNode* B = Create_LinkList(arrB, sizeof(arrB) / sizeof(int));
	LinkNode* finalA = minus_LinkList(A, B);
	//print_LinkList(A);
	//print_LinkList(B);
	print_LinkList(finalA);
}