实现特定类型的单链表

时间:2013-08-18 23:10:04

标签: c++ insert linked-list queue singly-linked-list

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作为结果列表。

1 个答案:

答案 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 ... 
 }