LinkList Intersection(LinkList L1, LinkList L2,int i) { //新建一个链表,用来存储两个集合的交集 LinkList s; Init(&s); //初始化链表 LinkList Lp,Lq; Lp=L1->next; //指向A集合的结点 while(Lp) { //遍历集合A Lq = L2->next; //指向B集合的结点 while(Lq) { //遍历集合B if(strcmp(Lp->data,Lq->data)==0) { //当集合A和集合B中有相同的元素时,将相同的元素存入到新建的链表中去 LinkList inter = (LinkList)malloc(sizeof(LLinkList)); //头插法插入 strcpy(inter->data,Lp->data); inter->next = s->next; s->next = inter; } Lq=Lq->next; } Lp=Lp->next; } if(i) Output(s); return s; }
时间: 2024-04-23 15:24:36 浏览: 77
这是一个函数,其功能是求两个链表的交集,其中采用了双重循环和头插法来实现。具体实现过程如下:
1. 定义了一个指针变量 s,用来表示新建的存储交集的链表,并对其进行初始化。
2. 定义了两个指针变量 Lp 和 Lq,分别指向链表 L1 和 L2 的第一个节点。
3. 开始第一层循环,其中循环条件是 Lp 不为空,即遍历链表 L1。
4. 在第一层循环中,开始第二层循环,其中循环条件是 Lq 不为空,即遍历链表 L2。
5. 在第二层循环中,判断 Lp 的数据是否与 Lq 的数据相同,若相同则将该节点插入到新建的链表 s 中。
6. 插入节点的方式是先动态分配内存空间,然后将该节点的数据域赋值为 Lp 的数据,将该节点的 next 指针指向 s 的下一个节点,最后将 s 的 next 指针指向该节点。
7. 第二层循环结束后,将 Lq 指向下一个节点,继续第一层循环,直至遍历完链表 L2。
8. 第一层循环结束后,将 Lp 指向下一个节点,继续下一轮循环,直至遍历完链表 L1。
9. 若参数 i 不为 0,则输出新建的链表 s。
10. 函数结束,返回链表头指针 s。
相关问题
LinkList DifferenceList(LinkList L1, LinkList L2) { //求出差集 A-B(除去集合A和集合B相同的元素,剩下A的集合元素) LinkList s1,s2,p,q,s; Init(&s); s1 = L1; //A的集合 L1 s2 = Intersection(L1,L2,0); //交集 p=s1->next; //利用p指向集合A这个表 while(p) { q=s2->next; while(q) { //遍历交集 if(strcmp(p->data,q->data)!=0) { //当s2与s1中没有相同的元素时,取出不相同的元素,有相同的即结束 q=q->next; } else { break; } } if(!q) { //将取出的元素放入到链表s中 LinkList inter = (LinkList)malloc(sizeof(LLinkList));//头插法插入 strcpy(inter->data,p->data); inter->next = s->next; s->next = inter; } p=p->next; } Output(s); return s; }
这是一段 C 语言代码,实现了求 LinkList 类型的差集操作,即将集合 A 中与集合 B 相同的元素去除,得到剩下的元素集合。具体实现过程如下:
1. 定义 LinkList 类型的指针变量 s1、s2、p、q、s,其中 s1 指向集合 A,s2 指向集合 A 和集合 B 的交集,p 和 q 分别用于遍历集合 A 和交集 s2,s 用于存储 A-B 的结果。
2. 利用 Init 函数初始化链表 s。
3. 遍历集合 A,对于每一个元素,遍历交集 s2,若找到与之相同的元素,则退出内层循环,否则将该元素加入链表 s 中。
4. 返回链表 s,即为 A-B 的结果。
需要注意的是,该代码中的 Intersection 函数用于求 A 和 B 的交集,第三个参数为 0 表示不保留重复元素。此外,该代码中使用了头插法将元素加入链表 s 中。
while(p2) { //遍历集合B, p1 = s->next; //p1指向新建的链表 while(p1) { if(strcmp(p1->data,p2->data)!=0) { //当有不相同的元素时,则指向下一结点,否则结束 p1 = p1->next; } else { break; } } if(!p1) { //将集合B中的元素放到链表s中去 LinkList inter = (LinkList)malloc(sizeof(LLinkList));//头插法插入 strcpy(inter->data,p2->data); inter->next = s->next; s->next = inter; } p2 = p2->next; } if(i) Output(s); return s; }
这段代码实现了两个集合的交集运算,并将结果存储在一个新的链表中。
假设集合 A 和集合 B 分别用链表 `La` 和 `Lb` 表示,且它们的数据类型定义如下:
```c
struct LNode {
char data[20];
struct LNode *next;
};
typedef struct LNode LNode;
typedef struct LNode *LinkList;
```
那么,代码的实现过程如下:
1. 首先,新建一个空链表 `s`,用于存储集合 A 和集合 B 的交集。
```c
LinkList s = (LinkList)malloc(sizeof(LNode));
s->next = NULL;
```
2. 遍历集合 B 的每个元素,对于每个元素,都在集合 A 中查找是否存在相同的元素:
```c
while (p2) {
p1 = s->next;
while (p1) {
if (strcmp(p1->data, p2->data) != 0) {
p1 = p1->next;
} else {
break;
}
}
// ...
}
```
其中,`p1` 和 `p2` 分别指向链表 `s` 和 `Lb` 的头结点。
3. 如果集合 A 中不存在该元素,则将该元素放到链表 `s` 中:
```c
if (!p1) {
LinkList inter = (LinkList)malloc(sizeof(LNode));
strcpy(inter->data, p2->data);
inter->next = s->next;
s->next = inter;
}
```
其中,`inter` 是一个新建的结点,用于存储该元素。
4. 最后,输出链表 `s` 中的所有元素,即为集合 A 和集合 B 的交集。
```c
Output(s);
```
下面是完整的代码实现:
```c
void Intersection(LinkList La, LinkList Lb) {
LinkList p1, p2, s;
int i = 0;
p2 = Lb->next;
s = (LinkList)malloc(sizeof(LNode));
s->next = NULL;
while (p2) {
p1 = La->next;
while (p1) {
if (strcmp(p1->data, p2->data) != 0) {
p1 = p1->next;
} else {
break;
}
}
if (!p1) {
LinkList inter = (LinkList)malloc(sizeof(LNode));
strcpy(inter->data, p2->data);
inter->next = s->next;
s->next = inter;
}
p2 = p2->next;
}
Output(s);
}
```
其中,`Output` 函数用于输出链表中的所有元素。
阅读全文