数据结构:求两个有序列表的交集,并集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haimianjie2012/article/details/83819904

1.求两个有序列表的交集

LNode* Intersection(LNode* La,LNode* Lb)
{
	if (La==NULL||Lb==NULL)
	{
		return NULL;
	}

	LNode *pCHead = NULL; //A与B交集头
	LNode *pCEnd = NULL;  //A与B交集尾
	//创建头结点
	pCHead = new LNode();	
	pCHead->next = NULL;
	pCEnd = pCHead;

	LNode *pA = La->next; //指向有序列表A第一个结点
	LNode *pB = Lb->next; //指向有序列表B第一个结点
	while (pA != NULL && pB != NULL)
	{
		if (pA->data == pB->data)
		{
			LNode *pNode = new LNode();
			pNode->data = pA->data;
			//插入新建结点
			pNode->next = pCEnd->next;
			pCEnd->next = pNode;
			pCEnd=pNode;
			//相等,同时后移
			pA = pA->next;
			pB = pB->next;
		}
		else if (pA->data > pB->data)
		{
			//最小的相比,B小 B后移
			pB = pB->next;
		}
		else
		{
			//最小的相比,A小 A后移
			pA = pA->next;
		}
	}
	return pCHead;
}

测试交集

2求两个有序列表的并集

LNode* Union(LNode* La,LNode* Lb)
{
	if (La==NULL&&Lb==NULL)	
		return NULL;
	if(La==NULL&&Lb!=NULL)
		return Lb;
	if(La!=NULL&&Lb==NULL)
		return La;

	LNode *pCHead = NULL; //A与B交集头
	LNode *pCEnd = NULL;  //A与B交集尾
	//创建头结点
	pCHead = new LNode();	
	pCHead->next = NULL;
	pCEnd = pCHead;

	LNode *pA = La->next; //指向有序列表A第一个结点
	LNode *pB = Lb->next; //指向有序列表B第一个结点
	while (pA != NULL && pB != NULL)
	{
		int data;
		if (pA->data == pB->data)
		{
			data = pA->data;
			//相等,同时后移
			pA = pA->next;
			pB = pB->next;
		}
		else if (pA->data > pB->data)
		{
			data= pB->data;
			//最小的相比,B小 B后移
			pB = pB->next;
		}
		else
		{
			data = pA->data;
			//最小的相比,A小 A后移
			pA = pA->next;
		}

		LNode *pNode = new LNode();
		pNode->data = data;
		//插入新建结点
		pNode->next = pCEnd->next;
		pCEnd->next = pNode;
		pCEnd=pNode;
	}

	if (pB!=NULL)
	{
		pA=pB;
	}

	while (pA!=NULL)
	{
		LNode *pNode = new LNode();
		pNode->data = pA->data;
		//插入新建结点
		pNode->next = pCEnd->next;
		pCEnd->next = pNode;
		pCEnd=pNode;

		pA=pA->next;
	}
	return pCHead;
}

测试并集

源代码:

// 2011_4_LinkList.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>
typedef struct LNode
{
	int data;
	struct LNode* next;

}LNode,*LinkList;

LNode* Union(LNode* La,LNode* Lb)
{
	if (La==NULL&&Lb==NULL)	
		return NULL;
	if(La==NULL&&Lb!=NULL)
		return Lb;
	if(La!=NULL&&Lb==NULL)
		return La;

	LNode *pCHead = NULL; //A与B交集头
	LNode *pCEnd = NULL;  //A与B交集尾
	//创建头结点
	pCHead = new LNode();	
	pCHead->next = NULL;
	pCEnd = pCHead;

	LNode *pA = La->next; //指向有序列表A第一个结点
	LNode *pB = Lb->next; //指向有序列表B第一个结点
	while (pA != NULL && pB != NULL)
	{
		int data;
		if (pA->data == pB->data)
		{
			data = pA->data;
			//相等,同时后移
			pA = pA->next;
			pB = pB->next;
		}
		else if (pA->data > pB->data)
		{
			data= pB->data;
			//最小的相比,B小 B后移
			pB = pB->next;
		}
		else
		{
			data = pA->data;
			//最小的相比,A小 A后移
			pA = pA->next;
		}

		LNode *pNode = new LNode();
		pNode->data = data;
		//插入新建结点
		pNode->next = pCEnd->next;
		pCEnd->next = pNode;
		pCEnd=pNode;
	}

	if (pB!=NULL)
	{
		pA=pB;
	}

	while (pA!=NULL)
	{
		LNode *pNode = new LNode();
		pNode->data = pA->data;
		//插入新建结点
		pNode->next = pCEnd->next;
		pCEnd->next = pNode;
		pCEnd=pNode;

		pA=pA->next;
	}
	return pCHead;
}
LNode* Intersection(LNode* La,LNode* Lb)
{
	if (La==NULL||Lb==NULL)
	{
		return NULL;
	}

	LNode *pCHead = NULL; //A与B交集头
	LNode *pCEnd = NULL;  //A与B交集尾
	//创建头结点
	pCHead = new LNode();	
	pCHead->next = NULL;
	pCEnd = pCHead;

	LNode *pA = La->next; //指向有序列表A第一个结点
	LNode *pB = Lb->next; //指向有序列表B第一个结点
	while (pA != NULL && pB != NULL)
	{
		if (pA->data == pB->data)
		{
			LNode *pNode = new LNode();
			pNode->data = pA->data;
			//插入新建结点
			pNode->next = pCEnd->next;
			pCEnd->next = pNode;
			pCEnd=pNode;
			//相等,同时后移
			pA = pA->next;
			pB = pB->next;
		}
		else if (pA->data > pB->data)
		{
			//最小的相比,B小 B后移
			pB = pB->next;
		}
		else
		{
			//最小的相比,A小 A后移
			pA = pA->next;
		}
	}
	return pCHead;
}

//创建链表
LNode* Create( int a[], int len)
{
	LNode* L;
	//创建头结点
	L = (LNode*)malloc(sizeof(LNode));
	L->next = NULL;

	LNode *prior, *pcur;
	prior = L;
	for (int i =0; i < len; i++)
	{
		pcur = (LNode*)malloc(sizeof(LNode));
		pcur->data = a[i];		
		pcur->next = prior->next;
		prior->next = pcur;
		prior = pcur;
	}
	return L;
}
//打印链表
void Print(LNode* L)
{
	if (L==NULL)
	{
		return;
	}

	LNode* p;
	p = L->next;
	while (p != NULL)
	{
		printf("%d,\t", p->data);
		p = p->next;
	}
	//退出循环时,p==L
	printf("\n");
}
void TestIntersection()
{
	int a[] = { 1,2,3,4,5,7,9 };
	LNode* La=Create(a, 7);
	printf("*********La:**********\n");
	Print(La);
	int a1[] = { 1,3,4,6,7,10 };
	LNode* Lb=Create(a1, 6);
	printf("*********La:**********\n");
	Print(Lb);
	LNode* Lc=Intersection(La,Lb);
	printf("*********求intersetion后**********\n");
	Print(Lc);
	int aa = 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a[] = { 1,2,3,4,5,7,9 };
	LNode* La=Create(a, 7);
	printf("*********La:**********\n");
	Print(La);
	int a1[] = { 1,3,4,6,7,10 };
	LNode* Lb=Create(a1, 6);
	printf("*********La:**********\n");
	Print(Lb);
	LNode* Lc=Union(La,Lb);
	printf("*********求Union后**********\n");
	Print(Lc);
	int aa = 0;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/haimianjie2012/article/details/83819904