求出两个集合的交集,输出交集的元素。
输入样例:
5 5
1 3 5 7 9
1 2 3 4 5
3 4
1 2 5
2 4 5 6
0 0
输出样例:
1 3 5
2 5
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
} LNode, *LinkList;
LinkList ListInit();
void ListDestroy(LinkList *head);
void ListTailInsert(LinkList head, int x);
void ListShow(LinkList head);
void ListIntersection(LinkList A, LinkList B);
int main() {
int m, n;
while (scanf("%d %d%*c", &m, &n) && m && n) {
LinkList A = ListInit();
LinkList B = ListInit();
int x;
for (int i = 0; i < m; i++) {
scanf("%d%*c", &x);
ListTailInsert(A, x);
}
for (int i = 0; i < n; i++) {
scanf("%d%*c", &x);
ListTailInsert(B, x);
}
ListIntersection(A, B);
ListShow(A);
ListDestroy(&A);
ListDestroy(&B);
}
return 0;
}
LinkList ListInit() {
LinkList head = (LinkList) malloc(sizeof(LNode));
head->data = 0;
head->next = NULL;
return head;
}
void ListDestroy(LinkList *head) {
LNode *tmp;
while (*head) {
tmp = *head;
*head = (*head)->next;
free(tmp);
}
}
void ListTailInsert(LinkList head, int x) {
LNode *newNode = (LNode *) malloc(sizeof(LNode)), *tail = head;
newNode->data = x;
newNode->next = NULL;
while (tail->next) tail = tail->next;
tail->next = newNode;
}
void ListShow(LinkList head) {
for (LNode *cursor = head->next; cursor; cursor = cursor->next) {
printf("%d%c", cursor->data, cursor->next ? 32 : 10);
}
}
void ListIntersection(LinkList A, LinkList B) {
LNode *curA = A, *curB, *tmp;
int flag;//表示A中的元素是否在B中出现
while (curA->next) {
flag = 0;
for (curB = B; curB->next; curB = curB->next) {
if (curA->next->data == curB->next->data) flag = 1;
}
if (!flag) {
tmp = curA->next;
curA->next = curA->next->next;
free(tmp);
} else {
curA = curA->next;
}
}
}