1.绪论

目录

(1)C语言传值与传地址变量

(2)算法效率的度量

(3)基本操作

(4)主函数


主要由实现基本操作和算法的程序构成。这些程序有6类:

  1. 数据存储结构,文件名第一个字母为c,以h为扩展名。如c1-1.h是第1章的第1种存储结构。
  2. 每种存储结构的一组基本操作函数。以bo开头,cpp为扩展名。
  3. 调用基本操作的主程序。以main开头,cpp为扩展名。
  4. 实现算法的程序。以algo开头,cpp为扩展名。
  5. 不同于基本操作又被多次调用的函数,以func开头,cpp为扩展名。
  6. 数据文件,以txt为扩展名。

(1)C语言传值与传地址变量

#include 

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);
}

传地址变量,若变量值在函数中被修改,则变化的值会带回到主函数中,运行结果为:

1.绪论_第1张图片

(2)算法效率的度量

//计算1-1/x+1/(x*x)…的更快捷的算法
//计算程序运行时间
#include
#include

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);
}

运行结果为,具体运行时间跟计算机有关。

1.绪论_第2张图片

(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;
}

运行结果为:

1.绪论_第3张图片

 

你可能感兴趣的:(数据结构与算法(C语言版))