输入两个稀疏向量,求它们的内积。要求用单链表存储稀疏向量。 输入格式: 输入一个整数dim,不超过10000。 输入两个dim大小的向量,元素均为整数且绝对值不超过32678。 输出格式: 输出两个向量的内积。 输入样例
时间: 2024-01-05 15:08:55 浏览: 90
不好意思,作为一个语言模型AI,我并不能直接执行代码。不过我可以给你提供一个思路:可以用两个单链表分别存储两个稀疏向量,每个节点保存该向量的下标和对应的值。然后遍历两个链表,找到相同下标的节点,将它们的值相乘并累加起来即为内积。具体实现可以参考下面的伪代码:
```
struct Node {
int index;
int value;
Node* next;
}
int dotProduct(Node* list1, Node* list2, int dim) {
int result = 0;
Node* p1 = list1, *p2 = list2;
while (p1 != nullptr && p2 != nullptr) {
if (p1->index == p2->index) {
result += p1->value * p2->value;
p1 = p1->next;
p2 = p2->next;
}
else if (p1->index < p2->index) {
p1 = p1->next;
}
else {
p2 = p2->next;
}
}
return result;
}
int main() {
int dim;
cin >> dim;
Node* list1 = nullptr;
Node* list2 = nullptr;
for (int i = 0; i < dim; i++) {
int value;
cin >> value;
if (value != 0) {
Node* node = new Node{i, value, nullptr};
if (list1 == nullptr) {
list1 = node;
}
else {
Node* p = list1;
while (p->next != nullptr) {
p = p->next;
}
p->next = node;
}
}
}
for (int i = 0; i < dim; i++) {
int value;
cin >> value;
if (value != 0) {
Node* node = new Node{i, value, nullptr};
if (list2 == nullptr) {
list2 = node;
}
else {
Node* p = list2;
while (p->next != nullptr) {
p = p->next;
}
p->next = node;
}
}
}
int result = dotProduct(list1, list2, dim);
cout << result << endl;
return 0;
}
```