/*********************************************************************
程序名: 抽象数据类型的表示和实现
作者: 南去良鱼
日期: 2023-03-05 10:36
说明: 实验目的
(1)复习巩固C语言的结构体、指针、函数、动态分配内存等知识点。
(2)掌握抽象数据类型的定义、表示和实现,为后续实验打好基础。
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3//三元组
typedef float ElemType;//定义元素类型
typedef ElemType *Triplet;//定义指向指针指向Triplet,float* Triplet;
//创建一个三元组
void initTriplet(Triplet &T, ElemType v[]) {
//动态分配内存
T = (Triplet)malloc(sizeof(ElemType) * N);
if (!T) {
exit (-2);//内存分配失败,退出
}
int i;
for (i = 0; i < N; i++) {
T[i] = v[i]; //赋值
}
}
//显示三元组
void printTriplet(Triplet T) {
int i;
printf("这个%d元组为:\n", N);
for (i = 0; i < N; i++) {
printf("%f\t", T[i]);
}
printf("\n");
}
//取三元组的任意一个分量
void GetElem(Triplet T, int e) {
if (e >= 1 && e <= N)
printf("%f\n", T[e - 1]);
else
printf("ERROR\n");
}
//求三元组的最大分量
ElemType MaxElem(Triplet T) {
ElemType m;
int i;
m = T[0];
for (i = 1; i < N; i++) {
if (T[i] > T[i + 1])
m = T[i];
}
return m;
}
//求三元组的最小分量
ElemType MinElem(Triplet T) {
ElemType m;
int i;
m = T[0];
for (i = 1; i < N; i++) {
if (T[i] < T[i + 1])
m = T[i];
}
return m;
}
//销毁三元组
void DestroyList(Triplet T) {
free(T);
}
//置三元组的任意一个分量(将e放到第i个)
void PutElem(Triplet T, int i, ElemType e) {
if (i < 1 || i > N) {
printf("ERROR");
} else {
T[i - 1] = e;
}
}
//实现两个三元组的对应分量相加
void add(Triplet T, Triplet &T2) {
int i;
for (i = 0; i < N; i++) {
T2[i] += T[i];
}
}
//给三元组的各分量同乘一个比例因子
void multiconstant(Triplet T, int i) {
int j;
for (j = 0; j < N; j++) {
T[j] *= i;
}
printf("得出的结果为:");
for (j = 0; j < N; j++) {
printf("%f\t", T[j]);
}
printf("\n");
}
int main(void) {
Triplet T;//三元组名称T
int a = 0; //几个三元组
while (1) {
char s;
printf("********************\n");
printf("请选择想实现的功能:\n");
printf("1.创建一个三元组\n");
printf("2.显示三元组\n");
printf("3.取三元组的任意一个分量\n");
printf("4.置三元组的任意一个分量(将e放到第i个)\n");
printf("5.求三元组的最大分量\n");
printf("6.求三元组的最小分量\n");
printf("7.销毁三元组\n");
printf("8.给三元组的各分量同乘一个比例因子\n");
printf("9.实现两个三元组的对应分量相加\n");
printf("0.退出\n");
printf("********************\n");
scanf("%s", &s);
if (s == '1') {
a++;
ElemType v[N];
printf("请输入n元组的每个元素(N=%d)\n", N);
int i;
for (i = 0; i < N; i++) {
scanf("%f", &v[i]);
}
initTriplet(T, v);
}
if (s == '2') {
printTriplet(T) ;
}
if (s == '3') {
int x;
printf("请输入取第几个分量:");
scanf("%d", &x);
GetElem(T, x);
}
if (s == '4') {
int m, n;
printf("想要将什么数据放在第几个位置:");
scanf("%d %d", &m, &n);
PutElem(T, n, m);
}
if (s == '5') {
ElemType max;
max = MaxElem(T);
printf("%f\n", max);
}
if (s == '6') {
ElemType min;
min = MinElem(T);
printf("%f\n", min);
}
if (s == '7') {
DestroyList(T);
}
if (s == '8') {
int n;
printf("想要的比例因子为:");
scanf("%d", &n);
multiconstant(T, n);
}
if (s == '9') {
Triplet T1;
ElemType l[N];
printf("请输入第二个三元组的三个元素:");
int i;
for (i = 0; i < N; i++) {
scanf("%f", &l[i]);
}
initTriplet(T1, l);
add(T, T1);
printf("相加后的值为:");
printTriplet(T1);
}
if (s == '0') {
break;
}
}
return 0;
}
为复习巩固C语言的结构体、指针、函数、动态分配内存等知识点,尝试制作三元组。
如有不足,多多指教