構造体と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; } |
関連記事
コメントを残す