PTA C语言 两个递增链表的差集 - 人邮DS(C 第2版)线性表习题2(4)

本文描述了如何使用C语言编写一个算法,计算两个递增链表A和B的差集C,包含在A中但不在B中的元素。算法通过遍历并比较链表元素来找到并存储差集元素的数量。

不是链表,但能过

已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B 的差集C(即仅由在A中出现而不在B中出现的元素所构成的集合),并将差集C以同样的形式存储,同时返回该集合C的元素个数。

输入格式:

输入两组数据为元素递增的数组,并构成两个链表A和B。
每一组数据的第一行输入数组长度,第二行输入递增数组。

输出格式:

输出链表C表示的差集的长度和元素。

输入样例:

5
1 3 5 7 9
3
2 3 5

 答案:


#include <stdio.h>
int main()
{
	int A = 0, B = 0;
	int arr1[100] = { 0 };
	int arr2[100] = { 0 };
	int arr_my[200] = { 0 };
	scanf("%d", &A);
	if (A == 0)
	{
		return 0;
	}
	for (int i = 0; i < A; i++)
	{
		scanf("%d", &arr1[i]);
	}
	scanf("%d", &B);
	if (B == 0)
	{
		for (int i = 0; i < A; i++)
		{
			printf("%d ", arr1[i]);
		}
		return 0;
	}
	for (int i = 0; i < B; i++)
	{
		scanf("%d", &arr2[i]);
	}
	int flag = 0;
	int n = 0;
	for (int i = 0; i < A; i++)
	{
		flag = 0;
		for (int j = 0; j < B; j++)
		{
			if (arr1[i] == arr2[j])
			{
				flag = 1;
				break;
			}
		}
		if (flag == 0)
		{
			arr_my[n] = arr1[i];
			n++;
		}
	}
	printf("%d\n", n);
	if (n == 0)
	{
		return 0;
	}
	for (int i = 0; i < n-1; i++)
	{
		printf("%d ", arr_my[i]);
	}
	printf("%d", arr_my[n-1]);
	return 0;
}

以下是使用 C++ 实现链表 `Set_LinkList` 差集的详细步骤和代码示例。 #### 链表节点和链表类的定义 首先,需要定义链表的节点结构和链表类。 ```cpp #include <iostream> // 定义链表节点结构 template <typename T> struct Node { T data; Node<T>* next; Node(T value) : data(value), next(nullptr) {} }; // 定义链表类 template <typename T> class Set_LinkList { private: Node<T>* head; public: Set_LinkList() : head(nullptr) {} // 插入元素 void insert(T value) { Node<T>* newNode = new Node<T>(value); if (!head) { head = newNode; } else { Node<T>* temp = head; while (temp->next) { temp = temp->next; } temp->next = newNode; } } // 检查元素是否存在 bool contains(T value) { Node<T>* temp = head; while (temp) { if (temp->data == value) { return true; } temp = temp->next; } return false; } // 计算差集 Set_LinkList<T> difference(const Set_LinkList<T>& other) { Set_LinkList<T> result; Node<T>* temp = head; while (temp) { if (!other.contains(temp->data)) { result.insert(temp->data); } temp = temp->next; } return result; } // 打印链表 void print() { Node<T>* temp = head; while (temp) { std::cout << temp->data << " "; temp = temp->next; } std::cout << std::endl; } // 析构函数 ~Set_LinkList() { while (head) { Node<T>* temp = head; head = head->next; delete temp; } } }; ``` #### 使用示例 以下是如何使用上述代码计算两个链表差集: ```cpp int main() { Set_LinkList<int> list1; list1.insert(1); list1.insert(2); list1.insert(3); Set_LinkList<int> list2; list2.insert(2); list2.insert(3); list2.insert(4); Set_LinkList<int> diff = list1.difference(list2); std::cout << "List 1: "; list1.print(); std::cout << "List 2: "; list2.print(); std::cout << "Difference: "; diff.print(); return 0; } ``` ### 代码解释 1. **节点结构 `Node`**:定义了链表的节点,包含一个数据元素 `data` 和一个指向下一个节点的指针 `next`。 2. **链表类 `Set_LinkList`**: - `insert` 方法:用于向链表中插入新元素。 - `contains` 方法:用于检查链表中是否包含某个元素。 - `difference` 方法:计算当前链表与另一个链表差集。遍历当前链表,将不在另一个链表中的元素插入到结果链表中。 - `print` 方法:用于打印链表中的所有元素。 - 析构函数:释放链表中所有节点的内存。 ### 复杂度分析 - **时间复杂度**:`insert` 方法的时间复杂度为 $O(n)$,`contains` 方法的时间复杂度为 $O(n)$,`difference` 方法的时间复杂度为 $O(n*m)$,其中 $n$ 是当前链表的长度,$m$ 是另一个链表的长度。 - **空间复杂度**:`difference` 方法的空间复杂度为 $O(n)$,其中 $n$ 是结果链表的长度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值