(C++)如何修改/使用数据结构,以便我们可以一次又一次地使用它们?
(C++) How to modify/use data structures such that we can use them again and again?
我有一个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()
从列表中取消链接(尽管不是delete
d),因此此时它不再是列表的正确链接成员,并且如果不再次链接,则无法用作该列表。一种方法是将temp
传递给demod()
并将其重新插入到列表中,而不是在那里分配struct Node * new_Node = new Node;
。
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- 为什么当我输入一个大数字时,输出会一遍又一遍地重复?
- 传输文件一次又一次地发送相同的字节
- 我如何一遍又一遍地向用户提问,直到他们输入正确的值字段?
- c++ 一遍又一遍地对函数返回相同的检查
- (C++)如何修改/使用数据结构,以便我们可以一次又一次地使用它们?
- 一次又一次地重建以查看导入的 QML 文件更改
- 一遍又一遍地构造相同的对象
- 使带有循环的同一线程不会一次又一次地获得相同的互斥锁而不休眠
- 一次又一次的恐惧。这是不同的
- 这将是在将函数分配给变量或一次又一次地调用函数之间使用函数结果的最佳方式
- 从文件中读取数据 - 存储在变量中或一次又一次地读取
- OpenCv 一轮又一轮
- 有没有办法不在 c++ 中的参数中一遍又一遍地输入相同的数据类型
- 一次又一次地试图打开一个文件,但给出了错误的路径
- 如何在c++中一次又一次地从函数返回
- 一遍又一遍地创建同一个文本文件
- 变量不计数,即使一遍又一遍地调用函数
- 为什么popn()一次又一次调用返回相同的输出
- Makefile一次又一次地为不同的对象选择相同的源文件