目录
主要由实现基本操作和算法的程序构成。这些程序有6类:
- 数据存储结构,文件名第一个字母为c,以h为扩展名。如c1-1.h是第1章的第1种存储结构。
- 每种存储结构的一组基本操作函数。以bo开头,cpp为扩展名。
- 调用基本操作的主程序。以main开头,cpp为扩展名。
- 实现算法的程序。以algo开头,cpp为扩展名。
- 不同于基本操作又被多次调用的函数,以func开头,cpp为扩展名。
- 数据文件,以txt为扩展名。
(1)C语言传值与传地址变量
#include <stdio.h>
void fa(int a)
{
a++;
printf("在函数fa中:a=%d\n", a);
}
void fb(int *a)
{
(*a)++;
printf("在函数fb中:a=%d\n", *a);
}
int main()
{
int n = 1;
printf("在主程序中,调用函数fa之前:n=%d\n", n);
fa(n);
printf("在主程序中,调用函数fa之后:n=%d\n", n);
fb(&n);
printf("在主程序中,调用函数fa之后:n=%d\n", n);
}
传地址变量,若变量值在函数中被修改,则变化的值会带回到主函数中,运行结果为:
(2)算法效率的度量
//计算1-1/x+1/(x*x)…的更快捷的算法
//计算程序运行时间
#include<sys/timeb.h>
#include<stdio.h>
void main()
{
timeb t1, t2;
long t;
double x, sum1=1, sum=1;
int i, n;
printf("请输入x n:");
scanf("%lf%d", &x, &n);
ftime(&t1);
for(i=1; i<=n; i++)
{
sum1*=-1.0/x;
sum+=sum1;
}
ftime(&t2);
t=(t2.time-t1.time)*1000+(t2.millitm-t1.millitm);
printf("sum=%lf,用时%ld毫秒\n", sum, t);
}
运行结果为,具体运行时间跟计算机有关。
(3)基本操作
这里介绍抽象数据类型的8个基本操作函数,返回值类型都是Status,即智能返回OK、ERROR.
// bo1-1.h 抽象数据类型Triplet和ElemType(由c1-1.h定义)的基本操作(8个)
Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3)
{ //操作结果,构造三元组T,依次置T的3个元素的初值为v1,v2,v3
T=(ElemType*)malloc(3*sizeof(ElemType));
if(!T)
exit(OVERFLOW); //OVERFLOW为定义的宏变量
T[0]=v1, T[1]=v2, T[2]=v3;
return OK;
}
Status DestroyTriplet(Triplet &T)
{ //操作结果,三元组T被销毁
free(T);
T=NULL;
return OK;
}
Status Get(Triplet T, int i, ElemType &e)
{ //初试条件:三元组T已存在,操作结果:用e返回T的第i个元素的值
if(i<1 || i>3)
return ERROR;
e=T[i-1];
return OK;
}
Status Put(Triplet T, int i, ElemType e)
{ //改变T的第i元的值为e
if(i<1 || i>3)
return ERROR;
T[i-1]=e;
return OK;
}
Status IsAscending(Triplet T)
{ // 判断T的3个元素是否按升序排列
return(T[0]<=T[1] && T[1]<=T[2]);
}
Status IsDescending(Triplet T)
{ //判断T的3个元素是否按降序排列
return(T[0]>=T[1] && T[1]>=T[2]);
}
Status Max(Triplet T, ElemType &e)
{ //返回最大值
e=(T[0]>=T[1]) ? (T[0]>=T[2] ? T[0] : T[2]) : (T[1]>=T[2] ? T[1] : T[2]);
return OK;
}
Status Min(Triplet T, ElemType &e)
{ //返回最小值
e=(T[0]<=T[1]) ? (T[0]<=T[2] ? T[0] : T[2]) : (T[1]<=T[2] ? T[1] : T[2]);
return OK;
}
(4)主函数
主函数是用来检验基本操作函数是否正确。
// main1-1.cpp 检验基本操作bo1-1.h的主函数
// 以下两行可根据需要选其一(且只能选其一),而无须改变基本操作.
typedef int ElemType;
//typedef double ElemType; // 定义抽象数据类型ElemType在本程序中为双精度型。
#include"c1-1.h"
#include"bo1-1.h"
#include"func1-1.h"
int main()
{
Triplet T;
ElemType m;
Status i;
i=InitTriplet(T, 5, 7, 9);
//i=InitTriplet(T, 5.0, 7.1, 9.3); // 当ElemType为双精度型时,可取代上句。第15行
printf("调用初始化函数后,i=%d(1:成功)。T的3个值为",i);
PrintT(T);
i=Get(T, 2, m);
if(i==OK)
{
printf("T的第2个值为");
PrintE(m);
}
i=Put(T, 2, 6);
if(i==OK)
{
printf("将T的第2个值改为6后,T的3个值为");
PrintT(T);
}
i=IsAscending(T);
printf("调用测试升序的函数后,i=%d(0:否 1:是)\n", i);
i=IsDescending(T);
printf("调用测试降序的函数后,i=%d(0:否 1:是)\n", i);
if((i=Max(T, m))==OK)
{
printf("T中的最大值为");
PrintE(m);
}
if((i=Min(T, m))==OK)
{ printf("T中的最小值为");
PrintE(m);
}
DestroyTriplet(T);
printf("销毁T后,T=%u\n", T);
return 0;
}
运行结果为: