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 という順番になっています。
-
C++で連結リストの交互ノードの合計を求める方法(反復法・再帰法)
問題概要 この記事では、連結リスト(リンクリスト)が与えられたときに、その交互ノード(0、2、4…番目のノード)の値の合計を求める方法を解説します。 連結リストとは、リンク(ポインタ)によって順次接続されたデータ構造の列です。各ノードはデータ本体と、次のノードを指す参照を持っています。 今回の課題は、連結リストのうち位置 0、2、4、6 … にあるノード、つまり先頭から1つおきのノードの値をすべて加算することです。 入出力例 入力: 4 → 12 → 10 → 76 → 9 → 26 → 1 出力: 24 説明: 交互ノードを取り出すと − 4 + 10 + 9 + 1 = 24 解決の考
-
【C++】再帰を使ってリンクリストの交互ノードを出力する方法
リンクリスト(連結リスト)とはリンクリストは、各要素(ノード)をメモリ上の連続しない領域に格納できる線形データ構造です。各ノードにはデータ本体と、次のノードを指すポインタが含まれており、ポインタをつなぐことで一連のリストとして扱うことができます。問題の概要今回は、与えられたリンクリストを走査し、交互(ひとつおき)のノードだけを出力するプログラムを作成します。具体的には、1番目・3番目・5番目…というように、奇数番目の要素のみを順に出力していきます。入出力例入力 : 2 -> 4 -> 1 -> 67 -> 48 -> 90 出力 : 2 -> 1 ->