数据结构 三元组

博主加入ACM集训队后发现自己基础薄弱,尤其是对KMP算法不熟练。因此,他决定从基础知识——三元组开始,逐步提升自己的编程能力。

非常想不开的在下参加了学校的ACM集训队,发现本人实在是太菜了!菜的抠脚,玩了半年了,手写KMP都不大熟练,所以个人觉得自己还是基础太差了,没办法,基础不牢的人不是玩ACM,而是被ACM玩,所以我来打基础了!从最简单的三元组开始!!逐步的爬!爬!爬!!!!!

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#define MAXN 100005
#define true 1
#define fause 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
using namespace std;
typedef struct 
{
  int a,b,c;
  char str[100];
  double num;
  /*这里基本的数据类型大致都有了,当你想用三元组的操作,别和我说什么枚举类型,bool类型什么的,毕竟我懒*/
}Elemtype;
bool cmp(Elemtype a,Elemtype b)
{
  /*这里cmp函数里的全都是升序时用的,如果你想写降序,把cmp里的东西换成小于号换成大于号就行了*/
  //return a.a<=b.a;
  return strcmp(a.str,b.str)<0;
}
bool swap(Elemtype &a,Elemtype &b)
{
  Elemtype temp;
  temp = a ;
   a = b;
   b = temp;
   /*这里的赋值和triplet里的原理相同,也要注意C中是不能直接用的!*/
   return OK;
}
bool input(Elemtype &a)
{
  scanf("%d%d%d %s %lf",&a.a,&a.b,&a.c,a.str,&a.num);
  return 0;
}
bool output(Elemtype &a)
{
  printf("%d %d %d\n%s\n%lf\n",a.a,a.b,a.c,a.str,a.num);return 0;
}

/******************************************************************
前面的部分单纯是我想偷懒,比如如果以后我想用三元组什么的直接去粘下面的代码就好了,
只要对上面的代码进行适当的修改就好了。。。。
*******************************************************************/

typedef struct Triplet 
{ 
 /********************************/
  //数据定义
 /********************************/
  Elemtype *x;
 /********************************/
  //函数部分
 /********************************/
  Status InitTriplet(Elemtype a,Elemtype b,Elemtype c)
  {
    x= (Elemtype *)malloc(3*sizeof(Elemtype));
    if(!x) exit(OVERFLOW);
    x[0] = a; 
    x[1] = b;
    x[2] = c;
    /*为了方便,这里直接采用了C++中的赋值模式,如果用C的话,貌似是不可以这样赋值的吧~*/
    return OK;
  }//初始化
  Status Destroy()
  {
    free(x);
    x = NULL;
    return OK;
  }//销毁整个三元组
  Status Get(int i,Elemtype &e)
  {
    if(i<1||i>3||x==NULL) return ERROR;
    e= x[i-1];return OK;
  }//获得某个值
  Status Put(int i,Elemtype &e)
  {
    if(i<1||i>3||x==NULL) return ERROR;
   x[i-1] = e;
   return OK;
  }//修改某个值
  Status IsAscending() //s是否升序排列
  {

    return cmp(x[0],x[1])&&cmp(x[1],x[2]);
  } 
  Status IsDescending()//是否降序排列
  {

    return cmp(x[1] ,x[0] )&&cmp(x[2],x[1]);
  } 
  /*事实上上述两函数可用同一个函数替换,仅需修改cmp函数即可!
  下面的排序函数就只用一种形式描述了,但只用一种形式描述的话缺点也很明显,就是不够灵活。*/
  Status Sort()//排序函数
  {
    if(x==NULL) return ERROR;
    cmp(x[0],x[1])?1:swap(x[0],x[1]);
    cmp(x[1],x[2])?2:swap(x[1],x[2]);
    cmp(x[0],x[1])?3:swap(x[0],x[1]);
    /*没什么技术含量的冒泡排序,但这种数据规模,
    没必要动用快排之类的高端货色的吧*/
    return OK;
  }
  Status Min(Elemtype &e)
  {
    if(x==NULL) return ERROR;
    e= cmp(x[0],x[1])?(cmp(x[0],x[2])?x[0]:x[2]):(cmp(x[1],x[2])?x[1]:x[2]);
  return OK;
  }//找出最小值
  Status Max(Elemtype &e)
  {
    if(x==NULL) return ERROR;
    e= cmp(x[0],x[1])?(cmp(x[1],x[2])?x[2]:x[1]):(cmp(x[0],x[2])?x[2]:x[0]);
   return OK;
  }

  //找出最大值
  void outputall()
  {
    for(int i =0;i<3;i++)
    {
     output(x[i]);
    }
  }
}Triplet;

/*下面的部分是在下为测试代码写的main,test.txt就不上传了,随便敲的几行测试数据,没太多的代表性*/
int main()
{
  freopen("test.txt","r",stdin);
  Elemtype a,b,c,d;
  input(a);
  //output(a);
  input(b);
  input(c);
  Triplet T;
  T.InitTriplet(a,b,c);
  printf("最开始的数据\n");
  T.outputall();
  printf("是升序的吗?\n");
  printf("%d\n",T.IsAscending());
  T.Sort();
  T.outputall();
  printf("现在升序了吗?\n");
  printf("%d\n",T.IsAscending());
  //T.outputall();
  T.Get(1,d);
  printf("取出了个什么东西:\n");
  output(d);
  T.Put(2,d);
  printf("把取出的东西放第二位\n");
  T.outputall();
  printf("最大的\n");
  T.Max(d);
  output(d);
  printf("最小的\n");
  T.Min(d);
  output(d);
  return 0;
}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值