数据结构简介以及抽象数据类型的实现
數據結構簡介
數據結構(英語:data structure)是計算機中存儲、組織數據的方式。
數據結構意味著接口或封裝:一個數據結構可被視為兩個函數之間的接口,或者是由數據類型聯合組成的存儲內容的訪問方法封裝。
大多數數據結構都由數列、記錄、可辨識聯合、引用等基本類型構成。舉例而言,可為空的引用(nullable reference)是引用與可辨識聯合的結合體,而最簡單的鏈式結構鏈表則是由記錄與可空引用構成。
數據結構可透過編程語言所提供的數據類型、引用及其他操作加以實現。一個設計良好的數據結構,應該在盡可能使用較少的時間與空間資源的前提下,支持各種程序運行。
不同種類的數據結構適合不同種類的應用,部分數據結構甚至是為了解決特定問題而設計出來的。例如B樹即為加快樹狀結構訪問速度而設計的數據結構,常被應用在數據庫和文件系統上。
基本概念和術語
數據是對客觀事物的符號表示,在計算機科學中指的是所有能輸入到計算機中并且被計算機程序處理的符號的總稱。
數據元素是數據的基本單位,在計算機中通常作為一個整體進行考慮與處理。一個數據元素可以由若干個數據項組成,例如一個數名是一個數據元素,則書名信息的每一項例如書名,作者的都可為數據項。數據項是數據的不可分割的最小單位。
數據項是相同性質的數據元素的集合,是數據的一個子集。
數據結構是相互之間存在一種或者多種特定關系的數據元素的集合,它們之間的關系可分為4類:集合,線性,樹,圖。
數據結構可定義為一個二元組:
DATA Structure=(D,S);
其中D為數據元素的有限集合,S為D上關系的有限集合。
數據類型是一個值得集合和定義在這個值上的一組操作的總稱。例如int是一個整型變量,其值為某個區間上的整數以及定義在其上的加減乘除操作。
抽象數據類型表現與實現
基本定義
抽象數據類型是指一個數學模型以及定義在該模型上的一組操作。
定義如下:
ADT complex{
數據對象:D={real, image | real∈實數, image∈實數} [3]
數據關系:R={<real,image>} [3]
基本操作}
具體實現
#include <stdio.h> #define ok 1; #define ERROR 0; typedef int Status; typedef int ElemType;typedef struct {ElemType e[3]; }Triplet;Status free(Triplet *T) //數組內容清空 {for (int i = 0; i < 3; i++){T->e[i] = 0;}return ok; } Status InitTriplet(Triplet *T, ElemType v0, ElemType v1, ElemType v2) //三元數組初始化 { // if (!T) exit(_CRT_GUARDOVERFLOW);T->e[0] = v0;T->e[1] = v1;T->e[2] = v2;return ok; } Status DestroyTriplet(Triplet *T) //三原數組銷毀 {free(T);T = NULL;return ok; } Status Get(Triplet *T, int i, ElemType *e) //得到位置i的數組值 {if (i < 0 || i>3)return ERROR;e = T->e[i - 1];return e; } Status Put(Triplet *T, int i, ElemType e) //將第i個位置的數組值賦值給e {if (i < 0 || i>3)return ERROR;T->e[i - 1] = e;return ok; } Status IsAscending(Triplet *T) //判斷數組是否升序排列 {return ((T->e[0] < T->e[1]) && (T->e[1] < T->e[2])); } Status IsDescending(Triplet *T) //判斷是否降序排列 {return ((T->e[0] > T->e[1]) && (T->e[1] > T->e[2])); } Status Max(Triplet *T, ElemType *e) //找出數組的最大值 {if (T->e[0] > T->e[1]){if (T->e[0] > T->e[2]){e = T->e[0];}elsee = T->e[2];}else{if (T->e[1] > T->e[2]){e = T->e[1];}elsee = T->e[2];}return e; } Status Min(Triplet *T, ElemType *e) //找出數組的最小值 {if (T->e[0] < T->e[1]){if (T->e[0] < T->e[2]){e = T->e[0];}elsee = T->e[2];}else{if (T->e[1] < T->e[2]){e = T->e[1];}elsee = T->e[2];}return e; } Status ShowTriplet(Triplet *T) //打印數組 {printf("三元組的值為:\n");for (int i = 0; i < 3; i++){printf("%d ", T->e[i]);}return ok; } int main() {Triplet T;Status i, flag;ElemType v0, v1, v2, e,e1,e2,e3;printf("請輸入三元組的值:\n");scanf_s("%d %d %d", &v0, &v1, &v2);getchar();flag = InitTriplet(&T, v0, v1, v2);printf("初始化函數后,flag=%d\n,", flag);printf("三元組中三個值分別為:%d,%d,%d\n", T.e[0], T.e[1], T.e[2]);ShowTriplet(&T);Put(&T, 2, 5);printf("賦值之后的數組為%d %d %d", T.e[0], T.e[1], T.e[2]);e1=Get(&T, 1, &e);printf("得到數組第一個數字為:%d\n",e1);e2=Max(&T, e);printf("得到數組最大數字為:%d\n", e2);e3=Min(&T, e);printf("得到數組最小數字為:%d\n", e3);printf("判斷三元組是否為升序:%d\n", IsAscending(&T));printf("判斷三元組是否為降序:%d\n", IsDescending(&T));DestroyTriplet(&T);printf("三元組內容為:%d %d %d", T.e[0], T.e[1], T.e[2]);getchar();return 0;}
如圖為演示結果,輸入三元數組的值,系統將對其進行如下操作,可能有的人會對三元組升序為何判斷也是0產生疑問,之所以也是0是因為中間修改過第二個數組元素的值,其被改為5,所以下面的升降序判斷的也是修改后的數組元素,是沒有問題的。
`
總結
以上是生活随笔為你收集整理的数据结构简介以及抽象数据类型的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis对象类型与编码
- 下一篇: 数据结构 稀疏矩阵的实现方法