(C++)如何修改/使用数据结构,以便我们可以一次又一次地使用它们?

(C++) How to modify/use data structures such that we can use them again and again?

本文关键字:我们 一次又一次 数据结构 C++ 何修改 修改      更新时间:2023-10-16

我有一个N个整数的数据结构(循环双向链表)。我必须通过最小化一些数量来修改它。在某些数字排列的情况下,我将不得不通过在两种或多种情况下检查修改后的数据结构来检查数量是否最小化。我想知道,我的尝试是否足够好,以及是否有更好的算法可用于这些情况。 我没有明确说明问题,因为我想自己解决它,但为了调试,我们必须采用列表中两个具有最小总和的相邻元素并用总和替换它们。我们必须计算每个阶段的总和。(N 至 1)

我创建了两个函数 2 函数,:mod() 和 demod(),用于修改和取消修改列表。在这些情况下,我将 mod() 情况 1 的结构并存储 quantity1,demod() 它,然后 mod() 它用于情况 2,并存储 quantity2。然后,我将为数量最少的情况选择 mod()。 索引和温度是我必须评估数量的两个指针。 编辑后的代码如下。

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 1n ";
long long int temp1 = solve(start, length - 1);
cout << "end case 1n ";
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 2n";
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 行) https://drive.google.com/open?id=1oD1pEr3_seX6kIzErpRG-Xu3s_95UVBj 代码现在有一些我必须纠正的极端情况,并且我遇到了一次又一次使用数据结构的基本问题。

所以我有点难以理解你的问题,但是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;

我毫不怀疑其余代码中还有更多错误。这种指针繁重的代码非常难以正确处理。

您还注释掉了错误代码free(temp1);。如果使用new分配内存,则必须使用delete解除分配内存。如果使用new[]分配内存,则必须使用delete[]解除分配内存。如果使用malloc分配内存,则必须使用free解除分配内存。不要混淆这些,它们不等同。

还有更多的错误。

没错。下一个(在约翰指出的那个之后)在行中

demod(index, init1);displayList(start);  mod(temp, val); displayList(start);

由于节点temp之前已被mod()从列表中取消链接(尽管不是deleted),因此此时它不再是列表的正确链接成员,并且如果不再次链接,则无法用作该列表。一种方法是将temp传递给demod()并将其重新插入到列表中,而不是在那里分配struct Node * new_Node = new Node;