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

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

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

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

Q&A

2回答

1885閲覧

リスト構造 ソート 並び替え、

shiokoj

総合スコア4

C

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

0グッド

1クリップ

投稿2019/12/17 06:05

編集2022/01/12 10:55

前提・実現したいこと

リスト構造体。ソート機能 昇順で並び替える機能の追加がしたい。何を使えばいいのか。switchの分岐のところで小文字でも通ってしますのですが、なぜでしょうか?

該当のソースコード

// 9-4sample.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。 // #pragma warning(disable:4996) #include <stdio.h> //入出力 ストリームやファイルの操作に関係する型マクロ、関数の宣、定義されている。  #include <string.h>//文字列操作に関する型、関数、マクロの宣言、定義 #include <stdlib.h>//一般ユーリリティに関する型、マクロ、関数の宣言、定義 #include <ctype.h>//文字の分類や変換に有用な関数が宣言されている typedef struct student//データ型に別の名前を与える。 型の定義 { char name[20]; //構造体STUDENTはchar型のname[20]と int id; //int型のid struct student* next; //次のデータがある場所 }STUDENTS; STUDENTS* head = NULL;//リストの先頭 ノードの存在する場所、アドレスを示すものなのでポインタ型 STUDENTS* tail = NULL;//リストの末尾 STUDENTS* createNode(void); void addNodeToList(void); void printList(void); void insertNodeToList(void); void deleteNodeFromList(void); void sortNodeToList(void); int main(void) { char input; char command; while (1) { printf("-------------操作方法-------------\n"); printf("A : リストの末尾にノードを追加します。\n"); printf("P : リスト内のノードを全て表示します。\n"); printf("I : リスト内の任意の場所にノードを挿入します。\n"); printf("F :リストの先頭にノードを追加します。\n"); printf("S : リスト内のノードを並び替えます。\n"); printf("D : リスト内の任意のノードを削除します。\n"); printf("Z : 終了します。\n"); printf("コマンドを入力してください:"); (void)scanf("%c", &input);// switch文の判定にアルファベットの大文字を使うため。 rewind(stdin); command = toupper(input); //入力されたアルファベットをtoupperで大文字に変換。 rewind(stdin); switch (command) { case 'A': addNodeToList(); // リスト末尾にノードを追加。 break; case 'P': printList(); // リストの内容を画面表示。 break; case 'I': insertNodeToList(); // 任意の場所にノードを挿入する。 break; //case 'F': // addFirst();//リストの先頭にノードを追加する。 // break; case 'S': sortNodeToList();//ソートを並び替える break; case 'D': deleteNodeFromList(); // 任意のノードを削除。 break; case 'Z'://閉じる exit(0); break; default://上記以外の処理 printf("無効なコマンドです。\n"); break; } printf("\n"); } return 0; } //---------------------------------------------------------------------- STUDENTS* createNode(void)// ノードを生成する関数。 { STUDENTS *newNodePtr; newNodePtr = (STUDENTS*)malloc(sizeof(STUDENTS));// 新しいノード1個分の領域を確保し、その場所を返す。28バイト分確保する return newNodePtr; } //---------------------------------------------------------------------- void addNodeToList(void)// リストの末尾にノードを追加する関数。 { STUDENTS *newNodePtr; int inputId; //学籍番号 char inputName[20]; //氏名 inputName[0] = '\0'; newNodePtr = createNode();// 新しいノードを作成。 printf("学籍番号を入力:"); (void)scanf("%d", &inputId);//10進数で表示 newNodePtr->id = inputId; printf("名前を入力:");//文字出力 (void)scanf("%s", inputName);//文字列で表示する strcpy_s(newNodePtr->name, inputName);//ノードの名前を入力された文字をinputNameで複写する //構造体のメンバ変数にアクセスする。 if (head == NULL && tail == NULL)//論理演算式(AND)headとtailの初期値が共にNULLならばリストが空、1回目は必ずここを通過する { head = newNodePtr; // リストが空の場合,新しいノードが、先頭かつ末尾になる。 tail = newNodePtr; // 先頭と末尾は同じ場所になる } else { tail->next = newNodePtr;// リストに1件以上ノードが存在する場合、末尾ノード(tail)のnextに、新しいノードの場所をセット。 tail = newNodePtr;// 追加した新しいノードをtailとする } tail->next = NULL;//tailの後には何も存在しないのでnextにNULLをセット printf("ノードを追加\n"); } //------------------------------------------------------------------------ /*void addFirst(void)*/ //------------------------------------------------------------------- void insertNodeToList(void)//任意の場所にノードを追加する関数 { char insertName[20] = ""; STUDENTS* current, * temp, * newNodePos; int inputId; char inputName[20]; inputName[0] = '\0'; printf("挿入先のノードの氏名を入力してください。\n"); printf("入力された氏名のノードの後ろに、新しいノードを挿入します。\n"); (void)scanf("%s", insertName); current = head;// リストの先頭から、挿入先ノードを探す while (current != NULL) { if (strcmp(current->name, insertName) == 0) { printf("ノードが見つかりました。\n"); break; } else { current = current->next; } } if (current == NULL) // ノードが見つからなかったら、何もせず戻る。 { printf("ノードが見つかりませんでした。\n"); return; } newNodePos = createNode();// 新規ノードを作成。 printf("学籍番号を入力:"); (void)scanf("%d", &inputId);//10進数で表示 newNodePos->id = inputId; printf("名前を入力:"); (void)scanf("%s", inputName); //入力した文字列をそのまま文字列で表示する strcpy_s(newNodePos->name, inputName);//新規のノードに氏名を複写する // tempに、挿入先ノードの「1つ後ろのノード」の場所を一時記憶。(1) temp = current->next; // 挿入先ノードのnextに、新規ノードを追加。(2) current->next = newNodePos; // さっき一時記憶した場所(temp)を、新規ノードの「次の場所」にする。(3) newNodePos->next = temp;//(1)で記憶したノードを新規ノードの次の場所に設定する printf("ノードを挿入しました。\n"); } //------------------------------------------------------------------- void deleteNodeFromList(void)//指定したノードを削除する関数 { char deleteName[20] = ""; STUDENTS* current, * prev; printf("削除するノードの氏名を入力してください。\n"); (void)scanf("%s", deleteName); // リストの先頭から、nameが一致するノードを探します。 current = head; prev = NULL; while (current != NULL) { if (strcmp(current->name, deleteName) ==0 )//複写文字列の語尾にはヌルがつけられる。 { // ノードが見つかればループ終了。 printf("ノードが見つかりました。\n"); break; } else { // 現在のノードを1つ前のノード(prev)として記憶。(1) prev = current; current = current->next; } } // 挿入先ノードが見つからなかったら、何もせず戻る if (current == NULL) { printf("ノードが見つかりませんでした。\n"); return; } if (current == head) { // 削除対象が先頭のノードだった場合。(2) // 先頭の次のノードを新しいheadとする。 head = current->next; // 削除対象のノードを開放。メモリの領域を開放する。 free(current); } else { // 削除対象が先頭のノードではない場合。(3) // 「削除対象の1つ前」のnextに、「削除対象の1つ後ろ」をセット。 prev->next = current->next; // 削除対象のノードを開放。 free(current); } printf("削除が完了しました。\n"); } //------------------------------------------------------------------------------ void printList(void)// リストの内容を全て表示する関数。 { STUDENTS* current; if ((head == NULL) && (tail == NULL)) { printf("リストは空です。\n");// 表示するものがない場合は何もせずにreturn。 return; } current = head;// 先頭から表示するので、現在の位置をheadにセット。 printf("----------------------------------\n"); while (1) { printf("学籍番号 : %d\n", current->id);//アロー演算子 構造体のメンバ変数にアクセスするために使われる printf("名前 : %s\n", current->name); printf("自身のノードの場所 : %p\n", current); printf("次のノードの場所 : %p\n", current->next); printf("----------------------------------\n"); if (current->next != NULL) { current = current->next;// 次の場所がNULLではない、次のノードがある。 現在の場所を次のノードに移動。 } else { // 次の場所がNULLなら、現在の場所はリストの末尾,次のデータはないので、breakでループ終了。 printf("最後まで表示しました。\n"); break; } } } //------------------------------------------------------------------------------------- void sortNodeToList(void) //ノードを番号順降順にソートする関数 // プログラムの実行: Ctrl + F5 または [デバッグ] > [デバッグなしで開始] メニュー // プログラムのデバッグ: F5 または [デバッグ] > [デバッグの開始] メニュー // 作業を開始するためのヒント: // 1. ソリューション エクスプローラー ウィンドウを使用してファイルを追加/管理します // 2. チーム エクスプローラー ウィンドウを使用してソース管理に接続します // 3. 出力ウィンドウを使用して、ビルド出力とその他のメッセージを表示します // 4. エラー一覧ウィンドウを使用してエラーを表示します // 5. [プロジェクト] > [新しい項目の追加] と移動して新しいコード ファイルを作成するか、[プロジェクト] > [既存の項目の追加] と移動して既存のコード ファイルをプロジェクトに追加します // 6. 後ほどこのプロジェクトを再び開く場合、[ファイル] > [開く] > [プロジェクト] と移動して .sln ファイルを選択します

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

cateye

2019/12/17 06:25

で、何が聞きたいんでしょう?
2KOH

2019/12/17 06:42

マージソートを使って昇順で並び替える機能の追加がしたいのであれば、マージソートを使って昇順で並び替える機能を追加すればいいと思います。 なお、「マージソートを使って昇順で並び替える機能を追加してほしい」は質問ではなく作業依頼です。
guest

回答2

0

何を使えばいいのか。

頭を使って考えたり、PCや書籍を使って調べたりすればいいと思います。

switchの分岐のところで小文字でも通ってしますのですが、なぜでしょうか?

switch文の二行上に、

c

1command = toupper(input); //入力されたアルファベットをtoupperで大文字に変換。

があるからだと思います。

投稿2019/12/17 07:12

2KOH

総合スコア999

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

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

0

回答ではありません。
"9-4sample.cpp"ってこのコード何処から持ってきました?
・・・意味のわからないコードについての質問は止めましょう・・・
//
ヒント
1.リストを比較する関数
2.リストの要素を交換する関数
・・・がいります。

投稿2019/12/17 08:42

cateye

総合スコア6851

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問