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

動的リンクリストで車の情報を保存するC言語プログラム

リンクリスト(連結リスト)は、動的メモリ割り当てを利用するデータ構造です。データの追加や削除に応じてメモリ領域が柔軟に拡張・縮小されるため、事前に要素数を固定する必要がありません。リンクリストは「ノード」と呼ばれる要素の集合体であり、各ノードは次の2つの部分で構成されています。

  • データ(Data):実際の情報を格納する部分
  • リンク(Link):次のノードを指すポインタ

リンクリストの種類

C言語で利用できる主なリンクリストには、以下の4種類があります。

  • 片方向リンクリスト(単方向連結リスト)
  • 双方向リンクリスト(両方向連結リスト)
  • 循環片方向リンクリスト
  • 循環双方向リンクリスト

アルゴリズム

動的リンクリストを使用して車の情報を保存する手順は、以下の通りです。

  1. 構造体変数を宣言する。
  2. 情報を表示するための関数を定義する。
  3. malloc関数などにより、変数に動的にメモリを割り当てる。
  4. do-whileループを使って車の情報を入力する。
  5. 表示関数を呼び出して結果を出力する。

サンプルコード

以下は、動的リンクリストを使用して車の情報(モデル名・色・年式)を入力・保存する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関数による出力は空になります。
  1. C言語で連結リストの末尾からn番目のノードを取得するプログラム

    n個のノードからなる連結リストが与えられたとき、その末尾からn番目のノードを出力するのが本記事の目的です。プログラムはリスト内のノードの並び順を変更してはならず、あくまで末尾から数えてn番目に位置するノードの値を表示するだけでなければなりません。具体例入力 -: 10 20 30 40 50 60   N = 3 出力 -: 40上記の例では、先頭ノードから順に「count − n」個目までのノード(10, 20, 30, 40, 50, 60)を走査し、末尾から3番目のノードとして 40 が得られます。効率的なアプローチリスト全体を最後まで走査しなくても、以下の手順で目的のノードを見つけられ

  2. リンクリスト(隣接リスト)を使ってグラフを表現するC++プログラム

    グラフをコンピュータのメモリ上に格納する方法はいくつかあります。そのひとつが接続行列(インシデンス行列)です。この行列は正方行列ではなく、そのサイズは V × E となります。ここで V はグラフの頂点数、E は辺の本数を表します。接続行列では、各行に頂点を、各列に辺を配置します。この表現では、辺 e = {u, v} に対して、列 e のうち頂点 u と頂点 v に対応する位置に 1 がマークされます。接続行列による表現の計算量接続行列による表現では、O(V × E) のメモリ領域が必要になります。完全グラフの場合、辺の本数は V(V−1)/2 となるため、接続行列はメモリを大きく消費します