三元組
一、什么是三元組
在初步了解了數(shù)據(jù)結(jié)構(gòu)的研究內(nèi)容后,做一個簡單的嘗試——三元組。
三元組是數(shù)據(jù)結(jié)構(gòu)里的一個基本概念。主要是用來存儲稀疏矩陣的一種壓縮方式,也叫三元組表。
三元組中存放三個值(x,y,z)分別代表矩陣的行、列、值。
二、三元組抽象數(shù)據(jù)類型描述
ADT Triplet {
數(shù)據(jù)對象:D = {e1,e2,e3 | e1,e2,e3屬于ElemType}
數(shù)據(jù)關(guān)系:R = {<e1,e2> | <e2,e3>}
基本操作:
initTriplet(&T,v1,v2,v3)
操作結(jié)果:構(gòu)造一個空的三元組T。
destroyTriplet(&T)
初始條件:三元組T已存在。
操作結(jié)果:銷毀三元組。
getElem(T,i,&e)
初始條件:三元組T已存在,且1<=i<=3。
操作結(jié)果:用e返回T中第i個元素的值。
putElem(&T,i,e)
初始條件:三元組T已存在,且1<=i<=3。
操作結(jié)果:將第i個元素置換為e。
printTriplet(Triplet &T)
初始條件:三元組T已存在。
操作結(jié)果:顯示三元組。
getMax(T,&e)
初始條件:三元組T已存在。
操作結(jié)果:用e返回三元組T中的最大值。
getMin(T,&e)
初始條件:三元組T已存在。
操作結(jié)果:用e返回三元組T中的最小值。
}
三、三元組操作實現(xiàn)
1、預(yù)定義
#define OK 1
#define ERROR 0
typedef int Status;
//三元組的類型先定義為float,可以隨時變換成別的類型
typedef float ElemType;
typedef ElemType *Triplet;
2、初始化
Status initTriplet(Triplet &T, ElemType v0, ElemType v1, ElemType v2) {
//動態(tài)分配3個字節(jié)的內(nèi)存來存儲三元組中的三個值。
T = (Triplet)malloc(3 * sizeof(v0, v1, v2));
T[0] = v0;
T[1] = v1;
T[2] = v2;
return OK;
}
在C語言中沒有動態(tài)數(shù)組類型,數(shù)組的長度是預(yù)先定義好的,而在實際的開發(fā)中,經(jīng)常無法確定空間大小的情況。因此需要根據(jù)實際動態(tài)分配和回收內(nèi)存空間。這里用到動態(tài)分配內(nèi)存函數(shù)malloc();文章來源:http://www.zghlxwxcb.cn/news/detail-669131.html
3、銷毀三元組
Status DestroyTriplet (Triplet &T) {
free(T);
return OK;
}
4、用e獲取T的第i個元素的值
Status getElem(Triplet T, int i, ElemType e) {
//參數(shù)i輸入范圍為1~3。
if (i < 1 || i > 3)
//非法輸入返回ERROR。
return ERROR;
else
//正常輸入,用e返回。
e = T[i - 1];
printf("%f", e);
return OK;
}
5、置T的第i元的值為e
Status putElem(Triplet T, int i, ElemType &e) {
if (i < 1 || i > 3)
return ERROR;
else
T[i - 1] = e;
printf("%f", e);
return OK;
}
6、用e返回指向T的最大元素的值
ElemType getMax(Triplet T, ElemType &e) {
if (T[0] > T[1])
e = T[0];
else
e = T[1];
if (T[2] > e)
e = T[2];
printf("%f", e);
return e;
}
7、用e返回指向T的最小元素的值
ElemType getMin(Triplet T, ElemType &e) {
//比較第一、二個元素,將較大值賦給e,用e與第三個元素比較,將較大值賦給e并返回。
if (T[0] < T[1])
e = T[0];
else
e = T[1];
if (T[2] < e)
e = T[2];
printf("%f", e);
return e;
}
8、顯示三元組
Status printTriplet (Triplet &T) {
int i;
for (i = 0; i < 3; i++) {
printf("%f\n", T[i]);
}
printf("\n");
return OK;
}
9、主函數(shù)
int main() {
int n;
int i;
Triplet T;
Status flag;s
ElemType v0, v1, v2, e;
//提示輸入
printf("請進入三元組的三個值v0,v1,v2:\n");
scanf("%f%f%f", &v0, &v1, &v2);
//初始化
flag = initTriplet(T, v0, v1, v2);
//提示輸入
printf("調(diào)用初始化函數(shù)后,flag=%d,T的三個值為%4.2f,%4.2f,%4.2f\n", flag, T[0], T[1], T[2]);
printf("0 結(jié)束程序:\n");
printf("1 取三元組的任意一個分量:\n");
printf("2 置三元組的任意一個分量:\n");
printf("3 求三元組的最大分量:\n");
printf("4 求三元組的最小分量:\n");
printf("5 顯示三元組:\n");
printf("6 銷毀三元組:\n");
//用一個循環(huán)反復(fù)實現(xiàn)各種功能。
while (1) {
printf("請輸入你想完成的功能編號:\n");
scanf("%d", &n);
if (n == 0) {
break;
} else {
switch (n) {
case 1:
scanf("%d", &i);
getElem (T, i, e);
break;
case 2:
scanf("%d%f", &i, &e);
putElem (T, i, e);
break;
case 3:
getMax (T, e);
break;
case 4:
getMin (T, e);
break;
case 5:
printTriplet (T);
break;
case 6:
DestroyTriplet (T);
break;
default:
printf("沒有你想完成的功能\n");
break;
}
}
}
return 0;
}
三元組操作實現(xiàn)完整代碼
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef float ElemType;
typedef ElemType *Triplet;
Status initTriplet(Triplet &T, ElemType v0, ElemType v1, ElemType v2) {
T = (Triplet)malloc(3 * sizeof(v0, v1, v2));
T[0] = v0;
T[1] = v1;
T[2] = v2;
return OK;
}
Status getElem(Triplet T, int i, ElemType e) {
if (i < 1 || i > 3)
return ERROR;
else
e = T[i - 1];
printf("%f", e);
return OK;
}
Status putElem(Triplet T, int i, ElemType &e) {
if (i < 1 || i > 3)
return ERROR;
else
T[i - 1] = e;
printf("%f", e);
return OK;
}
ElemType getMax(Triplet T, ElemType &e) {
if (T[0] > T[1])
e = T[0];
else
e = T[1];
if (T[2] > e)
e = T[2];
printf("%f", e);
return e;
}
ElemType getMin(Triplet T, ElemType &e) {
if (T[0] < T[1])
e = T[0];
else
e = T[1];
if (T[2] < e)
e = T[2];
printf("%f", e);
return e;
}
Status printTriplet (Triplet &T) {
int i;
for (i = 0; i < 3; i++) {
printf("%f\n", T[i]);
}
printf("\n");
return OK;
}
Status DestroyTriplet (Triplet &T) {
free(T);
return OK;
}
int main() {
int n;
int i;
Triplet T;
Status flag;s
ElemType v0, v1, v2, e;
printf("請進入三元組的三個值v0,v1,v2:\n");
scanf("%f%f%f", &v0, &v1, &v2);
flag = initTriplet(T, v0, v1, v2);
printf("調(diào)用初始化函數(shù)后,flag=%d,T的三個值為%4.2f,%4.2f,%4.2f\n", flag, T[0], T[1], T[2]);
printf("0 結(jié)束程序:\n");
printf("1 取三元組的任意一個分量:\n");
printf("2 置三元組的任意一個分量:\n");
printf("3 求三元組的最大分量:\n");
printf("4 求三元組的最小分量:\n");
printf("5 顯示三元組:\n");
printf("6 銷毀三元組:\n");
while (1) {
printf("請輸入你想完成的功能編號:\n");
scanf("%d", &n);
if (n == 0) {
break;
} else {
switch (n) {
case 1:
scanf("%d", &i);
getElem (T, i, e);
break;
case 2:
scanf("%d%f", &i, &e);
putElem (T, i, e);
break;
case 3:
getMax (T, e);
break;
case 4:
getMin (T, e);
break;
case 5:
printTriplet (T);
break;
case 6:
DestroyTriplet (T);
break;
default:
printf("沒有你想完成的功能\n");
break;
}
}
}
return 0;
}
運行結(jié)果:
文章來源地址http://www.zghlxwxcb.cn/news/detail-669131.html
到了這里,關(guān)于初識數(shù)據(jù)結(jié)構(gòu)之三元組的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!