• 締切済み

リスト構造

リスト構造の問題なんですが リスト構造を使ってファイルに読み込み、書き込み データの追加、一覧表示、削除といった機能を持ったプログラムを 作成しなければいけないのですがリストをつなげたり切り離したり することができません ポインタを使うところまでは分かるのですがリストをつなげたり切り離したりする部分がよく分かりません どうすればよいのでしょうか どなたか回答お願いします

みんなの回答

  • yonfa
  • ベストアンサー率52% (22/42)
回答No.3

質問内容についてはもっと具体的に絞らないと、#1のおっしゃるように丸投げと判断されてしまいますよ。 「リスト構造」をキーワードに検索すれば、サンプルソースでもなんでもすぐに見つかると思います。 ここに質問するよりももっと親切な解説を得られますよ。

参考URL:
http://www.nurs.or.jp/~sug/soft/tora/tora75.htm
noname#39970
noname#39970
回答No.2

構造体のようなものを作成する 格納データ用と、次の場所をしめすポインタ用 ポインタがnullであればそこが終端として扱うように組む。 格納しきれないデータであるなら 新たに次のオブジェクトを確保しポインタに新オブジェクトのポインタを設定する。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

この問題をここで答えきるのは難しいかもしれません。 リスト処理はポインタ処理と言って過言ではありません。 ポインタについて精通しないと結構難しいでしょう。 精通させるためにこのような課題を与えられたのかもしれ ませんが。 リストと言っても大きく二つのパターンに分かれると思います。 一つは、全てのデータを扱う。特定のデータしか扱わない、です。 全てのデータを扱う場合には、データの種類の識別をどこに 持つのか。少なくとも、リストの構造とデータ型くらいは 提示してください。 それから、リスト処理で、つなげる場合には、先頭や後ろに 一要素ずつつないでいく方法と、途中に要素を入れる方法が あります。先頭か後ろか、それらも作り手の自由なので、どう したいのか。よろしく。それともそれら全てを含めて教えて欲しい というのであれば、問題が大き過ぎますね。丸投げと判断します。

関連するQ&A

  • リスト構造

    リスト構造がポインタを使って繋ぐ、という事はわかったのですが、例えば電話帳を作るとして、入力、保存、検索、のコマンドを作っても一度プログラムを終了するとデータは消えてしまいますよね?ファイルに保存したとしても、次に見るときにはまた、リスト構造にこれらのデータを戻すのですか?? よくわからないので教えて下さい。お願いします。

  • リスト構造について

    C++言語で住所録を作ろうとしていますが、今回始めてポインタを使ったリスト構造を使ってみるこ とにしました。 そこでふと思ったのですが、VBではポインタなど無いと思ったのですが、このような場合はどうやって リスト構造を実現するのですか? VBは昔触ったことが有りますが、今は触っていません。 イメージが分かる程度の回答で結構です。

  • リスト構造

    1→2→3のようにポインタでリスト構造を作るとき、最後の3は何もさしていないのですが、初期化もせずNULLも代入しない状態で使っても問題無いのでしょうか? プログラムはちゃんと動くようですが。 このコードがそれにあたると思うのですが。 http://www9.plala.or.jp/sgwr-t/c/A/rei15-5.html

  • リストボックスの保存方法を教えてください

    初心者です。VB.NET(VBのケースでもいいです)で、リストボックスにファイルからデーターを読み込み、項目を一覧表示し、その項目を追加、削除し、更新した内容をファイルに保存したいのですが、 データーの読み込み、追加、削除、まではできたのですが、ファイルに保存する方法がわかりません。 リストの項目すべてを取得して保存する方法を教えてください。 よろしくお願い致します。

  • データ構造とアルゴリズム

    学校の課題なのですが、試験の得点順(降順)に学生番号と得点を表示することができるシステムを行っています。 仕様は下記の通りです。 外部仕様 1.試験の得点順(降順)に学生番号と得点を表示 2.機能メニュー(1:追加、2:削除、3:表示、1~3以外:終了)で操作できる 3.機能メニューの1:追加を選択すると、キーボードから学生番号と得点を入力することができる 4.機能メニューの2:削除を選択すると、キーボードから入力した学生番号のデータを削除することができる。 5.機能メニューの3:表示を選択すると、入力されているデータが、得点順に表示される 内部仕様 1. 使用言語はC言語とする 2. ダミーノードを使わない順方向リスト構造とする 3. リストのノードは構造体を使用する 4. リストのノードが常に得点の降順で並ぶように追加する 5. 入力データ型は、機能メニューを選択するための数字と得点は整数型、学生番号は文字列型とする 6. 先頭のノードのポインタを格納する変数名はheadとする 7. 全体の処理の流れは図1のとおりとし、【テンプレート・プログラム】の必要箇所に必要な機能を追加して完成させるものとする。テンプレート・プログラムで使用されている変数名は、そのまま使用すること。 8. 機能メニューは、関数名:menu()で表示する。menu()の仮引数は無し、戻り値は、キーボードから入力されたメニュー番号(整数)とする。 9. 機能メニューの1:追加では、関数名:insert()において先頭ノードから最後尾ノードに向けて順にキーボードから入力した得点と大小関係を比較し、得点の降順で並ぶように挿入位置を決めるためのアルゴリズムを考えて、新たなノードをリストに挿入する。関数名:insert()、仮引数:無し、戻り値:無し。なお、新しく追加するノードのポインタアドレスは変数pを使用する。追加する場所を探すために参照するノードのポインタアドレスは変数p2を使用する。 10. 機能メニューの2:削除では、関数名:del()においてキーボードから削除する学生番号を入力し、該当するノードを削除する。学生番号が見つからない場合は何もしない。関数名:del()、仮引数:無し、戻り値:無し。なお、文字列の比較には、strcmp()関数を使用する。 11. 機能メニューの3:表示では、関数名:disp()において先頭のノードから学生番号と得点を表示する。関数名:disp()、仮引数:無し、戻り値:無し。 この、追加機能のinsert、削除機能のdel、dispをどのように記述すればいいのかが分かりません。 分かる方宜しくお願いいたします。

  • リスト構造のソートで悩んでます。。。

    リスト構造のソートで悩んでます。プログラムの内容はファイルからデータをリスト構造の構造体に読み込み、名前順にソートし結果を表示する。というものです。データの追加や削除はできるのですがソートとなると頭が混乱してしまいお手上げ状態になってしまいました。。。。。 読み込み用のデータとプログラムソースを以下に記載するのでどなたか良きアドバイスをお願いしますm(_ _)m ○データ Sakuragi 16 Rukawa 16 Miyagi 17 Akagi 18 Mitsui 18 ○ソース #include <stdio.h> #include <stdlib.h> #include <string.h> #define MENBER 5 typedef struct data{ char name[BUFSIZ]; int age; struct data *next; }LIST; LIST *newLIST(void); LIST *sort(LIST *); int main(int argc,char *argv[]){ FILE *fp; LIST *p; LIST *np; LIST *npb; LIST *head; char namae[BUFSIZ]; int toshi,i; if((fp=fopen(argv[1],"r"))==NULL){ printf("no file\n"); exit(1); } head = newLIST(); npb =head; for(i=0;i<MENBER;i++){ np = newLIST(); fscanf(fp,"%s %d",namae,&toshi); strcpy(np->name,namae); np->age = toshi; npb->next =np; npb = np; } sort(head); for(p=head->next;p != NULL;p=p->next){ printf("%s\t%d\n",p->name,p->age); } for(p=head->next;p != NULL;p=np){ np = p->next; free(p); } fclose(fp); return(0); } LIST *newLIST(){ LIST *p; p = (LIST *)malloc(sizeof(LIST)); p->next = NULL; return(p); } LIST *sort(LIST *head){ }

  • リスト構造

    Fortranでリスト構造を作ることになってしまいました。 リストに要素を追加したり、途中のデータを削除することはできたのですが、途中にデータを挿入することができません。 まだfortranバリバリ現役で打っている方、ご教授お願いします。 以下は参考です。 type element    integer ::ele    type(element),pointer ::next1 end type element type(element),pointer::root1,p1,tmp_p allocate(root1) nullify(root1%next1) p1 => root1 do i=1,n   p1%ele = a(i) !配列Aをリストへ   allocate(p1%next1)   p1 => p1%next1   nullify(p1%next1) enddo p1 => root1 print_list1:do !表示   if(associated(p1%next1))then write(*,*)p1%ele      p1 => p1%next1   else exit print_list1 endif enddo print_list1 p1 => root1 free_list1:do !解放 if(associated(p1%next1))then root1 => p1 p1 => p1%next1 deallocate(root1) else exit free_list1 endif enddo free_list1 C------ちなみに削除は delete_list:do   if(associated(p1%next1))then if(p1%ele .eq. 0)then !例えば0の要素を削除    tmp_p => p1%next1    nullify(p1%next1) deallocate(p1%next1) p1 = tmp_p else p1 => p1%next1 endif else exit delete_list endif enddo delete_list p1 => root1

  • データ構造について

    情報処理技術者試験の過去問で、データ構造について適切な記述を選ぶ問題がありました。回答を見てもいまいちピンときません。 <回答> ※線形リストは、データ部と次のデータの格納先を指すポインタ部から構成されるデータ構造である。 私の持っている本では、 線形リスト:データが順序良く並んできる。配列のこと。 単方向リスト:次のデータのポイントだけを持つ 双方向リスト:前と次のデータへのポインタをもつ 環状リスト:データが環状に連結されている となっています。線形リストにポインタという概念はないってことですよね?なぜ、※の記述が正しいのでしょうか。 わかる方、教えてください。よろしくお願いします。

  • リスト構造がうまく動きません!!

    C言語で以下のようなプログラムを作りました。 「main関数内で下記のデ-タを構造体に格納し、キーボードから入力された名前と該当する学生の身長と年齢を画面に表示するプログラムを作成せよ。」というものです。 このプログラムはコンパイルは通るのですが、2人目以降のデータを表示させようとしても表示してくれません。。。どうもリスト構造のfor文がうまくループしていないみたいなんですが原因が分かりません。どなたか原因の分かる方アドバイスをお願いしますm(_ _)m #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct data{ char name[20]; int height; int age; struct data *next; }person; person *newperson(void); int main(void){ char namae[20],s[20]; int toshi,shinchou,i; person *head; person *list; person *nlist; person *LIST; head = newperson(); nlist = head; printf("データを入れてください。\n"); for(i=0;i<=4;i++){ scanf("%s",namae); scanf("%d",&shinchou); scanf("%d",&toshi); list = newperson(); strcpy(list ->name,namae); list -> height = shinchou; list -> age = toshi; nlist -> next = list; nlist = list; } printf("知りたい人の名前は?\n"); scanf("%s",s); for(LIST = head->next;LIST ->next != NULL;LIST = LIST->next){ if(strcoll(s,LIST ->name)==0){ printf("%s\t%d\t%d\n",LIST->name,LIST->height,LIST->age); break; } printf("%s\n",LIST->name); printf("%s\n",LIST->next->name); } return(0); } person *newperson(){ person *dummy; dummy = (person*)malloc(sizeof(person)); dummy -> next = NULL; return(dummy); }

  • C言語 list 構造体配列

    どうしてもこの問題がわからないので教えてください!  下記の構造体タグ「seiseki」を使って,表に示すデータをもつ構造体配列「list」を作成する.  関数に構造体配列「list」のアドレスを渡す.  関数で構造体ポインタ「*list」を利用して,一番点 数の高い者(1名限定)を調べ,その名前を表示する. struct seiseki{ char name[30]; int score; name score }; 表 佐藤 80 鈴木 75 田中 95 高橋 90

専門家に質問してみよう