2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」

Slides:



Advertisements
Similar presentations
1 データ構造とアルゴリズム 第 3 回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
Advertisements

第 10 回 宿題 出題日: 12 月 14 日 締切日: 12 月 21 日. 提出について 以下の場合は、出題日の出席を欠席とする 締切日を過ぎた場合 正解率が 7 割未満の場合 提出は、 PDF ファイルを印刷して、それに答 えを書いて提出すること。
アルゴリズムと データ構造 第 3 回 基本的なデータ構造(2) : 配列 1. 前回の復習 アルゴリズムの計算量 最悪(最大)計算量 計算量の漸近的評価 (オーダ)  多項式時間アルゴリズム( polynomial time algorithm )  指数時間アルゴリズム( exponential.
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
アルゴリズムとデータ構造 第2回 線形リスト(復習).
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
第13回構造体.
データ構造とアルゴリズム 第10回 mallocとfree
第12回構造体.
プログラミング入門2 ポインタについて補足 構造体 第11回 芝浦工業大学情報工学科 青木 義満、篠埜 功
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
第8回 プログラミングⅡ 第8回
アルゴリズムとデータ構造 2011年6月13日
構造体.
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
情報処理Ⅱ 2007年12月10日(月).
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
ファイル操作と文字列の利用.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
構造体 構造体, 構造体とポインタの組み合わせ,.
第10回 プログラミングⅡ 第10回
プログラミング論 関数ポインタ と 応用(qsort)
ネットワークプログラミング 第4回「C言語の基礎~ポインタと配列」
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
第11回 宿題 出題日:12月21日 締切日:1月7日(木).
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
第11回 プログラミングⅡ 第11回
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
構造体と共用体.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
データ構造とアルゴリズム 第11回 リスト構造(1)
11: 動的メモリ確保 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
ポインタとポインタを用いた関数定義.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとデータ構造1 2009年6月15日
R8C I/Oポートの仕組み SFR定義ファイルの中身.
ネットワーク・プログラミング Cプログラミングの基礎.
11: 動的メモリ確保 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング論 構造体
アルゴリズムとデータ構造 2010年6月17日
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
C言語講座第5回 2017 構造体.
高度プログラミング演習 (10).
Presentation transcript:

2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」 西尾 信彦 nishio@cs.ritsumei.ac.jp 立命館大学情報理工学部 情報システム学科

配列で何でもできる!わけではない? 配列に身長データを格納する 2つ配列があるのは面倒なのでひとつにしよう 学生番号順に格納した 身長順にしたい 身長順の添字をデータとする別の配列を用意 2つ配列があるのは面倒なのでひとつにしよう 2次元配列か構造体(どちらでもいいがここでは構造体にする) ひとつの要素に2つのデータ(身長と順番) ひとつにする意味が希薄 データの増減時に大変面倒、全書換えが起きる 自分の次に背の高いデータの添字を格納して解決!

構造体を定義しよう 配列と似ている、違うのは異なった型のデータを集めているところ このため定義が面倒、長くなる char line[100]; 黄色が型定義 毎回書くのは面倒 型に名前をつけよう struct student {…} taro; と一度定義したら後はstruct student型として使える。{…}が省略できる struct { int data; char name[100]; int *pointer; } taro;

構造体の例: 実行結果: #include <stdio.h> #include <string.h> int main(){ struct student{ /* 構造体の定義 */ char name[40]; int height; }A_san = {"Ritsumei Taro", 172}, B_san; /* 変数A_sanは宣言と同時に初期化 */ strcpy(B_san.name, "Kinugasa Hanako"); /* B_sanのnameに値を代入 */ B_san.height = 155; /* B_sanのheightに値を代入 */ struct student *pointer; /* 構造体へのポインタを定義 */ pointer = &B_san; /* struct student型のB_sanのアドレスを代入 */ /* 構造体変数A_sanのメンバを表示 */ printf("A_san: Name=\"%s\" Height=%d\n", A_san.name, A_san.height); /* 構造体へのポインタを使って構造体のメンバへアクセス */ printf("B_san: Name=\"%s\" Height=%d\n", pointer->name, pointer->height); } 実行結果: A_san: Name=“Ritsumei Taro" Height=172 B_san: Name=“Kinugasa Hanako" Height=155

自分の隣りのデータを指し示す それがリストの本質 構造体のメンバは 添字で指していたものをポインタで指そう 自分のデータと 自分の次のデータのある場所へのポインタ まだ構造体型が定義できる前 にそれを参照している 自分で自分を参照(再帰的参照) ポインタというデータはサイズが 変らないので許されている struct student { int data; struct student *next; } table[100];

静的な構造体によるリストの例(教科書p.21): #include <stdio.h> int main(){ struct _elem{ /* 構造体の定義 */ int height; struct _elem *next; }a[5]; struct _elem *p; /* 構造体へのポインタの定義 */ /* 構造体の配列のメンバheightにデータを代入 */ a[0].height = 174; a[1].height = 158; a[2].height = 166; a[3].height = 170; a[4].height = 162; /* 各構造体を繋ぐ */ a[1].next = &a[4]; a[4].next = &a[2]; a[2].next = &a[3]; a[3].next = &a[0]; a[0].next = NULL; for(p = &a[1]; p != NULL; p = p->next){ printf("%d\n", p->height); } 実行結果 158 162 166 170 174

動的メモリ管理 いままでは、プログラムが動く前にすべての変数が定義されていた。 静的変数という プログラムが動いた結果、必要な変数がわかるような場合は、プログラム実行中に変数を作りたい これを動的というが、変数としての名前がついてない。データを格納するメモリ領域を確保するだけ 名前がないのでプログラム中ではポインタを用いて アクセスする。

何がどれだけ欲しいのか? どれだけというのはメモリのサイズ(バイト数)のこと malloc関数にメモリ領域を確保してもらえる sizeof演算子を使おう sizeof(struct student)という演算をするとstruct Student型のデータを格納するのに必要なバイト数が整数として計算される malloc関数にメモリ領域を確保してもらえる struct student型のデータを100個格納する領域は malloc(sizeof(struct student) * 100) のように確保する

動的メモリ確保の例: 実行結果: Dynamic Storage Allocation! #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ char *str; str = (char *)malloc(sizeof(char) * 128); /* 文字列のために動的にメモリを確保 */ if(str == NULL){ /* エラー処理 */ printf("メモリが確保できません\n"); exit(1); } strcpy(str, "Dynamic Storage Allocation!\n"); /* 文字列をコピー */ printf("%s\n", str); /* 文字列の表示 */ free(str); /* 動的に確保した領域を解放する */ 実行結果: Dynamic Storage Allocation!

3 a: p: q: 図に示すデータ構造をC言語のプログラムソースで書き、qを使って変数aの中身を表示しなさい。

a l g o r i t h m \0 *str メモリ空間上のある場所に、上図のように文字列が格納されており,ポインタ変数strは矢印のアドレスを指す。この時,*(str+4)は何を指すか。それを確認するプログラムソースを書きなさい。