許多程式設計師只把陣列看作「一片連續的記憶體區域」,這只是陣列的實現方式,儘管陣列通常被實現為一片連續的記憶體區域,但實現並非陣列的全部。直觀上,陣列由下標(或稱為索引)和值所組成的序對集合,其中對於每個有定義的下標,都存在乙個與其關聯的值。當把陣列作為抽象資料型別時,更加關心的是能夠在陣列上執行的操作。除了建立新陣列以外,大多數程式語言對陣列只提供兩種標準操作:乙個操作是檢索乙個值,另乙個操作是儲存乙個值。在c
語言中當陣列作為函式引數傳遞時,只是把陣列的首位址複製到乙個臨時的儲存單元供函式內部使用,陣列的大小函式內部是無法獲取的,只能通過顯示的傳入。
陣列是相同型別的資料的聚集。在
c語言中存在另外一種資料聚集的方式,這種方式允許資料具有不同的型別,這種機制稱為結構(
struct
,structure
)。乙個結構是資料項的聚集,其中的每乙個資料項用相應的型別和名稱標識。例如:
struct
person;
結構允許在內部嵌入另乙個結構。例如,對於上述結構要求包含生日資訊。為此,可以寫成如下形式:
struct
date;
struct
person;
可以利用
typedef
語句定義自己的結構資料型別,例如:
typedef struct person;或
typedef struct
person;
或typedef struct humanbeing
person;
定義了person
型別後就可以按如下方式使用:
person lilei;
結構體變數之間可以相互賦值,這種賦值方式是值拷貝的方式,但是不支援是否相等比較判定,相等或不相等的判定需要自己去實現。
共用體的宣告類似於結構,使用關鍵字
union
,共用體共享同一儲存空間,任意時刻共用體中的資料項只有乙個是有效的。共用體的大小是所有項中占用空間最大項的空間大小。例如定義乙個性別結構,男性可以以是否有鬍鬚區分,女性可以以生育小孩的數量來區分。
typedef struct ***type;
union
un;};定義個性別變數
***type ***;
當***.*** == female
時,可以通過
***.un.chirdren
來得到孩子的數量;當
***.*** == male
時,可以通過
***.un.beard
來得到該男性是否有鬍鬚。具體使用共用體中的哪個項是我們自己主動的去選擇,
c語言不會區分我們的選擇是否正確。比如當
***.*** == male
時,可以通過
***.un.chirdren
來得到孩子的數量,這在現實中是沒有意義的。上述共用體
un的大小是
int型別的大小。
結構中的值採用相同的方式進行儲存,即根據它們在結構中定義的順序按位址公升序進行儲存。然而,為了使得兩個相鄰的分量在記憶體中正確的對齊,結構內可能出現空洞或填塞。
乙個結構或共用體型別物件的大小是表示其最大分量所必需的儲存單元數目,其中也包括必要的填塞。下面舉例說明:
struct
teststra;
teststra
結構的大小是
16而不是9;
struct
teststrb;
teststrb
結構的大小是
16而不是11;
struct
teststrc;
teststrc
結構的大小是
4而不是3;
自引用結構是一種特殊的結構,它的乙個或多個分量是指向其自身的指標。自引用結構通常需要顯示地分配或釋放記憶體。例如:
typedef struct list
;自引用結構多用在鍊錶、樹、圖等資料結構的實現上。
本章主要介紹了陣列、結構以及共用體,這些基本的抽象資料型別是以後定義更為複雜的資料型別的基礎。
資料結構學習筆記(二)
分類 順序儲存結構 順序表 鏈式儲存結構 鍊錶 比較 順序表 可以隨機訪問 占用連續空間,儲存分配只能預先進行,即靜態分配。一旦分配好了,在對其操作過程中不變 插入操作需要移動多個元素 鍊錶 不可以隨機訪問 不需要占用連續空間,動態分配。即在要建立新結點的時候再進行空間劃分。插入操作不需要移動多個元...
資料結構學習筆記 陣列
package com.cc.array public class myarray 陣列插入元素 param index param element throws exception public void insert int index,int element throws exception ...
資料結構學習筆記 稀疏陣列
資料元素之間一對一的關係 順序儲存結構 位址連續 陣列 和鏈式儲存結構 位址不連續 鍊錶 陣列 鍊錶 佇列 棧 2.1.1 需求 由圖分析 使用二維陣列儲存棋盤存在大量無用資料 使用稀疏陣列優化 2.1.2 稀疏陣列優化 思路 2.1.3 實現思路 二維陣列轉稀疏陣列 遍歷二維陣列,得到有效資料的個...