【C言語】片方向リンクリストの各ノードの値を反転するプログラム
はじめに
本記事では、連結リストが与えられた際に、各ノードが保持する値を反転させるC言語プログラムの作成方法を解説します。
リンクリスト内の各ノードを順番に取り出し、そのノードの数値を桁ごとに逆順へ並べ替えていきます。
連結リストとは、データの要素(ノード)同士がポインタによって次々と連結された、線形データ構造の一種です。
具体例を使って問題を確認しましょう。
入力
34 12 89 56 72
出力
43 21 98 65 27
解決のためのアプローチ
この問題は、以下の手順で解くことができます。
- 片方向リンクリストを先頭から末尾まで走査します。
- 現在のノードの値を取り出し、数値として反転します。
- 反転した値をノードに書き戻し、次のノードへ進みます。
- リストの終端(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)を組み合わせたシンプルなものであるため、文字列や配列など、他の場面にも容易に応用できます。
-
単方向リンクリストの全ノードの積を求めるアルゴリズムとC言語実装
n個のノードで構成される単方向リンクリスト(片方向連結リスト)が与えられたとき、すべてのノードが保持する値の積を求めて出力するのがこの記事のテーマです。プログラムは先頭ノードからスタートし、リストの終端を示すNULLに到達するまで各ノードを順番にたどります。 例 入力 -: 1 2 3 4 5 出力 -: 120 上記の例では、先頭ノードから順に1、2、3、4、5のすべてのノードをたどり、それぞれの値を掛け合わせています。したがって積は 1×2×3×4×5 = 120 となります。 使用するアプローチ 以下の手順で全ノードの積を計算します。 node型の一時ポインタ(ここでは temp と
-
【C言語】連結リストを実際には反転せずに逆順で表示する方法
この課題では、再帰関数を使用して、与えられた連結リスト(リンクリスト)を逆順に表示します。ポイントは、リストそのものを反転させるのではなく「逆順に表示する」だけである点です。つまり、ノードのつながりの順序は元のまま一切変わりません。 仕組みとしては、先頭ノードのアドレスを持つヘッドポインタが、リストの末尾ノードに格納されている NULL が見つかるまで次々と次のノードへ移動し、その後、呼び出しが戻りながら各ノードのデータを表示していきます。 実行例 Input: 29 34 43 56 Output: 56 43 34 29 まず、ノードをリストに挿入し、ポインタを挿入済みのノードに向けます。