数据结构三元组操作

  复习数据结构,发现今天才真正了解数据结构是怎么一回事。当初学的完全忘了,这次从新开始吧。

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语言基础要扎实,指针,内存动态分配等需要复习加强。

转载于:https://www.cnblogs.com/yaopan007/p/3871871.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值