用C语言写一个实例,设计一个算法:已知两个链表A和B分别表示两个集合,其元素递增排列。设计一个算法,用于求出A与B的交集,并存放在A链表中
时间: 2024-02-05 09:13:00 浏览: 77
下面是用C语言实现的算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
struct node {
int data;
struct node *next;
};
// 创建链表
struct node *create_list(int *arr, int n)
{
struct node *head = NULL, *tail = NULL, *p = NULL;
for (int i = 0; i < n; i++) {
p = (struct node*) malloc(sizeof(struct node));
p->data = arr[i];
p->next = NULL;
if (head == NULL) {
head = tail = p;
} else {
tail->next = p;
tail = p;
}
}
return head;
}
// 求链表交集
void intersect(struct node *A, struct node *B)
{
struct node *p = A, *q = B, *prev = NULL;
while (p && q) {
if (p->data < q->data) {
prev = p;
p = p->next;
} else if (p->data > q->data) {
q = q->next;
} else {
prev = p;
p = p->next;
q = q->next;
}
}
if (prev != NULL) {
prev->next = NULL;
} else {
A = NULL;
}
while (A) {
p = A;
A = A->next;
free(p);
}
}
// 打印链表
void print_list(struct node *head)
{
while (head) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
int main()
{
int arr1[5] = {1, 3, 5, 7, 9};
int arr2[5] = {2, 3, 4, 7, 8};
struct node *A = create_list(arr1, 5);
struct node *B = create_list(arr2, 5);
intersect(A, B);
print_list(A);
return 0;
}
```
该算法的思路为:逐个比较两个链表中的元素,如果相等则将该元素保留在A链表中,否则删除A链表中的该元素。最后打印出结果A链表即为A与B的交集。
阅读全文