专题一 数据结构分类与抽象数据类型
1.1数据结构分类
现实世界中讨论的数据结构是指逻辑结构(包括:集合结构,线性结构,树结构,图结构)
计算机世界里的数据结构是指存储结构(也是物理结构,包括:顺序结构,链接结构,索引结构,散列结构)
1.2抽象数据类型(ADT)
定义:由一种数据结构和在该数据结构上的一组操作组成.
 
抽象数据类型的书写格试:
ADT <抽象数据类型名> is
 








               data:
             <数据描述>
             operations:  
<操作声明>
 
end  <抽象数据类型名>
 








 








例题:把二次多项试ax**2+bx+c设计成一种抽象数据类型,假定起名为QUAdratic,该类型的数据部分为三个系数项a,b和c,操作部分为:
(1)   初始化a,b和c的值,假定他们默认值均为0;
(2)   做两个多项试的加法,返回他们的和;
(3)   根据给定x的值计算多项式的值,并返回;
(4)   计算机方程:ax**2 +b*x+c=0的根,对于有实根,无根和不是二次方程的情况要分别返回不同的整数值,
(5)   按照:ax**2 +bx+c的各式输出二次多项式,在输出时要注意去掉系数为0的项,并且当b和c的值为负时,其前不能出现加号.
 
 
先建立抽象数据类型:
ADT QUAdratic    is
Data:
一个二次多项式q,其系数分别为a,b和c;//数据描述部分
Operations:
Void   init(Quadratic & q,float aa=0,float bb=0,float cc=0)//初始化二项式
Int    Add(Quadratic  &q1 ,Quadratic  &q2)// 两个多项试的加法
Float  eval(Quadratic &q,float x)//二项式求值
Void  root(Quadratic &q,float &r1,float &r2)//求二项试的根,两个实根由引用参数,r1,r2带回
Void   print(Quadratic &q)//输出二项式
   End  QUAdratic

 

下面是错误百出的代码:
//2005.10.24
/*先建立抽象数据类型:
ADT QUAdratic    is
Data:
一个二次多项式q,其系数分别为a,b和c;//数据描述部分
Operations:
Void   init(Quadratic & q,float aa=0,float bb=0,float cc=0)//初始化二项式
Int    Add(Quadratic  &q1 ,Quadratic  &q2)// 两个多项试的加法
Float  eval(Quadratic &q,float x)//二项式求值
Void  root(Quadratic &q,float &r1,float &r2)//求二项试的根,两个实根由引用参数,r1,r2带回
Void   print(Quadratic &q)//输出二项式
   End  QUAdratic*/
#include <iostream>
#include<cmath>
struct QUAdratic {
       float a,b, c;
       }
void init(QUAdratic &q,float aa=0,float bb=0, float cc=0){
q.a=aa;q.b=bb;q.c=cc;
} 
int Add(QUAdratic &q1, QUAdratic &q2)//两个多项式相加
{ QUAdratic &q;
q.a=q1.a+q2.a;s
q.b=q1.b+q2.b;
q.c=q1.c+q2.c;
return q;
}
float eval(QUAdratic &q,float x)//计算值为x时二项式的值;
{return (q.a*x*x+q.b*x+q.c);
} 
void root(QUAdratic &q,float &r1,float &r2){//计算方程的根 ,两个实根由引用参数r1,r2带回;
if(q.a==0) return -1;//不是二次方程返回 -1;
 float x=q.b*q.b-4*q.a*q.c;
 if(x>=0){
          r1=float(-q.b+sqrt(x))/(2*q.a);
          r2=float(-q.b-sqrt(x))/(2*q.a);
          return 1; //有实根返回1; 
          }
          else return 0;//无实根返回0; 
          }
          
 void print(QUAdratic &q)//输出二项式 
 { 
      if(q.a) cout<<q.a<<"x**2";
 if(q.b) {
         if(q.b>0) cout<<"+"<<q.b<<"x";
         else cout<<q.b<<"x";
         }
 if(q.c)  cout<<q.c;
} int  main(){
      QUAdratic a,b,c;
      init(a,2,3);
      print(a);
      cout<<eval(a,4)<<endl;
      float x1,x2;
      int n=root(a,x1,x2);
      if(n==1) cout<<x1<<''<<x2<<endl;
      init(b,3,-9,6);
      print(b);
      n=root(b,x1,x2);
      if(n==1) cout<<x1<<''<<x2<<endl;
      c=Add(a,b);
      print(c);
      }