• 締切済み

単方向リストの解釈

 多数のデータが単方向リスト構造で格納されている。このリスト構造には、先頭ポインタとは別に、末尾のデータを指し示す末尾ポインタがある。次の操作のうち、ポインタを参照する回数が最も多いものはどれか。 ア リストの先頭にデータを挿入する。 イ リストの先頭のデータを削除する。 ウ リストの末尾にデータを挿入する。 エ リストの末尾のデータを削除する。     (平成24年度春期 問7) 各選択肢の参照ポインタ数はいくつになるのでしょうか。 解説書によって必要なポインタ参照数が異なっていて、理解できずにいます。 とある解説書では、 ア 2回のポインタの参照が必要 イ 1回のポインタの参照が必要 ウ 2回のポインタの参照が必要 と記述してあり、またある解説書では ア 0回のポインタの参照が必要 イ 2回のポインタの参照が必要 ウ 1回のポインタの参照が必要 エ 3回のポインタの参照が必要 と記述されていました。 先頭から末尾の一つ手前のデータまで順にたどって参照する必要のあるエが一番ポインタを参照する回数が多そうだな、と想像はできるのですが、実際の参照回数までは理解の外です。。 ご教授お願いします。

みんなの回答

  • root139
  • ベストアンサー率60% (488/809)
回答No.4

「ポインタの参照」をどう捉えるかで、数が変わってきますね。 例えば、新規の要素を確保してそのポインタをどこかに設定する場合、既存のポインタは見ていないので参照回数に加えないのか、新規確保したポインタも数に入れて+1とするかは解釈が分かれるかと。 まあ、答えがエで有ることは変わらないですが。(要素が多数で、末尾の要素を指しているもの以外の全てのポインタを参照する必要が有る為) 個人的には「ポインタの参照」を「既存のポインタの値を取得すること」と捉えるのが妥当だと思いますので、下記のページの解説が分かりやすくて良いと思います。 http://itpro.nikkeibp.co.jp/article/COLUMN/20120529/399361/?ST=selfup だたし、このページも間違っている箇所は有ります。 エの場合、末尾のデータを指しているポインタは(書き換える必要は有っても)参照する必要は無いので図の最後の青矢印は不要です。(解説の文章の方は間違っていませんが)

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3

ア)を実現するためには次の2つの処理を実行すればよい。 ・挿入要素の次ポインタ部←先頭ポインタの中身 ・先頭ポインタの中身←挿入要素のアドレス -------- イ)を実現するためには次の処理を実行すればよい。 ・先頭ポインタの中身←先頭ポインタが指す要素の次ポインタ部の中身 【補足】 回答No.2では次のように解説されていますけれど, > イは、先頭のポインタの参照を殺して2番目のポインタに > すればいいので、1回です。先頭を見る必要はありません。 先頭ポインタを起点にリストを一歩進まないと2番目の要素のアドレスは得られません。 私なら,上記の イ)の処理は,実質的に次の2つの処理だと見なします。 ・変数X←先頭ポインタの中身 ・先頭ポインタの中身←変数Xが指す要素の次ポインタ部の中身 -------- ウ)を実現するためには次の処理を実行すればよい。 ・末尾ポインタが指す要素の次ポインタ部の中身←挿入要素のアドレス ・末尾ポインタの中身←挿入要素のアドレス 前述と同様,私はこれを実質的に次の3つの処理だと見なします。 ・変数X←先頭ポインタの中身 ・変数Xが指す要素の次ポインタ部の中身←挿入要素のアドレス ・末尾ポインタの中身←挿入要素のアドレス -------- そして最後の エ)ですが。 単方向リストにおける要素の削除とは, 削除対象要素を書き換えることではなく, 「削除対象要素の1つ前の要素の次ポインタ部」を書き換えることです。 末尾要素に達するだけなら,末尾ポインタから一発で到着することができますが, そこから「末尾要素の1つ前の要素」に移動しようとしても,単方向リストなので末尾要素から1つ前に遡ることは不可能です。 したがって,回答No.2で解説されているとおり, 先頭ポインタから単方向リストを一歩一歩 順にたどることによってでしか「末尾要素の1つ前の要素」に達することはできません。 そこに達した後は次の処理を実行します。 ・末尾要素の1つ前の要素の次ポインタ部の中身←リスト終端を表す特別な値 ・末尾ポインタの中身←末尾要素の1つ前の要素のアドレス

  • hue2011
  • ベストアンサー率38% (2800/7250)
回答No.2

2つの解説書とも、説明が違います。 答えがエであることはおわかりですね。 順に解説します。簡単です。 単方向リストですから、ずらりとデータが並んでいます。 アの場合は、先頭にあるポインタを2番目にして新しく確保したポインタを先頭にするだけですから2回です。 イは、先頭のポインタの参照を殺して2番目のポインタにすればいいので、1回です。先頭を見る必要はありません。 ウは、最後のポインタを更新することになりますから、1回です。 エは、最後のポインタを最後から2番目のポインタにしなければいけません。 イの場合は最初+1が2番目のポインタになりますけど、エは最後ー1のポインタを確保しなければならないのです。 だったら、エ、は最初からずっと最後になるまで全部を調べてはじめて、最後ー1がわかります。 仮にリストが2個しかなくても2回は必要です。n個あったらn回参照です。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> 実際の参照回数までは理解の外です。。 要素数を定義しないと難しいかも。

solution64
質問者

お礼

>ある解説書では、 ア 2回のポインタの参照が必要 イ 1回のポインタの参照が必要 ウ 2回のポインタの参照が必要 この解説では要素数の定義はされていませんでした。 なので、要素数を定義しなくてもこの参照回数になるのではないかと考えています。

関連するQ&A

  • 単方向リスト

    図は単方向リストを表している。“東京”がリストの先頭であり、そのポインタには次のデータのアドレスが入っている。また、“名古屋”はリストの最後であり,そのポインタには0が入っている。 先頭データへのポインタ   アドレス   データ    ポインタ 10            10    東京      50               30    名古屋     0               50    神奈川     90               70    長野     30               90    山梨     70               150   岐阜 アドレス150に置かれた“岐阜”を、“長野”と“名古屋”の 間に挿入する処理を答よという問題なんですが答えが アドレス、     データ部分 、   ポインタ 10         東京       50 30         名古屋        0 50        神奈川       90 70         長野       150 90         山梨        70 150        岐阜       30 になるんですが解き方がわかりません。教えてください

  • 双方向リストの関数

    双方向リストにデータファイルから読み込んだ氏名と成績のデータを追加し,リストの末尾から順にデータを表示するプログラムを作成したのですが、insertLast() 関数を用いて末尾ノードの後ろに新しいノードを連結するという部分をどのようにして良いのかわからず困っています。 どのように記述して良いのかわからなかった部分を/*** ***/のコメントで示してあります。 どなたかアドバイスやヒント、その他の指摘などご教授してくださる方いましたらよろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NAME_LENGTH 20 /* 名前を格納する文字列の長さ */ /* 双方向リストのノードとなる構造体の定義 */ typedef struct sList{  struct sList *prev; /* 前のノードのアドレス */  char name[NAME_LENGTH]; /* 名前 */  char grade; /* 成績 */  struct sList *next; /* 次のノードのアドレス */ } sNode; /* この構造体を sNode型 と定義する */ /* 双方向リストの先頭と末尾を格納するための構造体 */ typedef struct {  sNode *firstNode; /* リストの先頭ノードのアドレス */  sNode *lastNode; /* リストの末尾ノードのアドレス */ } manageList; /*  双方向リストの末尾にノードを追加する関数 insertLast()  引数   manageList *list リストの先頭・末尾ノードを管理する構造体のアドレス   sNode *node 末尾に追加したいノードのアドレス  返値   なし */ void insertLast(manageList *list, sNode *node ) {  /*** リストの末尾にノードを追加する ***/  return; } /*  双方向リストの新しいノードを作成する関数 makeNewNode()  引数   char *aName 名前(文字列)の先頭アドレス   char aGrade 成績  返値   sNode * 新しく作成したノードの先頭アドレス */ sNode *makeNewNode(char *aName, char aGrade ) {  sNode *pNewData;  /* sNode 型のメモリ領域を確保 */  pNewData = (sNode *) malloc( sizeof(sNode) );  /* 名前と成績のデータを設定する */  strcpy( pNewData->name, aName );  pNewData->grade = aGrade;  pNewData->prev = NULL;  pNewData->next = NULL;  return( pNewData ); } /*  main()  引数   なし  返値   int 正常終了の時 0     異常終了の時 -1 (ファイルの読み込み失敗など) */ int main( void ) {  manageList list; /* リストの先頭・末尾ノードのアドレスを持つ構造体 */  sNode *pNew; /* 新しく作成したノードのアドレスを持つ変数 */  sNode *pNow; /* 現在見ているノードのアドレスを持つ変数 */  FILE *fp; /* データファイルのファイルポインタ */  char name[ NAME_LENGTH ]; /* ファイルから読み込んだ名前を一時的に保持する変数 */  char grade; /* ファイルから読み込んだ成績を一時的に保持する変数 */  /* 初期状態では先頭・末尾ノードともNULL */  list.firstNode = NULL;  list.lastNode = NULL;  /* データファイル exer6.txt を読み込み用に開く.    ファイルが開けなかった場合,エラーメッセージを表示し異常終了する.*/  fp = fopen("exer6.txt","r");  if(NULL == firstNode){   printf( "ファイルが開けませんでした. \n" );   return( -1 );  }  /* データをファイルの最後(EOF)まで読み込み,双方向リストにデータを追加する */  while( EOF != fscanf( fp, "%s %c", name, &grade ) ) {   /* 新しいノードを作成 */   pNew = makeNewNode( name, grade );   /*** insertLast() 関数を用いて末尾ノードの後ろに新しいノードを連結する ***/   pNow->next = pNew ;   pNew->prev = pNow ;   pNow = pNew ;  /* ファイルを閉じる */  fclose( fp );  /* 現在見ているノードを末尾ノードにセットする */  pNow = lastNode  /* 末尾のノードから前のノードへたどりながらデータを出力する */  while( NULL != pNow ) {   /* 出力 */   printf( "%s %c\n", pNow->name, pNow->grade );   /* 現在見ているノードを一つ前のノードにする */   pNow = pNow->prev;  }  return( 0 ); }

  • データベース

    基本情報処理のデータベース技術についてなのですが、 次の問題の解答を教えて下さい。できれば簡単な解説もお願いします。 問1.データベースシステムを導入することによって期待できる効果を2つ選べ。   ア コード設計作業の軽減   イ 重複データの削減   ウ データ転送の高速化   エ プログラムとデータの独立性向上 問2.データベースのデータ構造に関係しない用語はどれか。   ア 表構造   イ ネットワーク   ウ 木構造   エ SQL 問3.次のデータベースに関する記述のうち、正しいのはどれか。   ア プログラムとファイルが密接な関係にあるので,プログラムがつくり易い   イ データに重複が無いので,業務によってデータ内容に矛盾が発生しない   ウ 適用業務ごとに専用のファイルがないので、ファイル管理がしにくい   エ データの扱いが標準化されるために、個別の業務処理がしづらい   

  • リットル・デシリットル・ミリリットルの計算方法教えて下さい

    ・かさの多い順に左から記号を書きます。  正しいのはどれでしょう。 ア16dl イ1300ml ウ1l7dl エ900ml  (1)ア→ウ→イ→エ  (2)ウ→ア→イ→エ  (3)ウ→イ→ア→エ  (4)エ→イ→ア→ウ ○1l=10dl 1l=1000ml というのを教科書で習ったのですがすべて同じ単位 にそろえる事ができないのですが,どうやって 教えたらいいのでしょう…? 親の私がなやんでしまって^^; すいません!教えてください。

  • 国語 文法 助詞 

    http://okwave.jp/qa/q9237816.html この質問をした者です ここでは、自分の考えを書きながら皆さんの考えを聞こうかなと思います (1)イは終助詞で、ウは並立ですよね  では、アとエは何なのでしょうか (2)イは強調でエは(だけを)に書き換えられるやつですよね  では、アとウは何なのでしょうか (3)エが添加ですよね (4)問題は類推ですか?  ならば、アが類推なので、それが答えですよね  では、イとウとエは何でしょうか。 (5)アの「その価値に気づかない」は誤りで「散歩していた」が正解です  アは動作の平行、ウは確定の逆接、エは動作の平行  では、イと問題文は何なのでしょうか (6-1)問題文が類推、エも類推   では、アとイとウは何なのでしょうか (6-2)「だけ」に置き換えるとアが変えられて    イは数量?ウは動作の終了?    エは何でしょうか (7)問題文が強調、イが強調、ウは仮定の逆接   アとエは何でしょうか (8)問題が添加なので、答えはア   エが類推   イとウは何なのでしょうか (9)問題文が動作の平行なので、答えはア   イは確定の逆接   ウとエは何でしょうか (10)問題文が確定の逆接、アが添加?エは動詞+「の」で体言と同じ働きになる「に」は?    イとウは何でしょうか (11-1)問題が場所なので、答えはウ、エは材料    アとイはなんですか? (11-2)問題が確定の逆接なので、答えはウ    アとイとエは何でしょうか (11-3)問題が場所なので答えはウ、エは確定の逆接    アとイはなんですか? (12)アは接続助詞、イは 形容動詞、    ウとエとオはなんでしょうか 回答をいただいたのですが、よく分かりませんでした 自分の言ってる事が正しいかどうか、意味、用法は何かを答えていただけると 嬉しいです ご回答お願いします。  

  • 小5の算数です

    問題 0より大きい4つの数、ア・イ・ウ・エが有ります。 4つの数の大きさが次のような関係のとき ア・イ・ウ・エを 左から小さい順に書きましょう  ア=イ×1.2  ウ=イ×0.9  エ=ア÷0.8 と、言う問題です。 甥っ子の為に頑張ってみたのですが自信が無くて。。。 宜しくお願いしますm(__)m

  • ビットについて基本情報技術者試験でわからない問題があります

    ある16ビットのデータを左に1ビットけた移動すると、あふれが生じ、得られた値は16進数で579Aとなった。元の値を16進数で表したものはどれか。 ア 2BCD イ 2F34 ウ ABCD エ AF34 答え ウ 解説には 579A を2進数に直し、右に1ビットけた移動、あふれが生じた分の先頭ビットを1とすると・・ とありますが、なぜ、勝手に先頭ビットを1としていいのかわかりません。

  • 自立語の活用の仕方

    冬休みの宿題でこういう問題が出たのですが見分け方やとき方がよく分かりません。 〔問題〕次の(1)~(4)の動詞の活用形をあとから一つずつ選び、記号で答えなさい。 ・きれいに((1)刈ら)れて((2)いる)芝生の上を、犬が((3)走り回っ)て((4)いる)。 ア未然形  イ連用形  ウ終止形  エ連体形  オ仮定形   カ命令形 〔解答〕(1)ア (2)エ (3)イ (4)ウ 解説には言い切りの形にして形の末尾が「い」が形容詞で「だ」が形容動詞になる。とあるのですが、言い切りの形にする仕方がわかりません。また同じ「いる」なのに形が違うのはなぜなんですか?(1)~(4)まで出来れば解説をお願いします。 

  • CD-RW ???

    とある本のシスアドの問題です。 CD-RWの特徴で適切なのはどれか? ア・・・ イ・・・ ウ データの読み込みは通常のCD-ROMドライブで可能だが、書き込みは専用の装置がいる エ 読み込み書き込みともに専用ドライブが必要である。 答えは エ だそうですが、解説が不十分です・・・・ なぜでしょうか? 個人的にはウでもいいような・・・読み込みができないのもありますが・・・ 読み取りだけならほとんど出来ると思うのですが・・・・

  • 数学A

    次のア~エに当て嵌まる数字について、(1),(2)は自力で解いたのですが、これで合っていますか? また、(3),(4)がわからなかったので解説をよろしくお願いします。 6個の数字1,2,3,4,5,6を重複なく用いてつくられる6桁の整数のうち、 (1)一の位の数字が5と異なるものは、ア個ある。 ア…384 (2)123456と比較して、対応する位の数字がちょうど3個一致するものは、イ個ある。 イ…40 (3)4で割り切れるものは、ウ個ある。 (4)452613より大きいものは、エ個ある。

専門家に質問してみよう