資料結構 第2章 陣列.

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
电子成绩单项目实现.
Introduction 基本概念 授課老師:蕭志明
陣列 Array chapter 3 德明科技大學資訊科技系.
第三章 鏈結串列 Linked List.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
高山寒原 高山草原 組員: 方淑怡 方慧樺 李秋婷 鄭涵云.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
單向鏈結串列 Singly Linked Lists.
資料結構 第3章 鏈結串列.
C语言程序设计 第十二章 位运算.
第十一章 結構.
C程序设计 第9章 自定义数据类型 主讲教师: 鲁 萍 西安建筑科技大学 理学院.
Chapter 2 陣列結構 資料結構導論 - C語言實作.
Visual C++ introduction
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 指定字串的初值 8-3 指標與字串 8-4 字串處理 8-5 C語言的字串函數.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
String C語言-字串.
结构体和共用体 2 梁春燕 华电信息管理教研室.
第五章 数组和 广义表 数组 稀疏矩阵 广义表.
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
第九章 结构体和共用体 结构体的定义 结构体的使用 共用体的定义 共用体的使用 主讲:李祥 时间:2015年10月.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
C語言簡介 日期 : 2018/12/2.
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
Chapter 2 陣列結構 資料結構導論 - C語言實作.
第二章 鏈結串列 2-1 線性串列 2-2 認識陣列 2-3 矩陣的簡介與運算 2-4 陣列與多項式.
Chap 2 Array (陣列).
C语言 程序设计基础与试验 刘新国、2012年秋.
第3章 指標與字串 (Pointers and Strings)
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
第13章 结构体的应用 13.1 了解由用户构造的数据类型 13.2 结构体类型说明及结构体变量 13.3 结构体数组
程式設計實習課(四) ----C 函數運用----
Chapter 2 聯立線性方程式與矩陣 授課教師:李金鳳(Amy Lee)
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
第一單元 建立java 程式.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
7.1 广义表的概念 广义表是n(n≥0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
OOP6 結構Struct 黃兆武.
第十章 结构体与链表 西安工程大学.
雲端計算.
輸入&輸出 函數 P20~P21.
第十章 指標.
第九章 字串.
挑戰C++程式語言 ──第8章 進一步談字元與字串
C语言的特点 1. C程序由许多函数组成 2. C程序必须有且只有一个主函数main( ) 3. 函数用“{”和“}”表示起点和终点
向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。
第三章 数据抽象.
C qsort.
C程序设计.
第14章 結構與其他資料形式.
陣列與結構.
指標、串列 (Linked List).
Happy New year.
第 三 章 陣 列 課程名稱:資料結構 授課老師:________ 2019/5/15.
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
實習八 函式指標.
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
Array(陣列) Anny
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
台大資訊工程學系 資訊系統訓練班 第119期 吳晉賢
InputStreamReader Console Scanner
Presentation transcript:

資料結構 第2章 陣列

2-1 認識陣列 2-1-1 一維陣列 int A[3] = {10, 20, 30};

2-1-2 二維陣列

2-1-3 三維陣列

2-2 陣列的運算 一維陣列常見的運算 建立 (create) 讀取 (retrieve) 寫入 (store) 插入 (insert) 2-2 陣列的運算 一維陣列常見的運算 建立 (create) 讀取 (retrieve) 寫入 (store) 插入 (insert) 刪除 (delete) 複製 (copy) 搜尋 (search) 走訪 (traverse)

範例2.1:撰寫一個函數實作一維陣列的 [走訪] 運算並分析其時間複雜度。 array_traverse(int A[], int n) { int i; for(i = 0; i < n; i++) printf("%d\n", A[i]); } main() int A[5] = {10, 20, 30, 40, 50}; array_traverse(A, 5);

二維陣列常見的運算 矩陣轉置 (matrix transposition) A = B = At = 例如:

矩陣相加 (matrix addition)

矩陣相乘 (matrix multiplication)

範例2.4: [矩陣走訪] 撰寫一個函數印出矩陣的所有元素並分析其時間複雜度。 範例2.4: [矩陣走訪] 撰寫一個函數印出矩陣的所有元素並分析其時間複雜度。 matrix_traverse(int m, int n, int A[m][n]) { int i, j; for(i = 0; i < m; i++){ for(j = 0; j < n; j++) printf("%d ", A[i][j]); printf("\n"); } main() int A[2][3] = {{11, 12, 13}, {21, 22, 23}}; matrix_traverse(2, 3, A);

2-3 陣列的定址方式 一維陣列的定址方式 我們根據以列為主來討論一維陣列A[upper0] 的定址方式,假設第一個元素A[0] 的位址為α,則元素A[i] 的位址為α + i x length。

二維陣列的定址方式 我們根據以列為主來討論二維陣列A[upper0][upper1] 的定址方式,假設第一個元素A[0][0] 的位址為α,則元素A[i][0] 的位址為α + i x upper1 ,元素A[i][j] 的位址為α + i x upper1 + j 。

範例2.7:假設以C語言宣告一個浮點數陣列float A[7][8]; (已知sizeof(float) 等於4),若元素A[3][4] 在記憶體空間的位址為100,則元素A[5][6] 的位址為何?而元素A[2][3] 的位址又為何? 解答: A[5][6] 的位址 = A[3][4] 的位址 + 位移量 = 100 + ((5 x 8 + 6) - (3 x 8 + 4)) x 4 = 172 A[2][3] 的位址 = A[3][4] 的位址 + 位移量 = 100 + ((2 x 8 + 3) - (3 x 8 + 4)) x 4 = 64

三維陣列的定址方式 我們根據以列為主來討論三維陣列A[upper0][upper1][upper2] 的定址方式,假設第一個元素A[0][0][0] 的位址為α,則元素A[i][0][0] 的位址為α + i x upper1 x upper2,元素A[i][j][0] 的位址為α + i x upper1 x upper2 + j x upper2,元素A[i][j][k] 的位址為α + i x upper1 x upper2 + j x upper2 + k 。

範例2.10:假設以C語言宣告一個浮點數陣列float A[6][7][8]; (已知sizeof(float) 等於4),若元素A[3][4][5] 在記憶體空間的位址為1000,則元素A[1][2][3] 的位址為何? 解答: 1000 + ((1 x 7 x 8 + 2 x 8 + 3) - (3 x 7 x 8 + 4 x 8 + 5)) x 4 = 480

n維陣列的定址方式 我們根據以列為主來討論n維陣列A[upper0][upper1] …[uppern-1] 的定址方式,假設第一個元素A[0][0]…[0] 的位址為α,則元素A[i0][0]…[0] 的位址為: α + i0 x upper1 x upper2 x … x uppern-1 元素A[i0][i1][0]…[0] 的位址為: + i1 x upper2 x upper3 x … x uppern-1 元素A[i0][i1][i2]…[in-1] 的位址為:

2-4 陣列的應用 2-4-1 多項式 陣列可以用來存放多項式 ,方式如下: 2-4 陣列的應用 2-4-1 多項式 陣列可以用來存放多項式 ,方式如下: 使用陣列Polynomial存放多項式cnXn + cn-1Xn-1 +… + c1X1 + c0X0,Polynomial[] = {n, cn, cn-1, …, c1, c0},以8X4 - 6X2 + 3X5 + 5為例,Polynomial[] = {5, 3, 8, 0, -6, 0, 5} 使用陣列Polynomial存放多項式cm-1Xem-1 + … + c1Xe1 + c0Xe0,Polynomial[] = {m, cm-1, em-1, …, c1, e1, c0, e0},以8X4 - 6X2 + 3X5 + 5為例,Polynomial[] = {4, 3, 5, 8, 4, -6, 2, 5, 0}

定義如下的NonZeroTerm結構表示非零項,然後定義如下的Polynomial結構表示多項式: typedef struct{ int coef; int exp; }NonZeroTerm; #define MAX_SIZE 100 int count; NonZeroTerm terms[MAX_SIZE]; }Polynomial;

以8X4 - 6X2 + 3X5 + 5為例,存放結果如下: count 4 terms [0] [1] [2] [3] coef exp -6 2

2-4-2 稀疏矩陣 除了多項式之外,陣列也經常用來存放稀疏矩陣 (sparse matrix),也就是非零元素相對較少的矩陣,例如:

我們可以定義如下結構存放稀疏矩陣的非零項: #define MAX_SIZE 100 typedef struct{ int row; int col; int value; }SparseTerm; 宣告一個陣列變數A代表前面的稀疏矩陣: SparseTerm A[MAX_SIZE];

A = A   [0] [1] [2] [3] [4] [5] [6] row 4 1 2 3 col 5 value 6

範例2.13:[稀疏矩陣轉置] 使用第2-4-2節定義的SparseTerm結構存放稀疏矩陣的非零項,然後撰寫一個函數實作稀疏矩陣轉置運算並分析其時間複雜度,下面是一個例子。

範例2.14:[下三角矩陣] 假設以一維陣列B來存放n×n的下三角矩陣A,即A[0][0] 存放在B[0]、A[1][0] 存放在B[1]、A[1][1] 存放在B[2]…餘此類推,試問,陣列B的長度為何?又A[i][j] 是存放在陣列B的哪個位置?

2-5 字串 對C語言來說,字串 (string) 是以空字元 ‘\0’ 結尾的一串字元,因此是以字元陣列的形式來表示字串,例如: 2-5 字串 對C語言來說,字串 (string) 是以空字元 ‘\0’ 結尾的一串字元,因此是以字元陣列的形式來表示字串,例如: char name1[] = "Jean Chen"; char name2[10] = "Mary"; char name3[5] = {'J', 'o', 'e', '\0'};

字串常見的運算 字串複製:例如strcpy(str, "Happy New Year"); 字串比較 :例如printf("%d", strcmp(str1, str2)); 字串轉換 :例如strupr("new");、strlwr(“NEW") ; 字串搜尋 :例如strstr(char *str1, char *str2) 函數會傳回一個指標,指向str2字串第一次出現在str1字串內的位置,若str1字串不包含str2字串,則傳回NULL 。

範例2.15:[字串長度] 撰寫一個函數模擬C語言的strlen(),以計算字串包含幾個字元。 解答: int StrLength(char str[]) { int i = 0; while(str[i] != '\0') i++; return i; }

範例2.17:[模式比對] 撰寫一個函數在str字串內比對另一個pat字串,若pat字串在str字串內,就傳回其起始位置,否則傳回 -1。 我們可以使用str[] = "yxyxxxyyxxx" 和pat[] = "yyx" 來模擬比對的過程:

2-6 結構 巢狀結構,例如: typedef struct{ int year; int month; 配置記憶體給結構: 2-6 結構 巢狀結構,例如: typedef struct{ int year; int month; int day; }DATE; char name[50]; DATE birthday; }PERSON; 配置記憶體給結構: PERSON employee; 存取結構的成員: employee.name = "Mary Wang"; employee.birthday.year = 1995; employee.birthday.month = 2; employee.birthday.day = 14;