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