C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でリンクリスト内の各ノードの小さい方の要素を合計する方法

この問題では、2つの整数値(X と Y)と次のノードへのポインタを持つノードから構成されるリンクリストが与えられます。求めるのは、各ノードにおける小さい方の値をすべて合計した結果です。

リンクリストの各ノードには X と Y という2つの値が格納されています。プログラムは各ノードごとに X と Y を比較して小さい方を選び、それらをすべて足し合わせた値を出力します。

入力例

(5,2)->(7,9)->(6,3)->(36,24)->(19,26)->null

出力例

55

計算の流れ

各ノードで X と Y のうち小さい方の値を取り出します。

node1 - 最小値 = 5
node2 - 最小値 = 7
node3 - 最小値 = 3
node4 - 最小値 = 24
node5 - 最小値 = 19
合計 = 55

この問題は、非常にシンプルなアプローチで解くことができます。リストを先頭から順に走査しながら、各ノードの X と Y を比較して小さい方を求め、それを合計用の変数に加えていきます。リストの終端に到達した時点で合計値を返せば完了です。

アルゴリズム

初期化 − sum = 0

ステップ1 − リストを走査し、以下の処理を行います。

ステップ1.1 − head→X と head→Y のうち小さい方を求めます。

ステップ1.2 − 求めた最小値を sum に加算します。

ステップ2 − 走査が終わったら sum を返します。

C++による実装例

以下は、上記アルゴリズムの動作を示すC++プログラムです。

#include <iostream>
using namespace std;
struct Node {
    int X;
    int Y;
    Node* next;
};
void addNode(Node** head, int x, int y){
    Node* ptr = *head;
    Node* temp = new Node();
    temp->X = x;
    temp->Y = y;
    temp->next = NULL;
    if (*head == NULL)
        *head = temp;
    else {
        while (ptr->next != NULL)
            ptr = ptr->next;
        ptr->next = temp;
    }
}
int findMinSum(Node* head){
    int sum = 0;
    while (head != NULL) {
        sum += min(head->X , head->Y);
        head = head->next;
    }
    return sum;
}
int main(){
    Node* head = NULL;
    addNode(&head, 5, 2);
    addNode(&head, 7, 9);
    addNode(&head, 6, 3);
    addNode(&head, 36, 24);
    addNode(&head, 19, 26);
    cout<<"リンクリスト内のノードの小さい方の要素の合計は "<<findMinSum(head)<<endl;
    return 0;
}

実行結果

リンクリスト内のノードの小さい方の要素の合計は 55
  1. C++で循環リンクリストのノード数をカウントする方法

    ノードから構成される循環リンクリスト(Circular Linked List)が与えられ、そのリスト内に存在するノードの総数を求めるのが課題です。 循環リンクリストとは、連結リストの一種であり、最初の要素が最後の要素を指し、最後の要素が最初の要素を指すという特徴を持つデータ構造です。片方向リンクリスト(Singly Linked List)でも双方向リンクリスト(Doubly Linked List)でも、この循環リンクリストとして実装することが可能です。 以下のプログラムでは、片方向リンクリストを循環リンクリストとして実装し、その中に含まれるノード数をカウントする方法を紹介します。 具体

  2. 【C++】再帰を使ってリンクリストの交互ノードを出力する方法

    リンクリスト(連結リスト)とはリンクリストは、各要素(ノード)をメモリ上の連続しない領域に格納できる線形データ構造です。各ノードにはデータ本体と、次のノードを指すポインタが含まれており、ポインタをつなぐことで一連のリストとして扱うことができます。問題の概要今回は、与えられたリンクリストを走査し、交互(ひとつおき)のノードだけを出力するプログラムを作成します。具体的には、1番目・3番目・5番目…というように、奇数番目の要素のみを順に出力していきます。入出力例入力 : 2 -> 4 -> 1 -> 67 -> 48 -> 90 出力 : 2 -> 1 ->