0
void insert(int number){
    Node* temp0 = NULL;
    Node* temp1 = head;
    Node* temp = new Node();
    int sum = 0;

    while(temp1!= NULL && sum<=number){
    // loop condition edited, before it was temp1!= NULL && sum>=number
        sum+=temp1->content;
        temp0=temp1;
        temp1=temp1->next;
    }

    if(temp0 == NULL){
        temp->content = number;
        temp->next = head;
        if(head!=NULL){
            head->content -= temp->content;
        }
        head = temp;
    }
    else{
        temp0->next = temp;
        temp->content = number - sum;
        temp1->content -= temp->content;
    temp->next = temp1;
    }// end of else
}// end of void insert

我遇到了一个问题,我在之前的一个问题中对此进行了描述,但我仍然希望自己实施解决方案。简而言之,我想制作一个“相对”列表:例如,对于元素1 5 7 2 4 6,列表看起来像1 1 2 1 1 1

我将创建一个优先队列列表1 2 4 5 7 6,然后我将更改相对于前一个元素的元素:第一个元素将保持 1,第二个元素将保持 2-1 = 1,第三个将是 4-2 = 2,第四个元素将保持 5-4 = 1等等。当我形成一个优先队列时,我会用它的值和前一个元素的值之差替换当前元素。我在实现插入功能时遇到问题。代码在问题的顶部给出。

这个想法是,我浏览列表,将“差异”(这是我的 Node* 结构的内容字段)添加到计数器变量中。当总和计数器变得大于或等于我需要插入的元素时,我找到了插入它的位置。

如果 temp0 为空,我将元素插入到第一个位置。如果它不是唯一的元素,我会更新下一个元素的内容 - head,它是前一个第一个元素。

如果需要将数字插入列表中间(或末尾)的某个位置,我将内容更新为 sum - number,这将是一个 >= 0 的数字,这没关系。此外,我将新的下一个元素 ( temp1) 的内容更新为temp->content - temp->content.

出于某种原因,这不起作用。当我插入4 2 8,而不是2 2 4,我得到4 -2 6结果列表。

4

1 回答 1

0

您的循环是“错误的”,总和开始为 0,因此只要number不为零或负数,它就永远不会进入“查找位置”循环。因此,每个数字都插入在开头,而不是在其应有的位置。

while(temp1!= NULL && sum>=number){
    sum+=temp1->content;
    temp0=temp1;
    temp1=temp1->next;
}

将其更改为sum <= number,我相信它会起作用。如果您多次插入相同的数字,不确定您想要发生什么...您可以sum < number改为吗?

编辑:您还将有一些方法来检测您的“新”值是否小于现有值,如果是这样,则插入一个新头,而不是在现有数字之后。我不确定具体的代码是什么,但你确实需要按照以下方式做一些事情:

 if (number < sum)
 {
     temp->next = head;
     head->content -= temp->content;
     head = temp;
 }
 else
 {
     ... existing insert code ... 
 }
于 2013-08-18T23:20:20.277 回答