データ構造とプログラミング技法 (第2回) ー線形構造ー.

Slides:



Advertisements
Similar presentations
アルゴリズムとデータ構造 第2回 線形リスト(復習).
Advertisements

基本情報技術概論 I 演習(第5回) 埼玉大学 理工学研究科 堀山 貴史
5.データ構造入門 5-1.連結リスト(Linked List) 5-2.スタック(Stack) 5-3.キュー(Queue)
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
データ構造とアルゴリズム 第10回 mallocとfree
基本情報技術概論(第4回) 埼玉大学 理工学研究科 堀山 貴史
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 第3回基本的なデータ構造(リスト) 2015/10/28 アルゴリズムとデータ構造 2015.
第8回 プログラミングⅡ 第8回
データ構造とアルゴリズム 第13回 スタックとキュー
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
Stack & Queue & List 3.
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
構造体 構造体, 構造体とポインタの組み合わせ,.
二分探索木によるサーチ.
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
Cプログラミング演習 中間まとめ2.
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
データ構造とアルゴリズム (第2回) ー線形構造ー.
Cプログラミング演習.
データ構造とアルゴリズム 第6回 キュー ~ データ構造(2)~.
アルゴリズムとデータ構造1 2006年6月16日
プログラミング 4 記憶の割り付け.
データ構造と アルゴリズム第4回 知能情報学メジャー 和田俊和.
木の走査.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
プログラミング入門2 第11回 情報工学科 篠埜 功.
データ構造とアルゴリズム 担当:和田俊和 居室:A603 講義資料等は下記を参照してください.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
高度プログラミング演習 (08).
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
Cプログラミング演習 第10回 二分探索木.
高度プログラミング演習 (05).
高度プログラミング演習 (05).
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
プログラミング基礎B 文字列の扱い.
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
プログラミング 4 木構造とヒープ.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
明星大学 情報学科 2012年度 後期   情報技術Ⅱ   第8回
アルゴリズムとデータ構造 2011年7月8日課題の復習
簡易データベース 情報画像工学実験 I : 実験2 担当:関屋大雄(工学部1号棟515室)
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
基本情報技術概論I (第4回) 埼玉大学 理工学研究科 堀山 貴史
6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
データ構造とアルゴリズム (第3回) 静岡大学工学部 安藤和敏
アルゴリズムとデータ構造1 2006年6月23日
第11回放送授業.
アルゴリズムとデータ構造1 2009年6月15日
ネットワーク・プログラミング Cプログラミングの基礎.
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
プログラミング 4 文字列.
アルゴリズムとデータ構造 2010年6月17日
プログラミング演習I 2003年6月11日(第9回) 木村巌.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
情報処理Ⅱ 小テスト 2005年2月1日(火).
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
Presentation transcript:

データ構造とプログラミング技法 (第2回) ー線形構造ー

線形構造 用語: レコード:ひとまとまりのデータ(構造体) 線形リスト:n≧0個のレコードの1次元並び 順配置: 表   レコード:ひとまとまりのデータ(構造体) 線形リスト:n≧0個のレコードの1次元並び 順配置:   表 リンク配置: 連鎖リスト

順配置された線形リスト:表 論理構造 物理構造 a 要素の「位置」の順序関係を、アドレスの値の順序関係で表現する方法。 b c 0000 a d 0001 b 0002 e c 0003 d f 0004 e g 0005 f 0006 g h 0007 h

表に対する操作:要素の挿入・削除 論理構造 物理構造 0000 0000 a b a b 0001 0001 b c b c 0002 d c d 0003 d 0003 e 0004 e 0004 f d e 0005 f 0005 g e f 0006 g 0006 h 0007 h f g g h h

表に対する操作:アクセス N番目の要素 N番目の要素のアドレス =先頭番地+(N-1)×要素サイズ a b 0000 a c 0001 b d 0002 c N=5 e e 0003 d 0004 0004 e f 0005 f g 0006 g 0007 h h

リンク配置された線形リスト:連鎖リスト 論理構造 物理構造 実際 記法 a 0000 a 100b a b c 0003 h null b 0008 c 0032 c e f d 000d e 0106 d 001a g 0003 e 0032 d 000d g h f 0106 f 001a g 100b b 0008 h

連鎖リストに対する操作: 要素の挿入・削除 論理構造 物理構造 a b a b c b c c d e f d d e e f g h f g g h h

連鎖リストに対する操作: 要素の挿入・削除

連鎖リストに対する操作:アクセス N-1回リンクを辿る N番目の要素 a a b c b c e f d d N=5 e e g h f g

連鎖リストの変種

論理構造の表現法(物理構造) 論理構造=線形リスト 物理構造= 順配置(表) リンク配置(連鎖リスト) アクセスが早い、追加、削除、などの変更に弱い リンク配置(連鎖リスト) アクセスが遅い、追加、削除などの変更に適する

スタックと待ち行列:データ抽象化 データ構造+操作手続き 例: スタック 待ち行列 POP e PUSH e Enqueue a スタック    待ち行列      POP e PUSH e Enqueue a  Dequeue  b c d d c b a

スタックの操作(表を用いた場合)

キューの操作(表を用いた場合)

スタック/キューは何のために用いるか 系統的な記憶と想起のメカニズム スタック(LIFO) キュー(FIFO) 環境の保存と参照ー>再帰呼び出し 木・グラフの縦型探索 キュー(FIFO) バッファ(緩衝用)メモリ、装置間の速度差の吸収 木・グラフの横型探索

スタックの利用の例:1 迷路の探索:

探索木

迷路の探索アルゴリズム

list にスタックを用いた場合

木の縦型探索とスタック

再帰的構造 0, i=0 f(i)= 1, i=1 f(i-1)+f(i-2), i≧2 Fibonacci 数 int Fib(int i) { switch(i){ case 0: return(0);break; case 1: return(1);break; default: return(Fib(i-1)+Fib(i-2));} }

再帰的構造 Fib(3)→Fib(2)+Fib(1) →(Fib(1)+Fib(0))+1 →(1+0)+1 int Fib(int i) { switch(i){ case 0: return(0);break; case 1: return(1);break; default: return(Fib(i-1)+Fib(i-2));} } Fib(3)→Fib(2)+Fib(1) →(Fib(1)+Fib(0))+1 →(1+0)+1

再帰的構造 同じ変数名であっても、関数呼び出しの度に、別の記憶領域が確保される(スタックを利用している。) 変数の内容は、他の関数呼び出しによって破壊されることはない。

Advanced-1 Fibonacci数を再帰呼び出しで 求めるプログラム #include <stdio.h> int fib(int x) { switch(x){ case 0: return 0; break; case 1: return 1; break; default: return fib(x-1)+fib(x-2); } int main(int argc, char *argv[]) { int x; while(--argc){ x=atoi(*++argv); printf("Fib %d = %d\n",x,fib(x)); } return 0; 実行例: % ./fib 15 Fib 15 = 610

Advanced-2 環状連鎖リストを使った 電光掲示板風表示ログラム #include <stdio.h> #include <string.h> #include <unistd.h> //Self referential structure type definition typedef struct node{ char c; struct node *next; } NODE; NODE *AllocNodes(int num) {//Memory allocation NODE *rt; int i; rt=(NODE *)malloc(sizeof(NODE) *num ); for (i=0; i<num; i++){ if (i<num-1) (rt+i)->next = (rt+i+1); else (rt+i)->next = rt;//connect tail to head } return rt; 実行例: % ./link1 This is a pen 与えた文字列が横スクロールする

Advanced-2 続き void SetChar(NODE *p, char *ref) { while(*ref){ p->c=*ref; p=p->next; ref++; } int main(int argc, char *argv[]) { int len; char line[300]; NODE *s; line[0]=(char)NULL; while(--argc){//concatinate args strcat(line,*++argv); strcat(line," "); } len=strlen(line);//string length s=(NODE *)AllocNodes(len); SetChar(s,line); while(1){  //Endless Loop PrintNode(s,len); putchar ('\r'); //Carridge return s=s->next; usleep(80000); PrintNode(NODE *p,int n) { while(n--){ printf("%c",p->c); p=p->next; } fflush(stdout);

Advanced -2 STACK/QUEUE #include <stdio.h> #include <stdlib.h> //#define QUEUE // キュー #define STACK //スタック #define SIZ 10 void en_queue(); void en_queue(queue * Q, int v) { Q->QR = (Q->QR+1)%QUEUE_SIZ; if (Q->QR == Q->QF) { fprintf(stderr,"Queue Overflow\n"); exit(1); }else{ Q->Buf[Q->QR] = v; } de_queue(queue * Q) fprintf(stderr,"Queue Underflow\n"); Q->QF = (Q->QF+1)%QUEUE_SIZ; return Q->Buf[Q->QF]; #endif /******** キューの定義終わり *************/ /********* キューの定義**************/ #ifdef QUEUE #define Add(Q,x) en_queue(&Q,x) #define Get_And_Delete(Q) de_queue(&Q) #define Not_Empty(Q) Q.QF!=Q.QR #define Init(Q) Q.QF=Q.QR=0 #define Stack_or_Queue queue #define QUEUE_SIZ SI //キューのサイズstruct Queue { int Buf[QUEUE_SIZ]; int QF; int QR; }; typedef struct Queue queue; /* QUEUE 用 */

Advanced -2続き 実行例: % stack-queue ABCDEFGHI IHGFEDCBA main() { int i,c; /******** スタックの定義 *****************/ #ifdef STACK #define Add(S,x) push(&S,x) #define Get_And_Delete(S) pop(&S) #define Not_Empty(S) S.SP>0 #define Init(S) S.SP=0 #define Stack_or_Queue stack #define STACK_SIZ SIZ //スタックのサイズ struct Stack { int Buf[STACK_SIZ]; int SP; }; typedef struct Stack stack; void push(stack* S,int d) { if (S->SP<STACK_SIZ-1) { S->Buf[S->SP++]=d; }else{ fprintf(stderr,"Stack overflow.\n"); exit(1); } pop(stack* S) if (S->SP > 0) { return S->Buf[--(S->SP)]; fprintf(stderr,"Stack underflow.\n"); #endif /******* スタックの定義終わり ***********/ main() { int i,c; Stack_or_Queue X; Init(X); for (i=0; i< SIZ-1; i++) { c=(int)('A'+i); Add(X,c);putchar(c); } putchar('\n'); while(Not_Empty(X)) putchar(Get_And_Delete(X)); 実行例: % stack-queue ABCDEFGHI IHGFEDCBA