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 つで説明した問題に遭遇しましたが、それでも自分で解決策を実装しようとしています。要するに、「相対」リストを作成したいのです。たとえば、要素1 5 7 2 4 6の場合、リストは次のようになります1 1 2 1 1 1

優先度キュー リストを作成1 2 4 5 7 6し、前の要素に対して相対的に要素を変更します。最初の要素は 1 のまま、2 番目は 2-1 = 1、3 番目は 4-2 = 2、4 番目は 5-4 = 1 になります。等々。優先キューを形成すると、現在の要素をその値と前の要素の値の差で置き換えます。挿入機能の実装に問題があります。コードは質問の上部に記載されています。

アイデアは、リストを調べて、「違い」(Node* 構造のコンテンツ フィールド) をカウンター変数に追加することです。合計カウンターが挿入する必要がある要素以上になると、挿入する位置が見つかりました。

temp0 が null の場合、要素を最初の位置に挿入します。それが唯一の要素ではない場合は、次の要素のコンテンツを更新します。これは、前の最初の要素でした。

数値をリストの途中 (または末尾) に挿入する必要がある場合は、コンテンツを sum - number として更新します。これは数値 >= 0 で問題ありません。また、new の次の要素 ( 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 に答える