版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}