名簿管理システムとしてメンバの追加、メンバの削除、メンバリストを名前順(アルファベット昇順)で表示、メンバリストのファイル出力
引数としてファイルパスを指定することによるメンバ初期データの読込ができるプログラムを以下のように作成しました。
#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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
VBAでPDFのコピーとリネームを...
-
ACCESS テキストボックスを隙...
-
実行時エラー 3020の対策
-
2つのpythonがあって、一方で...
-
[python] 文字列を変数名として...
-
「*:*」って何を意味するのでし...
-
VBA他のブックから値のみ貼付す...
-
文字列を1つの要素とした配列...
-
ASPへの値渡し
-
コンボボックスのtag情報の取得...
-
構造体の各データの表示につい...
-
PHP+MySQLでクロス集計は出来ま...
-
セカンダリDNSが正常かどうか確...
-
JSONで文字列が長い時
-
VB6で、長い時間かかる処理...
-
formで特定のinputを送信しない...
-
テーブル内でドロップダウンメ...
-
セレクトメニューで2つの項目...
-
文字の横にプルダウンを表示さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
実行時エラー 3020の対策
-
VBAでPDFのコピーとリネームを...
-
ACCESS テキストボックスを隙...
-
[python] 文字列を変数名として...
-
構造体の各データの表示につい...
-
FindFirst を複数条件で検索
-
「*:*」って何を意味するのでし...
-
構造体の変数の値を、動的に取...
-
コンボボックスのtag情報の取得...
-
vbaでxmlからNodeListでデータ...
-
phpでボタンを押したときに変数...
-
C++ コマンドプロンプトでの入...
-
VBA他のブックから値のみ貼付す...
-
MSXMLでの属性の存在確認法
-
UWSC:ポップアップウインドウ...
-
エクセルVBA シート名の部分一...
-
【メモリ不足で落ちる(python)】
-
2つのpythonがあって、一方で...
-
use strict;
おすすめ情報