Description
假设元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表C,其元素为A和B中元素的交集,且表C中的元素也依值递增有序排列。
输入A和B集合中的元素;
输出A和B的交集C中的元素。
提示:存储结构采用带表头结点的循环单链表,结点结构如下:
typedef struct Node
{
int data;
struct Node *next;
}LNode,*LinkList;
要求:
(1)编写函数按照升序序列输入元素值,建立集合的循环单链表。
(2) 编写函数实现集合的求交集算法。
(3)编写函数依次输出集合中的元素。
(4)编写main(),调用上述函数完成题目要求。
Input
输入集合A的元素个数
按照升序依次输入集合A的元素值
输入集合B的元素个数
按照升序依次输入集合B的元素值
Output
依次输出A和B的交集C中的元素。
Sample Input
5 10 20 30 40 50 6 5 16 20 35 40 80
Sample Output
20 40
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}LNode,*LinkList;
int length_C=0;
void InitLNode(LNode* pHeader,int len){
int i;
LNode *pNewNode;
LNode *pCurNode;
pHeader->next=pNewNode;
pCurNode = pHeader;
for(i=0;i<len;i++)
{
pNewNode = (LNode*)malloc(sizeof(LNode));
scanf("%d",&pNewNode->data);
pNewNode->next = NULL;
pCurNode->next = pNewNode;
pCurNode = pNewNode;
}
}
void Display(LNode *pHeader)
{
if(length_C!=0)
{
LNode *pCurNode;
pCurNode=pHeader;
while(pCurNode->next!=NULL)
{
pCurNode = pCurNode->next;
printf("%d ",pCurNode->data);
}
}
}
LNode* InterSet(LNode *p1,LNode *p2,LNode *C)
{
LNode *pCurNode1 = p1;
LNode *pCurNode2 = p2;
LNode *pCurNode3 = C;
LNode *pNewNode3;
C->next = pNewNode3;
while(pCurNode1->next!=NULL)
{
pCurNode1=pCurNode1->next;
while(pCurNode2->next!=NULL)
{
pCurNode2=pCurNode2->next;
if(pCurNode1->data == pCurNode2->data)
{
pNewNode3 = (LNode*)malloc(sizeof(LNode));
length_C++;
pNewNode3->data = pCurNode1->data;
pNewNode3->next = NULL;
pCurNode3->next = pNewNode3;
pCurNode3=pNewNode3;
}
}
pCurNode2 = p2;
}
pCurNode3 = C;
return C;
}
int main()
{
LNode *A;
LNode *B;
LNode *C;
int length_A,length_B ;
A = (LNode*)malloc(sizeof(LNode));
B = (LNode*)malloc(sizeof(LNode));
C = (LNode*)malloc(sizeof(LNode));
scanf("%d",&length_A);
InitLNode(A,length_A);
scanf("%d",&length_B);
InitLNode(B,length_B);
InterSet(A,B,C);
Display(C);
return 0;
}