第1章 绪论

1.3   抽象数据类型的表示与实现

       将一些常用的头文件包含到一个头文件中,以后就只用调用这个头文件了:

 1 None.gif // c1.h(程序名)
 2 None.gif
 3 None.gif#include  < string .h >
 4 None.gif#include  < ctype.h >
 5 None.gif#include  < malloc.h >      // malloc()等
 6 None.gif #include  < limits.h >      // INT_MAX等
 7 None.gif #include  < stdio.h >      // EOF(=^Z或F6),NULL
 8 None.gif #include  < stdlib.h >      // atoi()
 9 None.gif #include  < io.h >
10 None.gif#include  < math.h >
11 None.gif#include  < process.h >
12 None.gif#include  < iostream.h >
13 None.gif
14 None.gif // 函数结果状态代码
15 None.gif #define  TRUE 1
16 None.gif #define  FALSE 0
17 None.gif #define  OK 1
18 None.gif #define  ERROR 0
19 None.gif #define  INFEASIBLE -1
20 None.gif
21 None.giftypedef  int  Status;         // Status是函数的类型,其值是函数结果状态代码,如OK等
22 None.gif typedef  int  Boolean;     // Boolean是布尔类型

      采用动态分配的顺序存储结构

1 None.gif // c1-1.h 采用动态分配的顺序存储结构
2 None.gif typedef ElemType  * Triplet;         // 由InitTriplet分配3个元素存储空间
3 None.gif // Triplet类型是ElemType类型的指针,存放ElemType类型的地址

      有关抽象数据类型Triplet和ElemType的8个基本操作函数。

 1 None.gif   //  bo1-1.cpp 抽象数据类型Triplet和ElemType(由c1-1.h定义)的基本操作(8个)
 2 None.gif  Status InitTriplet(Triplet  & T,ElemType v1,ElemType v2,ElemType v3)
 3 ExpandedBlockStart.gifContractedBlock.gif  dot.gif // 操作结果:构造三元组T,依次置T的3个元素的初值为v1,v2和v3
 4InBlock.gif   if(!(T=(ElemType *)malloc(3*sizeof(ElemType))))
 5InBlock.gif     exit(OVERFLOW);
 6InBlock.gif   T[0]=v1,T[1]=v2,T[2]=v3;
 7InBlock.gif   return OK;
 8ExpandedBlockEnd.gif }

 9 None.gif
10 None.gif Status DestroyTriplet(Triplet  & T)
11 ExpandedBlockStart.gifContractedBlock.gif  dot.gif // 操作结果:三元组T被销毁
12InBlock.gif   free(T);
13InBlock.gif   T=NULL;
14InBlock.gif   return OK;
15ExpandedBlockEnd.gif }

16 None.gif
17 None.gif Status Get(Triplet T, int  i,ElemType  & e)
18 ExpandedBlockStart.gifContractedBlock.gif  dot.gif // 初始条件:三元组T已存在,1≤i≤3。操作结果:用e返回T的第i元的值
19InBlock.gif   if(i<1||i>3)
20InBlock.gif     return ERROR;
21InBlock.gif   e=T[i-1];
22InBlock.gif   return OK;
23ExpandedBlockEnd.gif }

24 None.gif
25 None.gif Status Put(Triplet T, int  i,ElemType e)
26 ExpandedBlockStart.gifContractedBlock.gif  dot.gif // 初始条件:三元组T已存在,1≤i≤3。操作结果:改变T的第i元的值为e
27InBlock.gif   if(i<1||i>3)
28InBlock.gif     return ERROR;
29InBlock.gif   T[i-1]=e;
30InBlock.gif   return OK;
31ExpandedBlockEnd.gif }

32 None.gif
33 None.gif Status IsAscending(Triplet T)
34 ExpandedBlockStart.gifContractedBlock.gif  dot.gif // 初始条件:三元组T已存在。操作结果:如果T的3个元素按升序排列,返回1,否则返回0
35InBlock.gif   return(T[0]<=T[1]&&T[1]<=T[2]);
36ExpandedBlockEnd.gif }

37 None.gif
38 None.gif Status IsDescending(Triplet T)
39 ExpandedBlockStart.gifContractedBlock.gif  dot.gif // 初始条件:三元组T已存在。操作结果:如果T的3个元素按降序排列,返回1,否则返回0
40InBlock.gif   return(T[0]>=T[1]&&T[1]>=T[2]);
41ExpandedBlockEnd.gif }

42 None.gif
43 None.gif Status Max(Triplet T,ElemType  & e)
44 ExpandedBlockStart.gifContractedBlock.gif  dot.gif // 初始条件:三元组T已存在。操作结果:用e返回指向T的最大元素的值
45InBlock.gif   e=T[0]>=T[1]?T[0]>=T[2]?T[0]:T[2]:T[1]>=T[2]?T[1]:T[2];
46InBlock.gif   return OK;
47ExpandedBlockEnd.gif }

48 None.gif
49 None.gif Status Min(Triplet T,ElemType  & e)
50 ExpandedBlockStart.gifContractedBlock.gif  dot.gif // 初始条件:三元组T已存在。操作结果:用e返回指向T的最小元素的值
51InBlock.gif   e=T[0]<=T[1]?T[0]<=T[2]?T[0]:T[2]:T[1]<=T[2]?T[1]:T[2];
52InBlock.gif   return OK;
53ExpandedBlockEnd.gif }

      检查基本操作的主函数

 1 None.gif   //  main1-1.cpp 检验基本操作bo1-1.cpp的主函数
 2 None.gif  #include " c1.h "   //  要将程序中所有#include命令所包含的文件拷贝到当前目录下
 3 None.gif 
 4 None.gif  //  以下2行可根据需要选用一个(且只能选用一个),而不需改变基本操作bo1-1.cpp
 5 None.gif  typedef  int  ElemType;  //  定义抽象数据类型ElemType在本程序中为整型
 6 None.gif  // typedef double ElemType;  //  定义抽象数据类型ElemType在本程序中为双精度型
 7 None.gif  
 8 None.gif #include " c1_1.h "   //  在此命令之前要定义ElemType的类型
 9 None.gif  // #include"bo1_1.cpp"  //  在此命令之前要包括c1-1.h文件(因为其中定义了Triplet)
10 None.gif  
11 None.gif #include " bo1_1.h "
12 None.gif 
13 None.gif  void  main()
14 ExpandedBlockStart.gifContractedBlock.gif  dot.gif {
15InBlock.gif   Triplet T;
16InBlock.gif   ElemType m;
17InBlock.gif   Status i;
18InBlock.gif   i=InitTriplet(T,5,7,9); // 初始化三元组T,其3个元素依次为5,7,9
19InBlock.gif //i=InitTriplet(T,5.0,7.1,9.3); // 当ElemType为双精度型时,可取代上句
20InBlock.gif 
21InBlock.gif   printf("调用初始化函数后,i=%d(1:成功) T的3个值为:",i);
22InBlock.gif   cout<<T[0]<<' '<<T[1]<<' '<<T[2]<<endl;
23InBlock.gif   // 为避免ElemType的类型变化的影响,用cout取代printf()。注意结尾要加endl
24InBlock.gif   
25InBlock.gif   i=Get(T,2,m); // 将三元组T的第2个值赋给m
26InBlock.gif   if(i==OK) // 调用Get()成功
27InBlock.gif     cout<<"T的第2个值为:"<<m<<endl;
28InBlock.gif   i=Put(T,2,6); // 将三元组T的第2个值改为6
29InBlock.gif   
30InBlock.gif   if(i==OK) // 调用Put()成功
31InBlock.gif     cout<<"将T的第2个值改为6后,T的3个值为:"<<T[0]<<' '<<T[1]<<' '<<T[2]<<endl;
32InBlock.gif   i=IsAscending(T); // 此类函数实参与ElemType的类型无关,当ElemType的类型变化时,实参不需改变
33InBlock.gif   printf("调用测试升序的函数后,i=%d(0:否 1:是)\n",i);
34InBlock.gif   i=IsDescending(T);
35InBlock.gif   printf("调用测试降序的函数后,i=%d(0:否 1:是)\n",i);
36InBlock.gif   
37InBlock.gif   if((i=Max(T,m))==OK) // 先赋值再比较
38InBlock.gif     cout<<"T中的最大值为:"<<m<<endl;
39InBlock.gif   if((i=Min(T,m))==OK)
40InBlock.gif     cout<<"T中的最小值为:"<<m<<endl;
41InBlock.gif   DestroyTriplet(T); // 函数也可以不带回返回值
42InBlock.gif   cout<<"销毁T后,T="<<T<<"(NULL)"<<endl;
43ExpandedBlockEnd.gif }


      程序运行结果:
       chap01re01.gif


       变量的引用类型和非引用类型的区别


 1 None.gif   //  algo1-3.cpp 变量的引用类型和非引用类型的区别
 2 None.gif  #include < stdio.h >
 3 None.gif  void  fa( int  a)  //  在函数中改变a,将不会带回主调函数(主调函数中的a仍是原值)
 4 ExpandedBlockStart.gifContractedBlock.gif   dot.gif {
 5InBlock.gif   a++;
 6InBlock.gif   printf("在函数fa中:a=%d\n",a);
 7ExpandedBlockEnd.gif }

 8 None.gif
 9 None.gif  void  fb( int   & a)  //  由于a为引用类型,在函数中改变a,其值将带回主调函数
10 ExpandedBlockStart.gifContractedBlock.gif   dot.gif {
11InBlock.gif   a++;
12InBlock.gif   printf("在函数fb中:a=%d\n",a);
13ExpandedBlockEnd.gif }

14 None.gif
15 None.gif  void  main()
16 ExpandedBlockStart.gifContractedBlock.gif  dot.gif {
17InBlock.gif   int n=1;
18InBlock.gif   printf("在主程中,调用函数fa之前:n=%d\n",n);
19InBlock.gif   fa(n);
20InBlock.gif   printf("在主程中,调用函数fa之后,调用函数fb之前:n=%d\n",n);
21InBlock.gif   fb(n);
22InBlock.gif   printf("在主程中,调用函数fb之后:n=%d\n",n);
23ExpandedBlockEnd.gif }

程序运行结果:
chap01re02.gif

1.4      算法和算法分析

      同样是计算:1-1/x+1/x*x-1/x*x*x+...,algo1_1.cpp的语句频度表达式为:(1+n)*n/2,它的时间复杂度T(n)=O(n*n);而algo1_2.cpp的语句频度表达式是n,时间复杂度T(n)=O(n)。

 1 None.gif   //  algo1-1.cpp 计算1-1/x+1/x*x…
 2 None.gif  #include < stdio.h >
 3 None.gif #include < sys / timeb.h >
 4 None.gif  void  main()
 5 ExpandedBlockStart.gifContractedBlock.gif  dot.gif {
 6InBlock.gif   timeb t1,t2;
 7InBlock.gif   long t;
 8InBlock.gif   double x,sum=1,sum1;
 9InBlock.gif   int i,j,n;
10InBlock.gif   printf("请输入x n:");
11InBlock.gif   scanf("%lf%d",&x,&n);
12InBlock.gif   ftime(&t1); // 求得当前时间
13InBlock.gif   for(i=1;i<=n;i++)
14ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
15InBlock.gif     sum1=1;
16InBlock.gif     for(j=1;j<=i;j++)
17InBlock.gif       sum1=sum1*(-1.0/x);
18InBlock.gif     sum+=sum1;
19ExpandedSubBlockEnd.gif   }

20InBlock.gif   ftime(&t2); // 求得当前时间
21InBlock.gif   t=(t2.time-t1.time)*1000+(t2.millitm-t1.millitm); // 计算时间差
22InBlock.gif   printf("sum=%lf 用时%ld毫秒\n",sum,t);
23ExpandedBlockEnd.gif }

 1 None.gif   //  algo1-2.cpp 计算1-1/x+1/x*x…的更快捷的算法
 2 None.gif  #include < stdio.h >
 3 None.gif #include < sys / timeb.h >
 4 None.gif  void  main()
 5 ExpandedBlockStart.gifContractedBlock.gif  dot.gif {
 6InBlock.gif   timeb t1,t2;
 7InBlock.gif   long t;
 8InBlock.gif   double x,sum1=1,sum=1;
 9InBlock.gif   int i,n;
10InBlock.gif   printf("请输入x n: ");
11InBlock.gif   scanf("%lf%d",&x,&n);
12InBlock.gif   ftime(&t1); // 求得当前时间
13InBlock.gif   for(i=1;i<=n;i++)
14ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
15InBlock.gif     sum1*=-1.0/x;
16InBlock.gif     sum+=sum1;
17ExpandedSubBlockEnd.gif   }

18InBlock.gif   ftime(&t2); // 求得当前时间
19InBlock.gif   t=(t2.time-t1.time)*1000+(t2.millitm-t1.millitm); // 计算时间差
20InBlock.gif   printf("sum=%lf 用时%ld毫秒\n",sum,t);
21ExpandedBlockEnd.gif }

程序运行结果:(左边的时间与计算机的配置有关)

chap01re03.gif      chap01re04.gif

转载于:https://www.cnblogs.com/ctoroad/archive/2005/09/02/228732.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值