用c语言链表写:题目两个有序单链表求差集,各依次输入递增有序若干个不超过100的整数,分别建立两个递增有序单链表,分别表示集合A和集合B。设计算法求出两个集合A和B 的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并存放于A链表中。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。然后输出求的差集的单链表。测试数据保证结果链表至少存在一个元素。 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据先在第一行输入数据个数n及n个依次递增有序的不超过100的整数,再在第二行输入数据个数m及m个依次递增有序的不超过100的整数。 输出格式: 对于每组测试,输出A与B的差集的单链表,每两个数据之间留一个空格。
时间: 2023-06-27 07:02:25 浏览: 165
c语言-c语言编程基础之leetcode题解第21题合并两个有序链表.zip
下面是用C语言链表写的实现,主要思路是遍历两个链表,找到集合A中不在集合B中的元素并将其从A链表中删除,最终得到差集:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct _node {
int val;
struct _node *next;
} Node;
Node* createList(int n) {
Node *head = NULL, *tail = NULL;
for (int i = 0; i < n; i++) {
int val;
scanf("%d", &val);
Node *node = (Node*) malloc(sizeof(Node));
node->val = val;
node->next = NULL;
if (!head) {
head = tail = node;
} else {
tail->next = node;
tail = node;
}
}
return head;
}
void printList(Node *head) {
Node *node = head;
while (node) {
printf("%d ", node->val);
node = node->next;
}
}
void subtractList(Node *a, Node *b) {
Node *prev = NULL, *node = a;
while (node) {
if (node->val < b->val) { // a中元素小于b中最小元素,说明该元素不在b中
if (prev) {
prev->next = node->next; // 删除该元素
} else {
a = node->next;
}
free(node);
node = prev ? prev->next : a;
} else if (node->val == b->val) { // a中元素等于b中元素,说明该元素在b中
prev = node;
node = node->next;
b = b->next;
} else { // a中元素大于b中元素,说明b中还有比a中元素小的元素
b = b->next;
}
}
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n, m;
scanf("%d", &n);
Node *a = createList(n);
scanf("%d", &m);
Node *b = createList(m);
subtractList(a, b);
printList(a);
printf("\n");
// 释放链表空间
Node *tmp;
while (a) {
tmp = a->next;
free(a);
a = tmp;
}
while (b) {
tmp = b->next;
free(b);
b = tmp;
}
}
return 0;
}
```
注意,在每次删除元素时,需要保存前一个节点的指针,方便修改前一个节点的 next 指针。同时,需要特判删除第一个节点的情况,因为此时没有前一个节点。
阅读全文