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

連結リストの交互ノードの積を求めるアルゴリズムとC言語での実装

n個のノードからなる連結リストが与えられたとき、交互(隔番目)のノードの値の積を出力するのが課題です。プログラムはノードの位置を実際に変更することなく、交互ノードの積だけを出力しなければなりません。

入力 -: 10 20 30 40 50 60
出力 -: 15000

上記の例では、先頭ノードである10から数えて、交互ノードは「10、30、50」となります。その積は 10 × 30 × 50 = 15000 です。

連結リストの交互ノードの積を求めるアルゴリズムとC言語での実装

上図では、先頭ノードから数えた場合の交互ノードが青色で示されており、赤色のノードは計算対象外となります。

アプローチ

  • node型の一時ポインタ(例:temp)を用意します。

  • このtempポインタを、headポインタが指す先頭ノードに設定します。

  • (temp->next != NULL && temp != NULL && temp->next->next != NULL) という条件が成り立つ間、temp を temp->next->next へと2つずつ進めます。

  • product = product * (temp->data) として、通過した各交互ノードの値を積算していきます。

アルゴリズム

Start
Step 1 -> ノードの構造体を作成し、temp・next・head を構造体nodeへのポインタとして宣言する
    struct node
        int data
        struct node *next, *head, *temp
    End
Step 2 -> リストにノードを挿入する関数を宣言する
    void insert(int val)
        struct node* newnode = (struct node*)malloc(sizeof(struct node))
        newnode->data = val
        IF head == NULL
            head = newnode
            head->next = NULL
        End
        Else
            temp = head
            Loop While temp->next != NULL
                temp = temp->next
            End
            newnode->next = NULL
            temp->next = newnode
        End
Step 3 -> リストを表示する関数を宣言する
    void display()
        IF head == NULL
            Print "no node"
        End
        Else
            temp = head
            Loop While temp != NULL
                Print temp->data
                temp = temp->next
            End
        End
Step 4 -> 交互ノードの積を求める関数を宣言する
    void alternate()
        int product を宣言
        temp = head
        product = head->data
        Loop While (temp->next != NULL && temp != NULL && temp->next->next != NULL)
            temp = temp->next->next
            product = product * (temp->data)
        End
        Print product
Step 5 -> main() 内で
    struct node* head = NULL; によりリストを作成
    insert(10) を呼び出してノードを挿入
    display() を呼び出してリストを表示
    alternate() を呼び出して交互ノードの積を求める
Stop

C言語による実装コード

#include<stdio.h>
#include<stdlib.h>
// ノードの構造体
struct node {
    int data;
    struct node *next;
}*head,*temp;
// リストにノードを挿入する関数
void insert(int val) {
    struct node* newnode = (struct node*)malloc(sizeof(struct node));
    newnode->data = val;
    if(head == NULL) {
        head = newnode;
        head->next = NULL;
    } else {
        temp=head;
        while(temp->next!=NULL) {
            temp=temp->next;
        }
        newnode->next=NULL;
        temp->next=newnode;
    }
}
// リストを表示する関数
void display() {
    if(head==NULL)
        printf("no node ");
    else {
        temp=head;
        while(temp!=NULL) {
            printf("%d ",temp->data);
            temp=temp->next;
        }
    }
}
// 交互要素の積を求める関数
void alternate() {
    int product;
    temp=head;
    product=head->data;
    while(temp->next!=NULL && temp!=NULL && temp->next->next!=NULL) {
        temp=temp->next->next;
        product=product * (temp->data);
    }
    printf("\nproduct of alternate nodes is %d : " ,product);
}
int main() {
    // リストの作成
    struct node* head = NULL;
    // 要素の挿入
    insert(10);
    insert(20);
    insert(30);
    insert(40);
    insert(50);
    insert(60);
    // リストの表示
    printf("linked list is : ");
    display();

    // 交互ノードの積を求める関数の呼び出し
    alternate();
    return 0;
}

実行結果

linked list is : 10 20 30 40 50 60
product of alternate nodes is : 15000

処理のポイント

このアルゴリズムの時間計算量は O(n)、空間計算量は O(1) です。ポインタを2つ先へ進める操作(temp->next->next)によって1つおきにノードを訪問できるため、追加の配列や再帰を使わずに効率的に積を求められます。なお、while文の条件式では NULL 参照を避けるため、必ず「temp->next != NULL」を先に評価する順序が重要です。

  1. 【C++】循環リンクリストのノード値の合計を求める方法

    この記事では、循環リンクリスト(Circular Linked List)が与えられたときに、すべてのノードの値の合計を求めるプログラムをC++で作成する方法を解説します。 やるべきことはシンプルで、リンクリストを構成する全ノードの値を順番に読み取り、それらを加算していくだけです。 前提知識:重要な定義 リンクリストとは リンクリスト(連結リスト)とは、各データ(ノード)をポインタによるリンクで相互に接続したデータ構造の列です。配列と異なり、メモリ上の連続した領域を必要とせず、動的な挿入や削除に強いという特徴があります。 循環リンクリストとは 循環リンクリストはリンクリストの変形の一種で、先

  2. C++で連結リストの交互ノードの合計を求める方法(反復法・再帰法)

    問題概要 この記事では、連結リスト(リンクリスト)が与えられたときに、その交互ノード(0、2、4…番目のノード)の値の合計を求める方法を解説します。 連結リストとは、リンク(ポインタ)によって順次接続されたデータ構造の列です。各ノードはデータ本体と、次のノードを指す参照を持っています。 今回の課題は、連結リストのうち位置 0、2、4、6 … にあるノード、つまり先頭から1つおきのノードの値をすべて加算することです。 入出力例 入力: 4 → 12 → 10 → 76 → 9 → 26 → 1 出力: 24 説明: 交互ノードを取り出すと − 4 + 10 + 9 + 1 = 24 解決の考