検索も、前回のコードを利用させていただき書いたのですが、リストの検索って以下のようなコードになるんでしょうか。まったくの見当ちがいでしょうか。利用したところ以外、へたくそです、
c
1#include <stdio.h> 2#include <stdlib.h> 3 4struct SUUJI{ 5 int suuji; 6 struct SUUJI *next; 7}; 8 9int main(void){ 10 11 12struct SUUJI *top1; 13struct SUUJI *top2; 14struct SUUJI *top3; 15struct SUUJI *top4; 16struct SUUJI *top5; 17struct SUUJI *top6; 18 19top1=(struct SUUJI *)malloc(sizeof(struct SUUJI)); 20top2=(struct SUUJI *)malloc(sizeof(struct SUUJI)); 21top3=(struct SUUJI *)malloc(sizeof(struct SUUJI)); 22top4=(struct SUUJI *)malloc(sizeof(struct SUUJI)); 23top5=(struct SUUJI *)malloc(sizeof(struct SUUJI)); 24top6=(struct SUUJI *)malloc(sizeof(struct SUUJI)); 25 26top1->suuji=1; 27top1->next=top2; 28 29top2->suuji=2; 30top2->next=top3; 31 32top3->suuji=3; 33top3->next=top4; 34 35top4->suuji=5; 36top4->next=top5; 37 38top5->suuji=5; //数字が同じものを用意しました。 39top5->next=top6; 40 41top6->suuji=6; 42 43top6->next=NULL; 44 45 46for(struct SUUJI *p=top1; p!=NULL; p=p->next){ 47 48 printf("%d->",p->suuji); 49 50} 51 52int count=0; 53int n; 54 printf("\n1kara5de kennsakutiwonyuuryokusitekudasai\n"); 55 scanf("%d",&n); 56 57for(struct SUUJI *p=top1; p!=NULL; p=p->next){ 58 if(p->suuji==n){ 59 60printf("%dga%dbanmedeixtutishimashita",n,count);} 61 62 else if( n<1||5<n){printf("1kara5wonyuuryokusitekudasai\n");return -1;} 63 64else {} 65 66count=count+1; 67} 68 69 70printf("\n"); 71 72return 0; 73} 74
1あってましたら1から5以外の数値を入力したときに、continue;かなんかで繰り返したかったけど、思いうかびませんでした。
2あと同じ数が複数個あったらどちらも抽出したいのですがどうしたらいいですか。(2はNULLのおかげでできてました)
3ノードの追加、削除のときでなくてもいいけど
検索範囲(1から5と想定してしまっている)追記、
一番大きい数と一番小さい数を見つけたいです。
> リストの検索って以下のようなコードになるんでしょうか。まったくの見当ちがいでしょうか。
回答の着地点が分かりづらいようです。「検索」と言っても、要は質問者であるtxtyさんが見つけたいものを見つけられるコードなのであれば、それがtxtyさんにとって「検索」なのではないですか。まぁ、それは置いておいても、提示のコードはインデントが崩れまくっていたり、読みにくいのは確かです。また、いきなり「前回のコード」と書かれても、この質問を初めて読んだ方には分かりません。単なる質問文への指摘のみで恐縮ですが。
リンク張りました。インデントは育ちがよくないので直せないと思ってもらうと幸いです。あと、どんな探索がいいかというととりあえず、これだけじゃわからないかもしれませんが、線形探索がしたいです。
『インデント』というのは、『段落』です。
if(p->suuji==n){
の部分のように、半角スペース(またはTabキー)でやるやつです。
というか、『ggりましょう』です。
プロでも調べながらやっています。
『IT プログラミング インデント とは』で検索するだけでもかなりヒットします。
検索力は必須です。
BeatStarさん>はい。では少しずつでも直します。
> どんな探索がいいかというととりあえず、これだけじゃわからないかもしれませんが、線形探索がしたいです。
残念ながら指摘したことが伝わっていない感が漂いますが(まぁ、文だけでは伝わることに限界あるので仕方無いですね)、ご提示のリストは単方向リスト(頭から次へ、次へと一方向にしか進めない)ので、泣いても笑ってもひとつずつ辿る線形探索しかできません。と言うか、自然と線形探索しているかたちです。具体的な、参考になるコードが見たいのでしょうかね。
dodoxさん>線形探索しかできないのですか。驚きました。
はい、そうです。同意。
コードを学ぶよりも、『概念』を先に理解した方がよさそう。
配列で arr[1] とかみたいにアクセスできるのは、『メモリ上にその順番で配置されているから』的な理由です。
リスト構造はイメージとしては並んでいますが、ポインタを使うことからもわかる通り、
『順番に並んでいることは必須ではない』です。そのためにポインタで表現しているのです。
そして、arr[3] とかみたいな、『ランダムアクセス』は順番に並んでいる場合しかできません。
リスト構造はメモリ上ではバラバラに配置されている可能性もあるので、『ランダムアクセス』はできません。
バイナリサーチのようにリニアサーチ以外をやろうとすると、メモリ上に整列している状態とか、
ソート済みである事とかみたいな条件が付きます。(アルゴリズムによって変わる)
だからリスト構造はどうしてもリニアサーチ(線形探索)しかできません。
よって、リスト構造での検索は O(n) だと言われています。
詳しくは『計算量』をキーワードにして、『計算量 とは』とかで検索してみてください。
コメントありがとうございます。
道はけわしいのですね。わかりました。
計算量とはでぐぐってみます。どうすればいいかわからなかったので助かります。
私は趣味でやっているので、その『どうすればいいかわからなかった』のは理解できます。
なのでちょっとアドバイスを。
まず、『データ構造とアルゴリズム』とかで検索して、それでヒットした記事を数件読みます。
そしてそこに出てきた新しいキーワード(たとえば『計算量』とか)を使って再度調べます。
これをひたすら繰り返します。
一つのサイト(あるいは書籍)では足りない場合もあるので副読本的な立ち位置でいろんなサイトや書籍を読む。
あとは、定義とかが分からない場合は『○○とは』とかのようにして、
実装レベルの内容なら言語名を付けて調べる。
例:『C言語 ファイル 書き込み』
そういう風に関係のある情報をひらすら読み漁り、自分の頭で考えるとある程度理解できるようになります。
後は実際にコードを書いてロジックを追うとか。
何回かで読みとれるかわかりませんが繰り返し読ませていただきます。
txtyさん、あなた本当に本気で問題解決しようと思っていないでしょ。
本気で思っていれば「インデントは育ちがよくないので直せないと思ってもらうと幸いです。」なんて
ふざけたこと書けないはずです。
たかだかインデント程度を揃えることが出来ないとかふざけるのもいい下限にしたほうがいいんじゃないですか?
なんでもいいのでIDE(統合開発環境)を導入すればインデントなんてコマンド一つで揃えることが出来ます。
それをやらないまま何度も指摘されたことをそのまま放置して、時間の無駄だから止めたほうがいいんじゃないですか?
どうせそんなことが出来るとは知らなかったとか言ってくると思うので、先に言いますが
知らなければ調べろ、自分で物事を解決しようという意思が無い限り今あなたがやっていることは
時間の無駄です。
ここ直近の繰り返される質問編集履歴を見て:
もっと文章を考えてから投稿しましょうよ。なぜ、回答が離れていくようなことをするのか。
3つも4つもご自身のやりたいことを書いても、(私を含め)逐一細かく回答する気にはなれないと思います。(現に、私も当初は回答しようかと思っていましたが、止めました)
低評価を入れたのは私ではありませんが、そんなところが評価されているのだと思います。
すみませんが私からは以上です。
>kainaさん
過去に一度直そうと思ってぐぐって調べたんですが直せませんでした。
dodoxさん>特になにもないです。ただ直す場所を見つけたら直した方がいいかと思いました。
間違えてるかもしれないがやりたかったのはたぶんこう。
int count=0;
int n=0;
printf("\n1kara6de kennsakutiwonyuuryokusitekudasai\n");
scanf("%d",&n);
for(struct SUUJI *p=top1; p!=NULL; p=p->next){
if(p->suuji==n){
printf("%dga%dbanmedeixtutishimashita",n,count);
}//if
count=count+1;
if( n<1||6<n){
printf("ixtuchishimasen/n");
scanf("%d",&n);
continue;
}//if
}//for
printf("\n");
return 0;
}
ああ、ちょっと間違えた。範囲外押したあと、1とか押すと間違える。
先のコメントで「私からは以上です。」と書いた上で大きなお世話なのでしょうが、気の毒に思えるので指摘します。本人が「間違えているかもしれなく、多分こう」と思えるレベルのコードを提示しても高い可能性で他人に伝わりません。 1 ≦ n ≦ 6の範囲を意識するのは本来は検索処理を呼びだす方なのではないでしょうか。または、そのリスト中にその値があるかどうか、ですよね。continueはループを「続行」します。for文の中でscanf~continueしても、ループは続きから行われる訳で、先頭からまた回り始める訳ではありません。それはtxtyさんの望む動作なのか、ということです。txtyさん自身がそれで良いというのであれば、それで良いのでしょう。
ですが、失礼ながら、質問が混迷を極めつつあるので誰もが回答しづらいのだと思います。あえて書きませんが、以前の質問より指摘されたことを振り返ってみてください。
アクティブからはずれているから指摘してもらって大丈夫です。アドバイス読みました。そのうえで再度、聞いてしまうのですが..仕様の実現は可能なのでしょうか。仕様では1から6までを検索範囲にする。forループでnullまでを一括検索する、数が範囲外だったら、再度入力を求めるなのですがcontinueを使うとforループのしたに戻るのですが、scanfがなんかうまいこといかないのです。また、ループが6回しか入力できないので入力した数が範囲内のときはいいのですが範囲外を入力してそのあとcontinueで1から順に出力されないのです。アドレスをたどってるから不可能なのでしょうか。すいません。誤記があるかもしれませんがよろしくお願いします。
> 仕様の実現は可能なのでしょうか。仕様では
それはtxtyさんが独自にやりたいことですね。単方向リストの検索とはあまり関係なく、単にプログラムのロジック/フローの問題です。その程度であれば、普通に「可能」です。
例えば以下のようなかんじのフローでできるはずです。(あくまで例えであり、疑似コードですが)
ループ1 {
ループ2 {
scanfで値を入力
if (入力された値が1以上5以下) {
ループ2をbreakで抜ける
}
ループ2の先頭へ戻る
}
入力された値を探すよう、リストを辿る。(つまり検索)
検索したものが見つかれば何かする
ループ1の先頭に戻る
}
scanfでの入力がうまくいかないと言うのであれば、scanfを使うことでの特有の問題かもしれません。teratailでもたびたび質問回答が挙がっています。ですが、それは今回の本質ではありません。
失礼を承知で指摘させてもらうと、リストの要素の検索以前にプログラミングのロジックの組み方(考え方)につたなさを感じます。まず頭の中で考えてペンと紙で表現できるようでないと、コードに書けません。書いているとしても恐らくそれはコードと意思が一致してない、間違い、と言うか思い込みです。そんなことが「かもしれない。たぶん」などの言葉遣いに表れています。コードは自分の頭の中の意思(やること)を反映したものです。
コメントありがとうございます。紙などに書いてもう少し考えてみます。どうしてもできなかったら再度質問するかもしれません。その際には、よろしくお願いします。
すいません。疑似コードについて教えてもらえませんか。3h程試したのですができなくてちょっと落ち着かないです。後生で教えてもらえませんか。
すぐできないならいつでもいいのですが駄目でしょうか
一応仕様どうりできたと思う。たしかにできました。付き合っていただきありがとうございました。
入力する数字の4だけできてない。でももう自分では無理なのでクローズします。
追記 追記:指定した範囲をwhile(n<-30||n>10){とかすると除外するループにはいれません。(どうしたらいいんだ)できてなかった。
int count=0;
int n=0;
while(n<1||n>6){
printf("1kara6wonnyuuryokusitekudasai\n");
scanf("%d",&n);
}
for(struct SUUJI *p=top1; p!=NULL; p=p->next){
if(p->suuji==n)
{
printf("%dga%dbanmedeixtutishimashita",n,count);
}//if
count=count+1;
}
printf("\n");
return 0;
}
回答2件
あなたの回答
tips
プレビュー