学生向けにプログラミングを解説。Studioで新規プロジェクトを作り、以下のcppファイルを作成して下さい。std::endl;}}リストでは、メモリを確保する際に余分にメモリを確保して、その余分なメモリにアドレスを入れておきます。自分のアドレスを入れておいても意味がないので、次のメモリを確保した際に前のメモリオブジェクト中にその新しく確保したメモリへのアドレスを入れておきます。このようにすることで、先頭のオブジェクトへのアドレスを覚えていれば、次のアドレスはそのオブジェクト中に埋め込まれているので、芋づる式にすべてのオブジェクトが探索できるわけである。この意味に置いて、リストは直線的につながっているので、線形リスト、片方向リストとも呼ばれています。通常、構造体の定義に自分自身を用いてはならないのですが、この場合はポインタなのでこの限りではありません。このようにしてできたnextには、もしそのオブジェクトが最後のオブジェクトならば次のデータは存在しませんので、NULLを入れておきます。NULLは何も存在しないという意味で使われます。リストの追加は、次のようにします。newl;}リストでは後戻りできないので、先頭のオブジェクトへのポインタは必ず覚えていなければなりません。上の関数newList()はそうしたリストの先頭オブジェクトへのアドレスを引数にとります。関数内部では、まず、新しいオブジェクトをmalloc()で割り当てて、それの後ろにはもうデータがないので最初からnextにNULLを代入しておきます。次に、先頭のオブジェクトへのポインタがNULLでないならば、リストにいくらかのオブジェクトが連なっていますから、先頭から順に次のオブジェクトへのアドレスを取り出し、最後のオブジェクトになるまで移動し、先に確保したオブジェクトをこのリストの最後のオブジェクトの後ろにぶら下げるために、そのアドレス(newl)を最後のオブジェクトのnextに入れています。**にしているのは、使うときには実際のリストの先頭へのアドレスを保持しているポインタ変数のアドレスを渡すようにします。従って、この関数を実際に使う場合には以下のようにして使う必要があります。*start=NULL;・・・・newList(&start);リストから特定のオブジェクトを削除する場合には、単にfree()してはいけません。オブジェクトの連鎖から取り除いた後にfree()しなければなりません。p;}上のプログラムでは、引数にリストの先頭と削除対象のオブジェクトへのポインタ(target)を与え、targetを指している一つ前のオブジェクトのnextを一つ飛ばしのオブジェクトへと入れ替えてから、targetのオブジェクトをメモリから削除しています。リスト構造の柔軟性は、リストへのオブジェクトの挿入でも見られます。リストの挿入は、すでにオブジェクトが用意されていた場合次のように簡単なものです。target;}ここで、beforeはオブジェクトを挿入したい場所の前に位置するリンクのオブジェクトであり、newlは新たに挿入したいオブジェクトです。ポイントは、beforeの次にnewlが来るようにし、newlの後ろにもともとbeforeの後ろに位置していたオブジェクトを繋げることです。このプログラムでは先頭にオブジェクトを入れることができないので注意してください。ファイルの入出力について説明します。ファイルを入出力に使うためには、まず実際のデータの入出力に先立って、どのファイルをどの様に使うかを指定しなければいけません。これをファイルをオープンするといいます。このために使われる関数が、open()ですが、C++では少し特殊なやり方で用います。);std::cinを用いて出力するやり方に少し似ていますが、自分でfinという変数を宣言しなければならない点が少し違います。宣言した後に、どのファイルに対して読み書きを行うかを指定するために、ファイル名をopen()を用いて指定しなければなりません。open()関数を使うには先頭で#includeを記述しなければいけません。”test.data”というファイルを読み込み用にオープンするには以下のように指定します。std::ios::in);同じように書き込みようにファイルをオープンするには以下のようにします。・・・・もし、このファイルが存在しない場合には新たに自動的に作成されますが、逆に存在した場合にはそのファイルの中身はすべて消されてしまいますので注意が必要です。std::iso::outモードではファイルを消してしまうことになりますので、ファイルを消さずに書き込みを行うにはstd::iso::appモードを用います。std::iso::app);この場合、もしファイルが存在したならば、そのファイルの最後に追加して書き込みがなされます。ファイルが存在しないならば、新たに作成される点はstd::iso::outモードと同じです。実際の入出力については次の項目で取り扱うことにして、入出力が終了し、ファイルの読み書きを終了し、オープンしたファイルをクローズする際にはclose()を用います。fout.close();ファイルに対する入出力は、std::cinやstd::coutと同じようにして一文字の読み書も出来ます。"test";ではこのサンプルプログラムについて少し説明します。このプログラムは片方向リンクリストのサンプルプログラムです。ファイルから読み込んだ文字列を記憶し、読み込み終了後、それらを順に出力するプログラムです。newObj()関数では、dataのメモリを確保し、構造体のメンバーにアドレスを代入して返します。std::endl;}の部分では、リストのデータを画面に出力しています。xpがNULLになるまでループ続きます。いうファイルをCドライブに作成した「test」というフォルダに入れています。そのアドレス指定が以下の部分です。ios::in);実行結果です。Studioで新規プロジェクトを作り、以下のcppファイルを作成して下さい。}}これまでのリストは、頭から順にしか探索できないもので、その意味で片方向リンクリストと呼ばれますが、ここでは後戻りもできる双方向リンクリストについて考えます。*data;};双方向リンクリストで重要な点は、リストの両端にあるオブジェクトでは、必ずprevか、あるいはnext変数の何れかがNULLになっている点です。双方向リンクリストでは、片方向リンクリストと違って、特別な先頭アドレスを覚えておく必要はなく、リストのどれかのオブジェクトの位置さえ失わなければ、常にリストの全オブジェクトが得られますが、そのためにリスト中をいったりきたりしなければならなくなるので、効率という点からするとやはり先頭アドレスを保持していた方が良いでしょう。このサンプルプログラムは、双方向リンクリストの例になっています。順方向と逆方向に表示します。今回は構造体のメンバーの型にvoidを使用しました。*body;これにより、いろいろな型のデータを格納できます。*)(xp->body)などとして、キャストします。Studioで新規プロジェクトを作り、以下のcppファイルを作成して下さい。リストへと格納するプログラムです。Cドライブの「test」フォルダに入れてあります。通年成績も計算し、格納しています。レポート提出回数、後期レポート提出回数になっています。この、スペースで区切られたデーターが、以下の部分で読み込まれます。){buf1が名前に対応します。