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; }
时间: 2024-03-13 07:42:20 浏览: 17
这段代码实现了两个集合的交集运算,并将结果存储在一个新的链表中。
假设集合 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` 函数用于输出链表中的所有元素。