(C++)如何修改/使用数据结构,以便我们可以反复使用它们?
我有一个数据结构,由N个整数组成的循环双链表。我必须通过减少一些数量来修改它。在一些数字排列的情况下,我必须通过检查两个或更多情况下修改的数据结构来检查数量是否最小化。我想知道,我的尝试是否足够好,是否有更好的算法可用于这些情况。 我没有明确地说明这个问题,因为我想自己解决它,但是为了调试,我们必须取列表中两个相邻的元素,它们的和最小,并用和替换它们。我们必须计算每个阶段的总和。N比1 我创建了两个函数:mod和demod,用于修改和解调列表。在这些情况下,我将修改案例1的结构并存储quantity1,解调它,然后修改案例2的结构并存储quantity2。然后,我将为该案例选择数量最少的mod。 index和temp是我必须计算数量的两个指针。 编辑后的代码如下所示(C++)如何修改/使用数据结构,以便我们可以反复使用它们?,c++,data-structures,circular-list,segment-tree,C++,Data Structures,Circular List,Segment Tree,我有一个数据结构,由N个整数组成的循环双链表。我必须通过减少一些数量来修改它。在一些数字排列的情况下,我必须通过检查两个或更多情况下修改的数据结构来检查数量是否最小化。我想知道,我的尝试是否足够好,是否有更好的算法可用于这些情况。 我没有明确地说明这个问题,因为我想自己解决它,但是为了调试,我们必须取列表中两个相邻的元素,它们的和最小,并用和替换它们。我们必须计算每个阶段的总和。N比1 我创建了两个函数:mod和demod,用于修改和解调列表。在这些情况下,我将修改案例1的结构并存储quanti
struct Node {
long long int data;
struct Node * prev;
struct Node * next;
};
void mod(struct Node * index, long long int val) {
struct Node * temp1 = index -> next;
index -> data = val;
index -> next = (index -> next) -> next;
((index -> next) -> next) -> prev = index;
//free(temp1);
}
void demod(struct Node * index ,long long int a){
long long int b = index->data - a;
index->data = a;
struct Node * new_Node = new Node;
new_Node->data = b;
new_Node -> next = index -> next;
index->next = new_Node;
new_Node->prev = index;
(new_Node->next)->prev = new_Node;
}
long long int value(struct Node * start, int length) {
long long int val;
struct Node * index = start->prev;
val = f(start -> prev);
struct Node * temp = start;
while (temp -> next != start) {
if (val > f(temp)) {
index = temp;
val = f(temp);
}
temp = temp -> next;
}
cout << "val : " << val << "--";
temp = start;
while (temp -> next != start) {
if (f(temp)==val && (index -> next == temp)) {
std::cout << "*##";
long long int init1 = index -> data;
//displayList(start);
// cout << init1 << " ";
mod(index, val, start);
cout << "start case 1\n ";
long long int temp1 = solve(start, length - 1);
cout << "end case 1\n ";
demod(index, init1);
displayList(start);
mod(temp, val, start);
displayList(start);
cout << "start case 2 \n";
long long int temp2 = solve(start, length - 1);
cout << "end case 2\n";
if (temp1 > temp2) {
mod(temp, val, start);
return val;
} else {
mod(index, val, start);
return val;
}
/*if ((index -> prev) -> data > ((temp -> next) -> next) -> data) {
std::cout << "*";
index = index -> next;
}*/
}
temp = temp -> next;
}
// cout << "index data " << index -> data << "\n";
mod(index, val, start);
return val;
}
。。。
完整代码162行
代码现在有一些小问题需要纠正,我有一个基本问题,就是一遍又一遍地使用数据结构。所以我有点难以理解你的问题,但是mod应该更改index的值,并从列表中删除index之后的下一个节点 如果是这样,那么这是窃听
index->next = index->next->next;
index->next->next->prev = index;
您忘记的是,您在第一条语句中更改了index->next->next的值,但是第二条语句尝试使用旧值
这应该是我的偏好
index->next = index->next->next;
index->next->prev = index;
或者这会改变两个语句的顺序
index->next->next->prev = index;
index->next = index->next->next;
我毫不怀疑代码的其余部分还有更多的bug。这种大量使用指针的代码要想正确使用是非常困难的
您还注释掉了有缺陷的代码freetemp1;。如果使用新内存分配内存,则必须使用delete解除分配内存。如果使用new[]分配内存,则必须使用delete[]解除分配内存。如果使用malloc分配内存,则必须使用free解除分配内存。不要把这些混在一起,它们不是等价的
还有更多的错误 对。约翰指出的那一条之后的下一条就在这条线上
demod(index, init1);displayList(start); mod(temp, val); displayList(start);
由于节点临时已从列表中取消链接(尽管之前未被mod删除),因此此时它不再是列表中正确链接的成员,并且在未再次链接的情况下无法使用。一种方法是将temp传递给demod并将其重新插入列表,而不是分配struct Node*new_Node=new Node;那里。欢迎来到堆栈溢出!从您的问题中,我无法确定您要解决的问题,代码中的所有列表操作都淹没了试图解决它的实际代码。如果您1更好地解释了这个问题,2提供了一个小的输入/输出对,演示了这个代码应该做什么以及如何做,3格式化您的代码请提供一个简单的示例,并尝试遵守提出一个好问题的规则:您是否考虑过使用STL容器并将数据结构的副本传递给递归调用?显式修改和恢复更改似乎是一个不必要的复杂问题。Botje,我不知道如何使用STL之类的工具轻松复制一个双链接循环列表。你能推荐一些STL容器吗?保持简单,只使用std::vector或std::list。在它开始工作后,你总是可以进行专门化和优化。还有更多的错误。我将以某种方式实现它们。你看,解算基本上会多次修改结构,解调器无法撤销它,因为它只工作一步。