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为null,我将元素插入第一个位置。如果它不是唯一的元素,我更新下一个元素的内容 - head,这是前一个元素。
如果需要将数字插入列表中间的某个位置(或最后),我将内容更新为sum - number,这将是一个数字&gt; = 0,这是可以的。另外,我将新下一个元素(temp1
)的内容更新为temp->content - temp->content
。
出于某种原因,这不起作用。
当我插入4 2 8
而不是2 2 4
时,我将4 -2 6
作为结果列表。
答案 0 :(得分:0)
你的循环是“错误的”,sum开始为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 ...
}