数据结构三元组操作
复习数据结构,发现今天才真正了解数据结构是怎么一回事。当初学的完全忘了,这次从新开始吧。
1.抽象数据类型
/* ADT Triplett { 数据对象:D={e1,e2,e3|e1,e2,e3∈ElemSet(定义了关系运算的某个集合) } 数据关系:R={<e1,e2,><e2,e3> } 基本操作: InitTriplet(T, v1, v2, v3) 操作结果:构造了三元组T,元素e1,e2和e3分别被赋以参数v1,v2和v3的值。 DestroyTriplet(T) 操作结果:三元组T被销毁。 Get(T, i,e) 初始条件:三元组T已存在,0<i<4 操作结果: 用e返回T的第i个元素的值。 Put(T, i, e) 初始条件:三元组T已存在0<i<4, 操作结果:改变T的第i个元素值为e。 若存在,返回元素在表中的位置;若不存在,返回-1. Max(T,e) 初始条件:三元组T已存在 操作结果:用e返回T的3个元素中的最大值。 Min(T,e) 初始条件:三元组T已存在 操作结果:用e返回T的3个元素中的最小值。 Print(T) 初始条件:三元组T已存在 操作结果:打印三元组T的各个元素值 */
2.源代码
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int status; typedef int ElemType; typedef ElemType *Triplet; int InitTriplet(Triplet *T,int v1,int v2,int v3){//构造三元组T,依次赋值v1,v2,v3 (*T)=(int *)malloc(3*sizeof(int)); if(!T) exit(OVERFLOW); (*T)[0]=v1;(*T)[1]=v2;(*T)[2]=v3; return OK; } int DestoryTriplet(Triplet *t){//销毁三元组 free(*t); *t=NULL; return OK; } int Get(Triplet t,int i,int *e){ //去三元组的一个分量,用e返回t的第i元素的值 if (i<1||i>3) return ERROR; *e=t[i-1]; return OK; } int Put(Triplet *t,int i,int e){ if (i<1||i>3) return OVERFLOW; (*t)[i-1]=e; return OK; } int Max(Triplet T,int *e){ *e=(T[0]>=T[1])?((T[0]>=T[2])?T[0]:T[2]):((T[1]>=T[2])?T[1]:T[2]); return OK; } int Min(Triplet T,int *e){ *e=(T[0]<=T[1])?((T[0]<=T[2])?T[0]:T[2]):((T[1]<=T[2])?T[1]:T[2]); return OK; } void Print(Triplet T){ int i; ElemType elem, *p=&elem; for(i=1;i<=3;i++){ Get(T,i,p); printf("T[%d]=%d\n",i,elem); } } void main(){ Triplet T,*t=&T; int e1,e2,e3,e,*p=&e; int i; printf("\n请输入三元组元素e1 e2 e3:\n"); scanf("%d%d%d",&e1,&e2,&e3); printf("输出的三元组为:\n"); InitTriplet(t,e1,e2,e3); Print(T); printf("\n请输入要取出的三元组分量的位序\n"); scanf("%d",&i); if(i>=1&&i<=3){ Get(T,i,p); printf("\n三元组中第%d个元素是:%d\n",i,*p); }else{ printf("输入不正确\n"); } printf("\n请输入要置换的三元组分量的位序i:"); scanf("%d",&i); if (i>=1&&i<=3) { printf("\n请输入要置换成新的元素为:"); scanf("%d",&e); Put(t,i,e); printf("\n置换后新的三元组T为:\n"); Print(T); }else{ printf("输入不正确!\n"); } printf("%d\n",Max(T,p)); printf("\n最大值为:%d\n",e); Min(T,p); printf("\n最小值为:%d\n",e); DestoryTriplet(t); }
3.运行结果
4.总结
C语言基础要扎实,指针,内存动态分配等需要复习加强。