質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Q&A

3回答

2669閲覧

学生追加の連結リスト

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

0グッド

0クリップ

投稿2015/11/26 07:03

大学の問題で
「add関数の内容を実装し、連結リストに学生が追加でき るようにせよ
以下の順番で3パターンの実装を行うこと
▪ パターン1:テンプレートの状態(最初に3名登録されてい る状態を想定)から常に学生をリストの先頭に追加できるよ うにせよ
▪ パターン2:パターン1を改良し、テンプレートの状態(最 初に3名登録されている状態を想定)から常に学生をリスト の末尾に追加できるようにせよ(最後尾の直前の要素を探す アルゴリズムが必要)
▪ パターン3(余裕がある人だけでよい):パターン2を改良 し、登録されている学生が0名の場合でも、既に登録されて いる学生がいる場合も、常にリストの末尾に学生を追加でき るようにせよ」
というものがあります。3まで終わったらそのファイルを提出すればいいとのことです。
パターン1の段階から引っかかってしまい前に進めません。どうすれば実行できますか?

C

1// 2// 学生名簿プログラム(リスト使用) 3// アルゴリズム応用 第8回課題-1 4// 5 6#include <stdio.h> 7#include <stdlib.h> 8 9/* 学生の構造体 */ 10typedef struct Meibo { 11 int number; 12 char name[10]; 13 int credits; 14 struct Meibo *next; //後続へのポインタ 15} Meibo; 16 17Meibo *head = NULL; //リストの先頭へのポインタ 18 19/* 一覧表示 */ 20void display(){ 21 Meibo *ptr; 22 printf("------------------\n"); 23 for(ptr = head; ptr != NULL; ptr = ptr->next){ 24 printf("%-3d%-10s%-3d\n", ptr->number, ptr->name, ptr->credits); 25 printf("------------------\n"); 26 } 27} 28 29/* 追加 */ 30void add(){ 31 //一人分のメモリを確保する 32 Meibo *student; 33 student = (Meibo *)malloc(sizeof(Meibo)); 34 35 if(student != NULL){ 36 //入力を受け取る 37 printf("学績番号\n"); 38 scanf("a = %d", &student->number); 39 printf("氏名\n"); 40 scanf("b = %s", student->name); 41 printf("総取得単位数\n"); 42 scanf("c = %d", &student->credits); 43 44 //リストに追加する 45 //ここを考えましょう 46 } 47} 48 49int main(void){ 50 //学生の基本情報を設定 51 Meibo st1 = { 1, "John", 30 }; 52 Meibo st2 = { 2, "Paul", 28 }; 53 Meibo st3 = { 3, "George", 20 }; 54 Meibo st4 = { a, b, c}; 55 56 //連結リストを作る 57 head = &st4; 58 st1.next = &st1; 59 st2.next = &st2; 60 st3.next = &st3; 61 62 // メニューの表示と実行 63 char cmd; 64 printf("a:追加 d:一覧表示 q:終了\n"); 65 while((cmd = getchar()) != 'q'){ 66 switch(cmd){ 67 case 'a': 68 add(); 69 break; 70 case 'd': 71 display(); 72 break; 73 case '\n':case ' ': 74 break; 75 default: 76 printf("不正なコマンドです\n"); 77 break; 78 } 79 } 80 81 printf("名簿プログラムを終了します。\n"); 82 83 return 0; 84}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

こんにちは。

そのものズバリを回答するのは簡単ですが、大学の課題ということですので答えを書くのはまずいかなと思い、ヒントをだそうと思ったのですが、うまくヒントがだせません。

いきなり下記の部分が間違っているのですが、この辺りも元々このようになっていたのでしょうか?

C

1 Meibo st4 = { a, b, c}; 2 3 //連結リストを作る 4 head = &st4; 5 st1.next = &st1; 6 st2.next = &st2; 7 st3.next = &st3;

本来は、この部分を参考にして下記を書けば良いのですが、ここが既に間違っているので説明が難しいのです。

//リストに追加する //ここを考えましょう

後、scanf()での読み出しも入力しづらい方法になってます。
①getchar()はちょっとクセがあります。つい先日似たような回答をしましたので、参考にして下さい。

②scanf("a = %d", ...);のようにすると、a = の部分も入力する必要があり、入力しにくいです。"a = "はscanf()に含めないことをお薦めします。

投稿2015/11/26 07:31

編集2015/11/26 07:32
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、連結リストを理解しましょう。
データ構造などの教科書には、矢印で繋がれたリストが表現されていると思います。
本題での初期状態は以下のようになります。

★本題での最初の状態★ head -> st3.next -> st2.next -> st1.next -> END(NULL)

まずこの、この状態を表すにはコードではどの様に書けば良いでしょうか。
回答者の皆様が、言われていますが、最初の連結リストの部分で勘違いされています。

//連結リストを作る head = &st4; st1.next = &st1; st2.next = &st2; st3.next = &st3;

これだと、以下の様になって連結されている状態ではありません。

★連結リストになっていません★ head -> st4 // st4? これはこれから追加するものを表しているのでしょうか? st1.next -> st1 // これでは、自分自身を指していますので、次を指すようにしましょう。 st2.next -> st2 // 以下同じ st3.next -> st3

パターン1の先頭に追加するには、headからの→を新しく追加するデータを指すようにすれば良いです。

★stXX.next 追加★ head -> stXX.next -> st3.next -> st2.next -> st1.next -> END(NULL)

では、がんばってください。

投稿2015/11/26 13:52

akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自分も新人の頃にやらされた研修問題なので、このくらい自分で考えたほうがいいですよ(笑

と言いたいところですが、ひとつ確認です
連結リストを作るところですが、head にst1のアドレスを設定し、st1.nextにはst2のアドレスを、st2.nextにはst3のアドレスを、st3.nextにはNULLを設定することで、構造体のチェーンを作成するのだと思います
このように構造体のチェーンを作り、常に
headからチェーンを検索していくことで、チェーンの先頭、チェーンの末尾を見つけて処理を行います

投稿2015/11/26 07:22

KatsumiTanaka

総合スコア924

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問