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