![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
名簿管理システムとしてメンバの追加、メンバの削除、メンバリストを名前順(アルファベット昇順)で表示、メンバリストのファイル出力
引数としてファイルパスを指定することによるメンバ初期データの読込ができるプログラムを以下のように作成しました。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
typedef struct tagNode{
int no;
char name[30];
struct tagNode *next;
}Node;
Node *ApndNode(Node *top, int no, char *name)
{
if(top == NULL){
top = (Node*)calloc(1, sizeof(Node));
top->no = no;
strcpy(top->name, name);
top->next = NULL;
}else{
if(strcmp(top->name, name) > 0){
Node *p = (Node*)calloc(1, sizeof(Node));
p->no = no;
strcpy(p->name, name);
p->next = top;
top = p;
}else{
top->next = ApndNode(top->next, no, name);
}
}
return top;
}
Node *DltNode(Node *top, int no, char *name)
{
if(top != NULL){
if(top->no == no && !strcmp(top->name, name)){
Node *p = top->next;
free(top);
top = p;
}else{
top->next = DltNode(top->next, no, name);
}
}
return top;
}
void PrintList(Node *top)
{
if(top != NULL){
printf("%-10d %s\n", top->no, top->name);
PrintList(top->next);
}
}
void PrintFile(Node *top)
{
FILE *fp;
char file_name[256];
Node *p = top;
printf("file name : "); scanf("%s", file_name);
fp = fopen(file_name, "w");
if(!fp) return;
while(p != NULL){ fprintf(fp, "%d %s\n", p->no, p->name); p = p->next;}
fclose(fp);
}
void FreeList(Node *top)
{
while(top != NULL){
Node *p = top->next;
free(top);
top = p;
}
}
int main(int argc, char *argv[])
{
Node *top = NULL;
int no, op;
char name[30];
while ((op = getopt(argc, argv, "f:")) != -1){
switch (op){
case 'f':
do{
FILE *fp = fopen(optarg, "r");
if(!fp) break;
while(fscanf(fp, "%d%s", &no, name) == 2) top = ApndNode(top, no, name);
fclose(fp);
}while(0);
}
}
while(1){
printf("--------command--------\n");
printf("1.Append\n2.Delete\n3.Show\n4.Save\n5.Quit\n");
printf("-----------------------\n");
printf("op : "); scanf("%d", &op);
if(op == 5) break;
switch(op){
case 1: printf("no : "); scanf("%d", &no);
printf("name : "); scanf("%s", name);
top = ApndNode(top, no, name);
break;
case 2:
printf("no : "); scanf("%d", &no);
printf("name : "); scanf("%s", name);
top = DltNode(top, no, name);
break;
case 3: printf("=========list==========\n");
printf("<no> <name>\n");
PrintList(top);
printf("=======================\n");
break;
case 4: PrintFile(top);
break;
}
}
FreeList(top);
return 0;
}
このプログラムに名前によって検索できる機能をつけるにはどのようにすればよいのでしょうか?教えてください。
No.1ベストアンサー
- 回答日時:
★アドバイス
・まずはメニューに検索を追加してみましょう。
static const char *menu[] = {
"--------command--------",
"1.Append",
"2.Delete",
"3.Show",
"4.Save",
"5.Find", ←これ追加
"9.Quit",
"-----------------------",
NULL,
}; int i;
// メニューの表示部
for ( i = 0 ; menu[i] != NULL ; i++ ){
puts( menu[i] );
}
・あと switch 文にも追加。
Node *find; ←宣言部に追加。
switch ( op ){
case 1:
:
省略
:
case 5:
printf( "name : " ); scanf( "%s", name );
find = FindNode( top, name ); ←name 文字列を検索して見つかったらそのポインタを返す
DispNode( find ); ←1つのノードを表示する関数
break;
}
・検索用の関数は次のようにすれば良い。
// 名前で検索
Node *FindNode( Node *top, const char name[] )
{
for ( ; top != NULL ; top = top->next ){
if ( !strcmp(top->name,name) ){
return top; ←見つかった場合
}
}
return NULL; ←見つからない場合
}
その他:
・無限ループは while (1){ … } 以外にも for ( ; ; ){ … } でも出来ます。
void DispNode( Node *node ); は自分で作成してみて下さい。
↑
この関数は node=NULL の場合は何も表示しないようにします。
・以上。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- JavaScript console.logがどうしても2つ機能しないのでアドバイスをくださいお願いします 2 2022/07/07 22:13
- JavaScript JavascriptからSQLへ繋ぎ方が分からない 3 2022/07/07 00:27
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
[python] 文字列を変数名として...
-
コンボボックスのtag情報の取得...
-
実行時エラー 3020の対策
-
バッチファイル 戻り値
-
VB6のLSETをVB2005で実現するに...
-
構造体の各データの表示につい...
-
vbaでxmlからNodeListでデータ...
-
ACCESS テキストボックスを隙...
-
VBAでPDFのコピーとリネームを...
-
エクセルVBA シート名の部分一...
-
【メモリ不足で落ちる(python)】
-
JSONで文字列が長い時
-
<SELECT>タグの折り返し
-
メモリをアドレスを直接指定し...
-
formで特定のinputを送信しない...
-
セレクトボックスのselected属...
-
文字の横にプルダウンを表示さ...
-
実行中の変数の中身をイミディ...
-
セレクトメニューで2つの項目...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
[python] 文字列を変数名として...
-
実行時エラー 3020の対策
-
VBAでPDFのコピーとリネームを...
-
FindFirst を複数条件で検索
-
ACCESS テキストボックスを隙...
-
コンボボックスのtag情報の取得...
-
構造体の各データの表示につい...
-
構造体の変数の値を、動的に取...
-
vbaでxmlからNodeListでデータ...
-
phpでボタンを押したときに変数...
-
C言語 家系図
-
【メモリ不足で落ちる(python)】
-
MSXMLでの属性の存在確認法
-
UWSC:ポップアップウインドウ...
-
2つのpythonがあって、一方で...
-
バッチファイル 戻り値
-
セカンダリDNSが正常かどうか確...
-
「*:*」って何を意味するのでし...
-
エクセルVBA シート名の部分一...
おすすめ情報