2つの秩序あるチェーンテーブルの交差と差セットを求めます

1812 ワード

typedef struct ListNode
{
	DataType data;
	ListNode* next;
}ListNode;
//  (  :list1 list2    2 4,        )
ListNode* Intersection(ListNode* plist1, ListNode* plist2)		
{
	//     
	if(plist1 == NULL || plist2 == NULL)
	{
		return NULL;
	}

	//   (     )
	ListNode* newlist = BuyNode(0);
	ListNode* tail = newlist;
	
	//      ,  tail,      
	while(plist1 && plist2)
	{
		if(plist1->data == plist2->data)
		{
			tail->next = plist1;
			tail = plist1;
			plist1 = plist1->next;
			plist2 = plist2->next;
		}
		else if(plist1->data < plist2->data)
		{
			plist1 = plist1->next;
		}
		else
		{
			plist2 = plist2->next;
		}
	}
	tail->next = NULL;	//  tail->next   
	return newlist->next;
}
//  
ListNode* DifSet(ListNode* plist1, ListNode* plist2)
{
	//     
	if(plist1 == NULL || plist2 == NULL)
	{
		return NULL;
	}
	
	//   (     )
	ListNode* newlist = BuyNode(0);
	ListNode* tail = newlist;

	while(plist1 && plist2)
	{
		//     
		if(plist1->data == plist2->data)
		{
			plist1 = plist1->next;
			plist2 = plist2->next;
		}
		else if(plist1->data < plist2->data)
		{
			tail->next = plist1;
			tail = plist1;
			plist1 = plist1->next;
		}
		else
		{
			tail->next = plist2;
			tail = plist2;
			plist2 = plist2->next;
		}
	}

	if(plist1)
	{
		tail->next = plist1;
	}
	else
	{
		tail->next = plist2;
	}

	return newlist->next;
}