• 検索結果がありません。

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
39
0
0

読み込み中.... (全文を見る)

全文

(1)

バイオプログラミング第1

榊原 康文、佐藤 健吾

(2)

ポインタ変数の扱い方

① ポインタ変数の宣言

int *p;

double *q;

② ポインタ変数へのアドレスの代入

int *p;

と宣言した時,p がポインタ変数

int x;

と普通に宣言した変数に対して,

p = &x;

はxのアドレスのポインタ変数

pへの代入

(3)

ポインタ変数の扱い方

③ 間接参照(演算子)

*【ポインタ変数名】

例)

*p;

により,ポインタ変数が指す変数の実体を 「間接的」に扱える

(4)

データ構造とポインタ

構造体とポインタ

関数とポインタ

配列とポインタ

文字列とポインタ

ポインタ配列

ポインタのポインタ

引数付きmain関数

(5)

構造体とポインタ

①構造体のポインタ変数宣言: struct 【構造体タグ名】 *【構造体ポインタ変数名】; 例) struct DATE_DATA { int year; int month; int day; }; struct DATE_DATA today;

(6)

構造体とポインタ

②構造体ポインタ変数の参照・代入: 【構造体ポインタ変数名】->【メンバ名】 例) pdata=&today; とアドレスを代入した時, today.year ⇔ (*pdata).year ⇔ pdata->year (*【構造体ポインタ変数名】).【メンバ名】 と同じ

(7)

関数とポインタ

①ポインタと関数引数: 「参照による呼出し (call by reference)」 アドレスを引数として関数へ渡す 「値による呼び出し (call by value)」 変数の値を引数として関数へ渡す 関数の引数はポインタでなければならない

(8)

#include <stdio.h> int add20(int x);

void addp20(int *p); void main(void) { int k, m, n; m=10; n=10; k=add20(m); addp20(&n); printf(”%d %d %d”, k, m, n); } int add20(int x) { x+=20; return x; }

void addp20(int *p) {

*p+=20;

}

(9)

関数とポインタ

②ポインタを返す関数 戻り値がポインタとなる関数の宣言 【関数のデータ型】 *【関数名】 (【引数の並び】) 例) void main(void) { int *p; p=func(10); }

int *func(int x) {

int y;

y=x+100;

return &y;

(10)

リンクによるリスト(

linked list)

ポインタの応用

動的な記憶領域の確保

(11)

リンクによるリスト

リストは,配列のような一種のデータ構造

①リストは,項目(要素)を一列に並べるという点 で配列と同じ ②配列では,逐次的な構造が(配列中の位置に よって)自然に指定される ③リストでは,項目を入れる「節点」の中に次の節 点を明示的に指示するリンク(ポインタ)を入れて 表現する

(12)

配列: char a[5] a[0] a[1] a[2] a[3] a[4] A L I S T リンクによるリスト: A L I S T 節点 リンク

(13)

リンクによるリスト

①リストの先頭の節点を指すダミーの節点を設定して, これを「head」 (またはroot)で表すことにする ②リスト中で最後に位置する節点として,ダミーの節点を 設定して,これを「tail」で表すことにする A B C NULL head tail

(14)

C言語によるリストの実現

準備

①記号定数 NULL ポインタに対する特別な値であることを示す記号 としてゼロの代わりに使われる ② sizeof 演算子 (教科書p-22) データ型や変数の大きさ(バイト数)を求める演算子 sizeof(【型名または変数名】) 例) sizeof(int) 4バイト

(15)

C言語によるリストの実現

③型変換演算子 (キャスト演算子) (教科書p-40) データ型の一時的変換を行う演算子

(【型】) (【変数または式】)

(16)

C言語によるリストの実現

④動的に記憶領域を確保するための標準関数 malloc (【記憶領域の大きさ(バイト数 n)】) ⚫nバイトの初期化されていないメモリへのポインタ を返す ⚫mallocから返されるポインタは,適当な型に変換 されなければならない #include <stdlib.h>

(17)

C言語によるリストの実現

⑤記憶領域を解放する free (【解放する記憶領域を指すポインタ】) ⚫必要の無くなった記憶領域をOSへ返す ⚫メモリの無駄をなくす #include <stdlib.h>

(18)

C言語によるリストの実現

構造体を使った節点の実現

struct node { int key; struct node *next; }; 自己参照構造体: 構造体の中に,自分自身の構造体を参照するメンバを 含めることができる key next node

(19)

C言語によるリストの実現

mallocを使った新しい節点の動的な生成

struct node *x;

x=(struct node *) malloc(sizeof(*x));

(20)

初期化

struct node *head, *tail; void listinitialize(void)

{

head = (struct node *) malloc(sizeof(* head)); tail = (struct node *) malloc(sizeof(* tail));

head->next = tail; tail->next = NULL; };

NULL

(21)

リスト表現を用いた操作

挿入

削除

参照

(22)

挿入

A B C

NULL

head tail

(23)

挿入

A B C

NULL

head tail

(24)

挿入

struct node *insertafter(int v, struct node *p) {

struct node *x;

x = (struct node *) malloc(sizeof(* x)); x->key = v;

x->next = p->next; p->next = x;

return x;

(25)

挿入

struct node *insertafter(int v, struct node *p) {

struct node *x;

x = (struct node *) malloc(sizeof(* x)); x->key = v; x->next = p->next; p->next = x; return x; }; p v q

(26)

削除

void deletenext(struct node *p) { struct node *x; x = p->next; p->next = p->next->next; free(x); }; x p v q

(27)

削除

void deletenext(struct node *p) { struct node *x; x = p->next; p->next = p->next->next; free(x); }; p v q

(28)

削除

void deletenext(struct node *p) { struct node *x; x = p->next; p->next = p->next->next; free(x); }; p q

(29)

参照

k番目の要素(節点)の値を参照

⚫ リストでは,headからリンクをたどっていくしかない (kステップかかる)

(30)

配列: char a[5]

a[0] a[1] a[2] a[3] a[4]

A L I S T

リンクによるリスト:

(31)

参照

x = head; while(x->next->next != NULL) { x = x->next; printf("%d ", x->key); }; A B C NULL head tail struct node *x;

(32)

節点の並べ変え

ポインタのつけかえのみ

A B C NULL head tail 例) Cをリストの末尾から先頭へ移動

(33)

節点の並べ変え

ポインタのつけかえのみ

A B C

NULL

(34)

節点の並べ変え

ポインタのつけかえのみ

A B C

NULL

(35)

節点の並べ変え

ポインタのつけかえのみ

A B C NULL head tail 3つのポインタのつなぎ変え

(36)

今日の課題

課題1

授業中に紹介したlinked listのプログラ

ムを完全なプログラムにしなさい。main

関数の中でscanfを使って数字を読み込

むこと。

(37)

今日の課題

課題2

課題1で作成したプログラムに、登録し

た値すべてを表示する機能を追加しなさ

い。

(38)

今日の課題

課題3(発展課題)

課題2で作成したプログラムに、登録し

た値が小さい順にソートする機能を追加

しなさい。

(39)

考察で期待すること

linked listの挿入や削除を理解する

各ステップにおけるリストの状態を表示

参照

関連したドキュメント

理工学部・情報理工学部・生命科学部・薬学部 AO 英語基準入学試験【4 月入学】 国際関係学部・グローバル教養学部・情報理工学部 AO

講師:首都大学東京 システムデザイン学部 知能機械システムコース 准教授 三好 洋美先生 芝浦工業大学 システム理工学部 生命科学科 助教 中村

(Please note that, because Japanese language proficiency is not required for admission to the Program, the letter of recommendation does not need to be written by a teacher of

1978年兵庫県西宮市生まれ。2001年慶應義塾大学総合政策学部卒業、

を育成することを使命としており、その実現に向けて、すべての学生が卒業時に学部の区別なく共通に

を育成することを使命としており、その実現に向けて、すべての学生が卒業時に学部の区別なく共通に

向井 康夫 : 東北大学大学院 生命科学研究科 助教 牧野 渡 : 東北大学大学院 生命科学研究科 助教 占部 城太郎 :