[C言語]リンクリストを使用したプログラムの基礎

構造体とmallocによるメモリの確保を利用した、リンクリストのサンプルプログラムです。

//----------------------------------------------------------------------
// File        : linklist.c
// Description : リンクリストを使用して、入力された点数の平均点を求める
//----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
 
struct t_scoreNode {
    int                Score; // 点数
    struct t_scoreNode *Next; // 次のデータへのポインタ
};
typedef struct t_scoreNode ScoreNode;
 
 
int main()
{
    ScoreNode *PtrRootNode = NULL; // 最初の要素
    ScoreNode *PtrCurNode  = NULL; 
    int status = 100;
    int score = 0;  // 入力された点数
    int total = 0;  // 合計点
    int count = 0;  // 入力人数
 
    while( 1 ) {
        //------------------------------------
        // 点数の入力を求める
        // (面倒なのでscanfで手抜きしてます) 
        //------------------------------------
        printf( "点数を入力してください :" );
        scanf( "%d", &score ); 
 
        //---------------------------------
        // 入力チェック
        //---------------------------------
        if ( score < 0 ) { 
            // 負の数が入力されたら処理終了とみなす
            printf( "終了します\n" );
            status = 0;
            break;
        }
 
        //---------------------------------
        // 入力された値をリンクリストに追加
        //---------------------------------
        if ( PtrRootNode == NULL ) {
            // 最初の要素の場合
            PtrRootNode = (ScoreNode *)malloc( sizeof( ScoreNode ) );
            if ( PtrRootNode == NULL ) {
                printf( "メモリの確保に失敗しました\n" );
                status = 1;
                break;
            }
 
            PtrRootNode->Score = score;
            PtrRootNode->Next  = NULL;
        } else {
            // 2つめ以降の要素の場合
 
            // 最後のノードを見つける
            PtrCurNode = PtrRootNode;
            while( PtrCurNode->Next != NULL ) {
                PtrCurNode = PtrCurNode->Next;
            }
 
            // 新しいノードを作成し、入力値をセット
            PtrCurNode->Next = (ScoreNode *)malloc( sizeof( ScoreNode ) );
            if ( PtrCurNode->Next == NULL ) {
                printf( "メモリの確保に失敗しました\n" );
                status = 1;
                break;
            }
 
            PtrCurNode->Next->Score = score;
            PtrCurNode->Next->Next  = NULL;
        }
 
        //------------------
        // 平均点を求める
        //------------------
        total = 0;
        count = 0;
        PtrCurNode = PtrRootNode;
        while( PtrCurNode != NULL ) {
            total += PtrCurNode->Score;
            count++;
            PtrCurNode = PtrCurNode->Next;
        }
 
        printf( "現在の入力数:%d人, 平均点:%.1lf\n", count, (double)total/count );
    }
 
    //-------------------------
    // 確保したメモリを開放する
    //-------------------------
    PtrCurNode = PtrRootNode;
    while( PtrCurNode != NULL ) {
        ScoreNode *PtrNextNode = PtrCurNode->Next;
        free( PtrCurNode );
 
        PtrCurNode = PtrNextNode;
    }
 
    return status;
}

関連記事

コメントを残す

メールアドレスが公開されることはありません。