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

时间:2019-07-11 11:10:09

标签: c++ data-structures circular-list segment-tree

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

我创建了两个函数2个函数:mod()和demod(),用于修改和解调列表。在那些情况下,我将为情况1修改mod()的结构并存储数量1,对它进行demod(),然后为情况2修改mod()并存储数量2。然后,我将为这种情况选择数量最少的mod()。 index和temp是我必须评估数量的两个指标。 编辑后的代码如下。

    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行) https://drive.google.com/open?id=1oD1pEr3_seX6kIzErpRG-Xu3s_95UVBj 现在,代码中有一些我必须更正的极端情况,而我的基本问题是一次又一次地使用数据结构。

2 个答案:

答案 0 :(得分:0)

因此,我有点难以解决您的问题,但是mod应该更改index的值并从列表中删除index之后的下一个节点吗?

如果是这样,那就有问题了

index->next = index->next->next;
index->next->next->prev = index;

您忘记的是,您在第一条语句中更改了index->next->next的值,但是第二条语句尝试使用 old 的值。

应该是这个(我的偏爱)

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释放内存。不要混淆这些,它们不是等效的。

答案 1 :(得分:0)

  

还有更多的错误。

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

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

由于节点temp之前已由delete取消与列表的链接(虽然不是mod() d),所以在这一点上它不再是列表的正确链接的成员,并且除非再次链接,否则不能原样使用。这样做的一种方法是将temp传递到demod()并将其重新插入列表中,而不是在此处分配struct Node * new_Node = new Node;