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

C言語で連結リストの交互ノードを出力する方法(反復法)

この問題では、与えられた連結リストから交互のノードを出力するプログラムを作成します。つまり、1つ飛ばしでノードを表示していく処理を、反復法(イテレーティブな手法)を用いて実装します。

反復法とは、条件が真(true)である限り繰り返し実行されるループを使用する手法のことです。

例えば、リストに 29、34、43、56、88 というノードが格納されている場合、出力結果は交互ノードである 29、43、88 となります。

入力: 29->34->43->56->88
出力: 29 43 88

アプローチ

基本的な考え方は、リストを最後のノードまで走査するというものです。走査中にカウンタ変数を用意し、1ずつ増加させながら、カウンタが偶数または奇数のときに値を出力します。どちらを使うかは実装者の選択によります。先頭のノード(インデックス0)から表示したい場合は偶数カウンタのタイミングで出力し、2番目のノードから表示したい場合は奇数カウンタのタイミングで出力します。

以下に、このアルゴリズムのC言語による実装を示します。

アルゴリズム

START
    Step 1 -> 構造体としてノード変数を作成する
        int型のdataを宣言
        ノード型のポインタ *next を宣言
    Step 2 -> 関数 void alternate(struct node* head) を宣言
        int count = 0 を設定
        ループ While (head != NULL)
        IF count % 2 = 0 の場合
            head->data を出力
            count++ を実行
            head = head->next を設定
        End
    Step 3 -> 関数 void push(struct node** header, int newdata) を宣言
        malloc関数を使用してnewnodeを作成
        newnode->data = newdata を設定
        newnode->next = (*header) を設定
        (*header) = newnode を設定
    Step 4 -> main() 内で
        struct node* head = NULL として先頭ノードへのポインタを作成
        alternate(head) を呼び出す
STOP

C言語での実装例

#include <stdio.h>
#include <stdlib.h>
//ノードの構造体を定義
struct node {
    int data;
    struct node* next;
};
//交互ノードを検索して出力する関数
void alternate(struct node* head) {
    int count = 0;
    while (head != NULL) {
        if (count % 2 == 0)
            printf(" %d ", head->data);
        count++;
        head = head->next;
    }
}
//リストに要素を追加する関数
void push(struct node** header, int newdata) {
    struct node* newnode =
    (struct node*)malloc(sizeof(struct node));
    newnode->data = newdata;
    newnode->next = (*header);
    (*header) = newnode;
}
int main() {
    printf("alternate nodes are :");
    struct node* head = NULL;
    push(&head, 1); //push関数を呼び出してリストに要素を追加
    push(&head, 9);
    push(&head, 10);
    push(&head, 21);
    push(&head, 80);
    alternate(head);
    return 0;
}

出力結果

上記のプログラムを実行すると、次のような出力が得られます。

alternate nodes are : 80 10 1

なお、push関数はリストの先頭に要素を追加する方式のため、挿入した順序とは逆の順序でリストが構築されます。そのため、出力結果も 80、10、1 という順番になっています。

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

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

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

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