3.4给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∩L2的过程代码实现
//3.4 L1链表和L2链表做交集
LinkList IntersectList(LinkList L1,LinkList L2,LinkList R) {
LinkList r, s,t,temp,m;
int flag,len;
len = getLen(L2);
R = (LinkList)malloc(sizeof(Node));
r = L1->next;
s = L2->next;
t = R;
printf("输出长度%d:\n", len);
for (; r; r = r->next) {
for (; s; s = s->next) {
if (r->data == s->data) {
flag = 0;
m = s->next;
for (;m; m = m->next) {
if (r->data == m->data)
flag = 1;
}
if (!flag) {
temp = (Node*)malloc(sizeof(Node));
temp->data = s->data;
t->next = temp;
t = temp;
break;
}
}
}
s = L2->next;//重置s的指向,让第二重循环每次循环时从L2的下一个结点处开始循环
m = s->next;
}
t->next = NULL;
return R;
}
m = s->next;
for (;m; m = m->next) {
if (r->data == m->data)
flag = 1;
}
一定不要忘记这一步的判重操作,举个例子来说
L1 = {1,3,5,7},L2 = {1,1,3,5}
如果没有判重操作的话最后输出的结果会是1,1,3,5
因为如果不判重的话L1[0]会在循环中两次跟L2[0],L2[1]匹配即1这个数组被两次匹配到,所以要有第三重循环,当L1中的数据被重复匹配时,则要置flag为1,从而不再把重复的数据输入链表
3.5并集的实现
我的思路是首先定义一个函数,将L1和L2链表合并到一起,再将合并后的链表进行排序,之后进行链表去重,从而得到L1和L2的并集
合并函数代码实现
//链表拼接
LinkList mergeList(LinkList L1, LinkList L2, LinkList P) {
LinkList r, s;
Node* t,*m;
//P = (LinkList)malloc(sizeof(Node));
m = P;
r = L1->next;
s = L2->next;
while (r) {//将链表L1的值接入P中
t = (Node *)malloc(sizeof(Node));
t->data = r->data;
m->next = t;
m = t;
r = r->next;
}
m->next = NULL;
while (s) {
t = (Node*)malloc(sizeof(Node));
t->data = s->data;
m->next = t;
m = t;
s = s->next;
}
m->next = NULL;
return P;
}
排序函数代码实现
//链表排序(从小到大)
LinkList sortLikt(LinkList L) {
LinkList R;
R = (LinkList)malloc(sizeof(Node));
Node* p, * q;
int temp;
p = L->next;
q = p->next;
for (; p; p = p->next) {
for (; q; q = q->next) {
if (p->data < q->data) {
temp = p->data;
p->data = q->data;
q->data = temp;
}
}
q = L->next;
}
return L;
}
最后进行链表去重,从而实现链表的并集
//3.5L1和L2并集的实现
LinkList UnionList(LinkList L1, LinkList L2, LinkList R) {
LinkList P,Sort;
LinkList p,q;
P = (LinkList)malloc(sizeof(Node));
R = mergeList(L1, L2,P);//R是合并后的链表
Sort = sortLikt(R);//Sort是排序后的链表
p = Sort;
while (p != NULL && p->next != NULL) {
if (p->data == p->next->data) {
p->next = p->next->next;
}
else {
p = p->next;
}
}
return Sort;
}
完整的代码可以参考:http://t.csdn.cn/ylUdO
将上述函数插入即可运行
运行结果图: