データ構造とアルゴリズム 第12回 リスト構造(2) 静岡大学工学部 安藤 和敏 2011.07.01 目次 1. 変数とメモリ (基本の確認) 2. リスト構造 (前回の復習,TraverseList も) 3. リストに対する挿入と削除の操作 4. 実習 目次 1. 変数とメモリ (基本の確認) 2. リスト構造 (前回の復習,TraverseList も) 3. リストに対する挿入と削除の操作 4. 実習 コンピュータのメモリのイメージ アドレス 内容 0 1 2 3 4 5 6 7 175 . . . 安藤 浜松 2004 . . . 変数とメモリ int x; と宣言することによ って、xという名前が 付けられた4バイト 分のメモリ領域が確 保される。 確保されるバイト数 はその変数の型に 依存する。p.18の表 2.3を見よ。 アドレス 0 1 2 3 4 5:x: 6 7 内容 175 安藤 浜松 2004 . .以降は、この確保されたメモ と言う名前 .リ領域の内容をx. . . で参照できるようになる。 ポインタとメモリ(教科書p.143-144) int x; int *p=&x; アドレス 内容 0 1:p: 2 3 4 5 6 7:x: 175 7 安藤 浜松 2004 ポインタ変数 pの 内容=7 xの宣言によっ て確保されたメ モリ領域 ポインタとメモリの関係の図示 int x; int *p=&x; アドレス p: x: 内容 以降では、前 ページのよう な状況を図示 するために、 このような矢 線を用いて表 現する。 構造体ポインタとメモリ struct COMPLEX a={1,-2}; struct COMPLEX *p=&a; アドレス 0 1 2 3:p: 4 5:a: 7 8 内容 ポインタ変数 pの 内容=5 5 (real) 1 (img) -2 aの宣言によっ て確保されたメ モリ領域 構造体ポインタからのメンバの参照 struct COMPLEX a={1,-2}; struct COMPLEX *p=&a; メモリの内容 p: a: (real) 1 (img) -2 構造体ポインタ pを介してaのメ ンバrealを参照 するときには、 p->real, p->img 目次 1. 変数とメモリ (基本の確認) 2. リスト構造 (前回の復習,TraverseList も) 3. リストに対する挿入と削除の操作 4. 実習 目次 1. 変数とメモリ (基本の確認) 2. リスト構造 (前回の復習,TraverseList も) 3. リストに対する挿入と削除の操作 4. 実習 リストに対する挿入: Insert リストが与えられたときに、ポインタ p が指し示すセ ルの次に、整数 x が入ったセルを挿入する。 p root 10 8 4 23 4 23 p root 10 8 x 関数 Insert の説明: p!=NULLのとき void Insert(int x, struct CELL *p) { struct CELL *newcell; newcell = (struct CELL *) malloc(sizeof(struct CELL)); newcell->data = x; if (p != NULL) { newcell->next = p->next; p->next = newcell; p } else { // p == NULL newcell->next = root; 8 root = newcell; } } newcell 4 x 関数 Insert の説明: p==NULLのとき void Insert(int x, struct CELL *p) { struct CELL *newcell; newcell = (struct CELL *) malloc(sizeof(struct CELL)); newcell->data = x; p==NULL root 10 if (p != NULL) { newcell->next = p->next; p->next = newcell; newcell } else { newcell->next = root; root = newcell; } } 8 x リストに対する削除操作: Delete リスト構造が与えられたときに、ポインタ p の指し示 すセルの次のセルを削除する。 p root root 10 8 10 8 4 23 23 関数 Delete の説明: p!=NULL の場合 void Delete(struct CELL *p) { struct CELL *temp; if (root == NULL) printf("Error: List is empty.\n"); temp p if (p == NULL) { temp = root; 8 4 root = root->next; free(temp); } else if (p->next != NULL) { temp = p->next; p->next = p->next->next; free(temp); } } 23 関数 Delete の説明: p==NULL の場合 void Delete(struct CELL *p) { struct CELL *temp; if (root == NULL) printf("Error: List is empty.\n"); if (p == NULL) { temp = root; root = root->next; free(temp); } else ifp==NULL (p->next !=temp NULL) { temp = p->next; p->next = p->next->next; 10 8 free(temp); root } } 4 目次 1. 変数とメモリ (基本の確認) 2. リスト構造 (前回の復習,TraverseList も) 3. リストに対する挿入と削除の操作 4. 実習
© Copyright 2024 ExpyDoc