動的リンクリストで車の情報を保存するC言語プログラム
リンクリスト(連結リスト)は、動的メモリ割り当てを利用するデータ構造です。データの追加や削除に応じてメモリ領域が柔軟に拡張・縮小されるため、事前に要素数を固定する必要がありません。リンクリストは「ノード」と呼ばれる要素の集合体であり、各ノードは次の2つの部分で構成されています。
- データ(Data):実際の情報を格納する部分
- リンク(Link):次のノードを指すポインタ
リンクリストの種類
C言語で利用できる主なリンクリストには、以下の4種類があります。
- 片方向リンクリスト(単方向連結リスト)
- 双方向リンクリスト(両方向連結リスト)
- 循環片方向リンクリスト
- 循環双方向リンクリスト
アルゴリズム
動的リンクリストを使用して車の情報を保存する手順は、以下の通りです。
- 構造体変数を宣言する。
- 情報を表示するための関数を定義する。
- malloc関数などにより、変数に動的にメモリを割り当てる。
- do-whileループを使って車の情報を入力する。
- 表示関数を呼び出して結果を出力する。
サンプルコード
以下は、動的リンクリストを使用して車の情報(モデル名・色・年式)を入力・保存するC言語プログラムの例です。このプログラムでは、表示時に「年式が2010年より後かつ色が黄色」の車だけが出力されるように条件分岐を行っています。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node{
char model[10],color[10];
int year;
struct node *next;
};
struct node *temp,*head;
void display(struct node *head){
temp=head;
while(temp!=NULL){
if(temp->year>2010 && (strcmp("yellow",temp->color)==0))
printf(" %s \t\t %s \t\t %d",temp->model,temp->color,temp->year);
temp=temp->next;
printf("\n");
}
}
int main(){
int n;
char option,enter;
head=(struct node *)malloc(sizeof(struct node));
temp=head;
do{
printf("\nenter car model: ");
scanf("%s",temp->model);
printf("enter car color: ");
scanf("%s",temp->color);
printf("enter car year: ");
scanf("%d",&temp->year);
printf("\nDo you want continue Y(es) | N(o) : ");
scanf("%c",&enter);
scanf("%c",&option);
if (option!='N'){
temp->next=(struct node *)malloc(sizeof(struct node));
temp=temp->next;
} else {
temp->next=NULL;
}
}while(option!='N');
display(head);
return 0;
}
実行結果
上記のプログラムをコンパイルして実行すると、対話形式で車の情報を続けて入力できます。
enter car model: I20 enter car color: white enter car year: 2016 Do you want continue Y(es) | N(o) : Y enter car model: verna enter car color: red enter car year: 2018 Do you want continue Y(es) | N(o) : Y enter car model: creta enter car color: Maroon enter car year: 2010 Do you want continue Y(es) | N(o) : N
プログラムのポイント
malloc関数により、ノード1つ分のメモリを実行時に確保しています。- ユーザーが「N」を選択するまで、新しいノードをリストの末尾に追加しながらデータを登録していきます。
- 最後のノードの
nextポインタにはNULLを代入することで、リストの終端を明示しています。 - 上記の実行例では、「黄色かつ2010年より後の年式」に該当する車が存在しないため、display関数による出力は空になります。
-
C言語で連結リストの末尾からn番目のノードを取得するプログラム
n個のノードからなる連結リストが与えられたとき、その末尾からn番目のノードを出力するのが本記事の目的です。プログラムはリスト内のノードの並び順を変更してはならず、あくまで末尾から数えてn番目に位置するノードの値を表示するだけでなければなりません。具体例入力 -: 10 20 30 40 50 60 N = 3 出力 -: 40上記の例では、先頭ノードから順に「count − n」個目までのノード(10, 20, 30, 40, 50, 60)を走査し、末尾から3番目のノードとして 40 が得られます。効率的なアプローチリスト全体を最後まで走査しなくても、以下の手順で目的のノードを見つけられ
-
リンクリスト(隣接リスト)を使ってグラフを表現するC++プログラム
グラフをコンピュータのメモリ上に格納する方法はいくつかあります。そのひとつが接続行列(インシデンス行列)です。この行列は正方行列ではなく、そのサイズは V × E となります。ここで V はグラフの頂点数、E は辺の本数を表します。接続行列では、各行に頂点を、各列に辺を配置します。この表現では、辺 e = {u, v} に対して、列 e のうち頂点 u と頂点 v に対応する位置に 1 がマークされます。接続行列による表現の計算量接続行列による表現では、O(V × E) のメモリ領域が必要になります。完全グラフの場合、辺の本数は V(V−1)/2 となるため、接続行列はメモリを大きく消費します