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

【C言語】片方向リンクリストの各ノードの値を反転するプログラム

はじめに

本記事では、連結リストが与えられた際に、各ノードが保持する値を反転させるC言語プログラムの作成方法を解説します。

リンクリスト内の各ノードを順番に取り出し、そのノードの数値を桁ごとに逆順へ並べ替えていきます。

連結リストとは、データの要素(ノード)同士がポインタによって次々と連結された、線形データ構造の一種です。

具体例を使って問題を確認しましょう。

入力

34 12 89 56 72

出力

43 21 98 65 27

解決のためのアプローチ

この問題は、以下の手順で解くことができます。

  1. 片方向リンクリストを先頭から末尾まで走査します。
  2. 現在のノードの値を取り出し、数値として反転します。
  3. 反転した値をノードに書き戻し、次のノードへ進みます。
  4. リストの終端(NULL)に到達するまでこれを繰り返します。

数値の反転には、「10で割った余りを順に取り出して、新しい数値を組み立てていく」という定番のアルゴリズムを使用します。

各ノードの値を反転するC言語プログラム

#include <stdio.h>
#include <stdlib.h>

/* ノード構造体の定義 */
struct Node {
    int data;
    struct Node* next;
};

/* 新しいノードを生成する関数 */
struct Node* insertNode(int key) {
    struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
    temp->data = key;
    temp->next = NULL;
    return temp;
}

/* 数値を反転する関数 */
int reverseValue(int number) {
    int revElement = 0, rem;
    while (number != 0) {
        rem = number % 10;
        revElement = revElement * 10 + rem;
        number = number / 10;
    }
    return revElement;
}

/* リンクリスト内の全ノードの値を反転する関数 */
void reverseLinkedListElements(struct Node* node) {
    if (node == NULL)
        return;
    while (node != NULL) {
        node->data = reverseValue(node->data);
        node = node->next;
    }
}

/* リンクリストを表示する関数 */
void printLinkedList(struct Node* node) {
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
}

int main() {
    struct Node* head = NULL;
    head = insertNode(34);
    head->next = insertNode(12);
    head->next->next = insertNode(89);
    head->next->next->next = insertNode(56);
    head->next->next->next->next = insertNode(72);

    printf("元のリンクリスト :\t");
    printLinkedList(head);

    reverseLinkedListElements(head);

    printf("\n反転後のリンクリスト:\t");
    printLinkedList(head);

    return 0;
}

実行結果

元のリンクリスト : 34 12 89 56 72
反転後のリンクリスト: 43 21 98 65 27

まとめ

本記事では、片方向リンクリストの各ノードの値を反転するC言語プログラムを紹介しました。ポイントは、リスト全体を1回だけ走査し(計算量はO(n))、各ノードに対して数値反転用の補助関数を適用することです。数値の反転ロジックは、剰余演算(%10)と除算(/10)を組み合わせたシンプルなものであるため、文字列や配列など、他の場面にも容易に応用できます。

  1. 単方向リンクリストの全ノードの積を求めるアルゴリズムとC言語実装

    n個のノードで構成される単方向リンクリスト(片方向連結リスト)が与えられたとき、すべてのノードが保持する値の積を求めて出力するのがこの記事のテーマです。プログラムは先頭ノードからスタートし、リストの終端を示すNULLに到達するまで各ノードを順番にたどります。 例 入力 -: 1 2 3 4 5 出力 -: 120 上記の例では、先頭ノードから順に1、2、3、4、5のすべてのノードをたどり、それぞれの値を掛け合わせています。したがって積は 1×2×3×4×5 = 120 となります。 使用するアプローチ 以下の手順で全ノードの積を計算します。 node型の一時ポインタ(ここでは temp と

  2. 【C言語】連結リストを実際には反転せずに逆順で表示する方法

    この課題では、再帰関数を使用して、与えられた連結リスト(リンクリスト)を逆順に表示します。ポイントは、リストそのものを反転させるのではなく「逆順に表示する」だけである点です。つまり、ノードのつながりの順序は元のまま一切変わりません。 仕組みとしては、先頭ノードのアドレスを持つヘッドポインタが、リストの末尾ノードに格納されている NULL が見つかるまで次々と次のノードへ移動し、その後、呼び出しが戻りながら各ノードのデータを表示していきます。 実行例 Input: 29 34 43 56 Output: 56 43 34 29 まず、ノードをリストに挿入し、ポインタを挿入済みのノードに向けます。