第3回 配列とリスト

Similar documents
木構造の実装

第3回 配列とリスト

memo

二分木の実装

Taro-リストⅢ(公開版).jtd

PowerPoint Presentation

PowerPoint Presentation

Microsoft PowerPoint - 6.pptx

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

PowerPoint プレゼンテーション

プログラミングI第10回

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft Word - no206.docx

PowerPoint Template

PowerPoint Presentation

PowerPoint プレゼンテーション

Microsoft Word - no12.doc

Taro-リストⅠ(公開版).jtd

memo

Microsoft PowerPoint - lec10.ppt

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

r07.dvi

ohp07.dvi

Microsoft PowerPoint - 05.pptx

Microsoft PowerPoint - kougi9.ppt

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

プログラミング基礎

O(N) ( ) log 2 N

memo

Taro-ポインタ変数Ⅰ(公開版).j

第2回

memo

PowerPoint Presentation

DVIOUT

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

Prog1_15th

Microsoft PowerPoint - 12.ppt [互換モード]

プログラミング基礎

Microsoft PowerPoint - 計算機言語 第7回.ppt

プログラミング及び演習 第1回 講義概容・実行制御

Microsoft PowerPoint - 13.ppt [互換モード]

プログラミング実習I

JavaプログラミングⅠ

program.dvi

untitled

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

void hash1_init(int *array) int i; for (i = 0; i < HASHSIZE; i++) array[i] = EMPTY; /* i EMPTY */ void hash1_insert(int *array, int n) if (n < 0 n >=

C言語によるアルゴリズムとデータ構造

C C UNIX C ( ) 4 1 HTML 1

DVIOUT

プログラミング基礎

Taro-2分探索木Ⅰ(公開版).jtd

alg2015-3r3.ppt

第2回

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

CプログラミングI

Microsoft Word - Cプログラミング演習(10)

情報処理演習 B8クラス

memo

joho07-1.ppt

Microsoft PowerPoint - 11.ppt [互換モード]

Microsoft Word - Cプログラミング演習(12)

r08.dvi

講習No.12

Microsoft PowerPoint - 06.pptx

Microsoft PowerPoint - 12.ppt [互換モード]

ohp08.dvi

Microsoft Word - no15.docx

Microsoft Word - no205.docx

memo

8 / 0 1 i++ i 1 i-- i C !!! C 2

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

PowerPoint プレゼンテーション

C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i<=10; i++) sum=sum + i; printf ("sum=%d n",sum); 2

file:///D|/C言語の擬似クラス.txt

Microsoft Word - no204.docx

Taro-最大値探索法の開発(公開版

基礎プログラミング2015

Microsoft Word - Cプログラミング演習(7)

I. Backus-Naur BNF : N N 0 N N N N N N 0, 1 BNF N N 0 11 (parse tree) 11 (1) (2) (3) (4) II. 0(0 101)* (

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Microsoft PowerPoint - H22プログラミング第一(E)#12

Microsoft PowerPoint - CproNt02.ppt [互換モード]

1 1.1 C 2 1 double a[ ][ ]; 1 3x x3 ( ) malloc() 2 double *a[ ]; double 1 malloc() dou

Microsoft Word - Training10_プリプロセッサ.docx

/* do-while */ #include <stdio.h> #include <math.h> int main(void) double val1, val2, arith_mean, geo_mean; printf( \n ); do printf( ); scanf( %lf, &v

C言語講座

‚æ4›ñ

ohp03.dvi

演算増幅器

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

02: 変数と標準入出力

第1回 プログラミング演習3 センサーアプリケーション

kiso2-09.key

Taro-2分探索木Ⅱ(公開版).jtd

スライド 1

Microsoft Word - Cプログラミング演習(9)

Microsoft Word - 13

株式会社アルウィン C 言語コーディング規約 ver.0.1

Transcription:

連結リスト Algorithms and Data Structures on C

この回の要点 連結リストによるリスト 連結リストの構造 連結リストの利点と欠点 C 言語による連結リストの実現 ヘッダファイルによるソースファイルの分割

連結リスト (linked list) リストの実現の一種 リストに含まれる各要素をリンクによって連結した構造 リンクとは 他のデータへの参照のこと 各要素は 自分から次のデータへのリンクを持つ その要素が連なった構造が連結リスト 個人データ A さん B さん C さん F さん リンク 参照 名前 年齢 連結リスト D さん NULL E さん

連結リストの利点と欠点 利点 データの挿入 削除が簡単 =O(1) サイズが可変 ( メモリの上限はある ) 欠点 要素 k にアクセスするのにリンクをたどる必要がある = O(N) データ以外にリンク分のメモリが必要 挿入 削除

双方向連結リスト (double linked list) 前後の要素へのリンクを持つ連結リスト 要素を逆順にたどることが可能 2 つのリンクを持つためのメモリが必要 個人データ () A さん B さん C さん F さん 次へ 前へ 参照 参照 NULL 名前 年齢 双方向連結リスト (List) D さん NULL E さん

個人情報型 メンバー next char *name 名前 prev int age 年齢 name *prev,*next 前後のリンク age 関数 * make(const char*,int) の生成 void free(*) の破棄 void insertbefore(*,*) 前に挿入 void insertafter(*,*) 後に挿入 void remove(*) 削除 void print(*) 表示 参照 参照

.h #ifndef h #define h /*** *** 個人情報 ***/ #include <stdio.h> #include <stdlib.h> #include <string.h> ヘッダファイルの重複読み込みを回避 // 個人情報型の宣言 typedef struct tag { struct tag *prev,*next; // 前後の個人情報へのリンク char *name; // 名前 int age; // 年齢 ; 続く

.h // プロトタイプ宣言 *make(const char *n,int a); void free( *pd); void insertbefore( *pd1, *pd2); // 生成 // 破棄 // pd1 の前に pd2 を接続 void insertafter( *pd1, *pd2); void remove( *pd); void print( *pd); // pd1 の後に pd2 を接続 // pd を取り外す // 表示 #endif // h ここまでが 1 回しか読み込まれない

.cc /*** *** の実装 ***/ #include ".h" // 個人情報の生成 *make(const char *n,int a){ *pd=(*)malloc(sizeof()); pd->prev=pd->next=null; pd->name=(char*)malloc(strlen(n)+1); strcpy(pd->name,n); pd->age=a; return pd; // 個人情報の破棄 void free( *pd){ free(pd->name); free((void*)pd); 続く

.cc // 個人情報 pd1 の前に個人情報 pd2 を接続 void insertbefore( *pd1, *pd2){ if(pd1==null pd2==null) return; if(pd1->prev) pd1->prev->next=pd2; pd2->prev=pd1->prev; pd2->next=pd1; pd1->prev=pd2; 前に挿入 pd1 pd2 pd1 続く

.cc // 個人情報 pd1 の後ろに個人情報 pd2 を接続 void insertafter( *pd1, *pd2){ if(pd1==null pd2==null) return; if(pd1->next) pd1->next->prev=pd2; pd2->prev=pd1; pd2->next=pd1->next; pd1->next=pd2; 後に挿入 pd1 pd1 pd2 続く

.cc // 個人情報 pd を取り外す void remove( *pd){ if(pd==null) return; if(pd->prev) pd->prev->next=pd->next; if(pd->next) pd->next->prev=pd->prev; pd->prev=pd->next=null; 削除 pd // 個人情報を表示する void print( *pd){ printf("%s(%d)",pd->name,pd->age);

双方向リンクリスト List メンバー *first,*last 先頭と末尾の要素 int size 要素数 関数 List* makellist() 生成 void free(list*) 破棄 void addtop(list*,*) 先頭に追加 void add(list*,*) 末尾に追加 void remove(list*,*) 要素を削除 * get(list*,int) 取り出し int getsize(list*) 要素数 void print(list*) 表示 first last

List.h #ifndef List h #define List h /*** *** 個人情報のリスト ***/ #include ".h" // 個人情報リスト型の宣言 typedef struct { *first,*last; int size; List; ヘッダファイルの重複読み込みを回避 // 先頭と末尾の要素 // 要素数 続く

List.h List *makelist(); // 個人情報リストの生成 void free(list *lp); // 個人情報リストの破棄 void addtop(list *lp, *pd); // リストlpの先頭に個人情報 pdを挿入 void add(list *lp, *pd); // リストlpの末尾に個人情報 pdを追加 void remove(list *lp, *pd); // リストlpの要素 pdを削除 *get(list *lp,int n); // n 番目の要素を得る ( 先頭は0 番 ) int getsize(list *lp); // 要素数 void print(list *lp); // 表示 #endif // List h

List.cc /*** *** List の実装 ***/ #include "List.h" // 個人情報リストの生成 List *makelist(){ List *lp=(list*)malloc(sizeof(list)); lp->first=lp->last=null; lp->size=0; return lp; // 個人情報リストの破棄 void free(list *lp){ free((void*)lp); 続く

List.cc // リスト lp の先頭に個人情報 pd を挿入 void addtop(list *lp, *pd){ if(lp->first==null) lp->first=lp->last=pd; else{ insertbefore(lp->first,pd); lp->first=pd; lp->size++; first pd 続く last

List.cc // リスト lp の末尾に個人情報 pd を追加 void add(list *lp, *pd){ if(lp->last==null) lp->first=lp->last=pd; else{ insertafter(lp->last,pd); lp->last=pd; lp->size++; first last 続く pd

List.cc // 要素 pd を削除 void remove(list *lp, *pd){ if(lp->first==pd) lp->first=pd->next; if(lp->last==pd) lp->last=pd->prev; remove(pd); lp->size--; // n 番目の要素を得る ( 先頭は 0 番 ) *get(list *lp,int n){ *p=lp->first; for(int i=0;i<n && p;i++) p=p->next; return p; 続く first last pd

List.cc // 要素数 int getsize(list *lp){ return lp->size; // 表示 void print(list *lp){ *p=lp->first; printf("list:(%d): n",lp->size); for(int i=1;p;p=p->next,i++){ printf("%d:",i); print(p); printf(" "); printf(" n");

ListTest.cc /*** *** 個人情報リストのテスト ***/ #include "List.h" int main(void){ List *lp=makelist(); *pd; add(lp,make(" 山田 ",19)); add(lp,pd=make(" 森 ",50)); add(lp,make(" 田中 ",23)); print(lp); 続く

ListTest.cc addtop(lp,make(" 近藤 ",41)); printf("**before** n"); print(lp); remove(lp,pd); printf("**after** n"); print(lp); printf("2 番目は "); print(get(lp,1)); printf(" です n");

課題 171023 小学校の成績管理をするために 児童の成績データを双方向リンクリストに入れて管理する このとき SeisekiData というクラスはどのような構造にすればよいか 考えて示せ ただし 型のみでよい ( 関数は不要 ) 成績は国語 算数 理科 社会の 4 科目 児童の情報は 学年 クラス 名前 作成方法 : 自分で考えたクラス構造を プログラムコードとしてワード文書内に書くこと ワードのファイル名は scxxxxxx-al171023.docx 提出方法 : メールで メールの本文中にも学籍番号を氏名を明記すること 提出先 :fuchida@ibe.kagoshima-u.ac.jp メールタイトル : アルゴリズム課題 171023 厳守! 期限 :2017 年 10 月 30 日 ( 日 ) 24:00

連結リスト 終了