• 三元组ADT (数据结构C语言版) C++实现


    很久没用C语言,都忘了C语言中没有引用参数,下面的代码中用到了C语言没有的引用参数。

    首先是一些表示状态的全局变量

    common.h

    1 #define TRUE 1
    2 #define FALSE 0
    3 #define OK 1
    4 #define ERROR 0
    5 #define INFEASIBLE -1
    6 #define OVERLOW -2
    7 typedef int Status;

    然后是三元组ADT的头文件,包含了三元组的函数声明

    triplet.h

     1 #include "common.h"
     2 
     3 //--------采用动态分配的顺序存储结构-----
     4 typedef int ElemType;
     5 typedef ElemType* Triplet; //由InitTriplet分配3个元素的存储空间
     6 
     7 //--------基本操作的函数原型说明------
     8 Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3);
     9 //操作结果:构造三元组T,元素e1,e2,e3分别被赋以参数v1,v2,v3的值
    10 
    11 Status DestroyTriplet(Triplet &T);
    12 //操作结果:三元组T被销毁
    13 
    14 ElemType Get(Triplet T, int i, ElemType &e);
    15 //初始条件:三元组T已存在,1<=i<=3
    16 //操作结果:用e返回T的第i元的值
    17 
    18 Status Put(Triplet &T, int i, ElemType e);
    19 //初始条件:三元组T已存在,1<=i<=3
    20 //操作结果:改变T的第i元的值为e
    21 
    22 Status IsAscending(Triplet T);
    23 //初始条件:三元组已存在
    24 //操作结果:如果T的三个元素按升序排列,则返回1,否则返回0
    25 
    26 Status IsDescending(Triplet T);
    27 //初始条件:三元组T已存在
    28 //操作结果:如果T的三个元素按降序排列,则返回1,否则返回0
    29 
    30 Status Max(Triplet T, ElemType &e);
    31 //初始条件:三元组T已存在
    32 //操作结果:用e返回T的三个元素中的最大值
    33 
    34 Status Min(Triplet T, ElemType &e);
    35 //初始条件:三元组T已存在
    36 //操作结果:用e返回T的三个元素中的最小值

    最后是triplet函数的定义以及main函数

    source.cpp

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include "triplet.h"
     4 
     5 //------------基本操作的实现------------
     6 Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3){
     7     //构造三元组T,依次置T的3个元素的初始值为v1,v2,v3
     8     T = (ElemType *)malloc(3 * sizeof(ElemType)); //分配3个元素的存储空间
     9     if (!T){
    10         exit(OVERLOW); //分配存储空间失败
    11     }
    12     T[0] = v1; T[1] = v2; T[2] = v3;
    13     return OK;
    14 } //InitTriplet
    15 
    16 Status DestroyTriplet(Triplet &T){
    17     //销毁三元组T
    18     free(T); T = NULL;
    19     return OK;
    20 }//DestroyTriplet
    21 
    22 ElemType Get(Triplet T, int i, ElemType &e){
    23     //1<=i<=3, 用e返回T的第i元的值
    24     if (i<1 || i>3) return ERROR;
    25     e = T[i - 1];
    26     return OK;
    27 }//Get
    28 
    29 Status Put(Triplet &T, int i, ElemType e){
    30     //1<=i<=3, 用e赋值给T[i]
    31     if (i<1 || i>3) return ERROR;
    32     T[i - 1] = e;
    33     return OK;
    34 }//Put
    35 
    36 Status IsAscending(Triplet T){
    37     //如果T的三个元素按照升序排列,则返回1,否则返回0
    38     return (T[0] <= T[1]) && (T[1] <= T[2]);
    39 }//IsAscending
    40 
    41 Status IsDecending(Triplet T){
    42     //如果T的三个元素按照降序排列,则返回1,否则返回0
    43     return (T[0] >= T[1]) && (T[1] >= T[2]);
    44 }//IsDescending
    45 
    46 Status Max(Triplet T, ElemType &e){
    47     //用e返回T的三个元素中的最大值
    48     e = (T[0] >= T[1]) ? ((T[0] >= T[2]) ? T[0] : T[2]) :
    49         ((T[1] >= T[2]) ? T[1] : T[2]);
    50     return OK;
    51 }
    52 
    53 Status Min(Triplet T, ElemType &e){
    54     //用e返回T的三个元素中的最小值
    55     e = (T[0] <= T[1]) ? ((T[0] <= T[2]) ? T[0] : T[2]) :
    56         ((T[1] <= T[2]) ? T[1] : T[2]);
    57     return OK;
    58 }
    59 
    60 int main(){
    61     Triplet T;
    62     Status state = InitTriplet(T, 1, 2, 3);
    63     printf("state: %d
    ", state);
    64 
    65     ElemType e;
    66     Get(T, 3, e);
    67     printf("T[i]=%d
    ", e);
    68 
    69     ElemType t1, t2, t3;
    70     printf("sizeof T:%d
    ", sizeof(T));
    71     Get(T, 1, t1);
    72     Get(T, 2, t2);
    73     Get(T, 3, t3);
    74     printf("t1=%d;t2=%d;t3=%d
    ", t1, t2, t3);
    75 
    76     Put(T, 1, 10);
    77     printf("T[1]=%d
    ", T[0]);
    78     ElemType max, min;
    79     Max(T, max);
    80     Min(T, min);
    81     printf("max=%d
    ", max);
    82     printf("min=%d
    ", min);
    83 
    84     Status s1 = DestroyTriplet(T);
    85     printf("destroy state: %d
    ", s1);
    86 
    87     getchar();
    88     return 0;
    89 }
  • 相关阅读:
    【左偏树+贪心】BZOJ1367-[Baltic2004]sequence
    【裸裸的左偏树】BZOJ1455-罗马游戏
    【贪心+Treap】BZOJ1691-[Usaco2007 Dec]挑剔的美食家
    【贪心】BZOJ3668-[NOI2014]起床困难综合症
    【多重背包小小的优化(。・∀・)ノ゙】BZOJ1531-[POI2005]Bank notes
    【可持久化并查集】BZOJ3673-可持久化并查集 by zky
    【manacher+FFT】BZOJ3160-万径人踪灭
    SCOI2008着色方案(记忆化搜索)
    [JSOI2008]魔兽地图(树形dp)
    NOI2017蔬菜(贪心)
  • 原文地址:https://www.cnblogs.com/eleven24/p/5553097.html
Copyright © 2020-2023  润新知