严蔚敏《数据结构(C语言版)》——第1章 绪论

数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

数据对象是性质相同的数据元素的集合,是数据的一个子集。

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

存储结构是数据结构在计算机中的表示。

数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

抽象数据类型是指一个数学模型以及定义在该模型上的一组操作,是对一般数据类型的扩展。

试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。

       解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据。因此称它们为预定义数据类型。抽象数据类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。

数据结构的形式定义为:数据结构是一个二元组 Data_Structure = (D,S)     其中D是数据元素的有限集,S是D上关系的有限集。        (数据,关系)

抽象数据类型可用三元组表示:(D,S,P)  其中D是数据对象,S是D上的关系集,P是对D的基本操作集。                    (数据,关系,基本操作)

抽象数据类型的定义格式:

  ADT 抽象数据类型名{

    数据对象:<数据对象的定义>

    数据关系:<数据关系的定义>

    基本操作:

      基本操作名(参数表)

        初始条件:<初始条件描述>

        操作结果:<操作结果描述>

  }ADT 抽象数据类型名

基本操作有两种参数:赋值参数只为操作提供输入值;

          引用参数以&打头,除可提供输入值外,还将返回操作结果。

“初始条件”描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。

“操作结果”说明了操作正常完成之后,数据结构的变化状况和应返回的结果。

抽象数据类型三元组的定义:

  ADT Triplet {

    数据对象:D = { e1,e2,e3|e1,e2,e3 ∈EleSet(定义了关系运算的某个集合)}

    数据关系:R1 = {<e1,e2>,<e2,e3>}

    基本操作:

      InitTriplet (&T,v1,v2,v3)

        操作结果:构造了三元组T,元素e1,e2和e3分别被赋以参数v1,v2,v3的值。

      DestoryTriplet (&T)

        操作结果:三元组T被销毁。

      Get (T,i,&e)

        初始条件:三元组T已存在,1≤i≤3;

        操作结果:用e返回T的第i元的值。

      Put (&T,i,e)                                                             (三元组已被改变,返回的应该是三元组T)

        初始条件:三元组T已存在。

        操作结果:改变T的第i元的值为e。

      IsAscending (T)

        初始条件:三元组T已存在。

        操作结果:如果T的3个元素按升序排列,则返回1,否则返回0。

      IsDesending (T)

        初始条件:三元组T已存在。

        操作结果:如果T的3个元素按降序排列,则返回1,否则返回0。

      Max (T,&e)

        初始条件:三元组T已存在。

        操作结果:用e返回T的3个元素中的最大值。

      Min (T,&e)

        初始条件:三元组T已存在。

        操作结果:用e返回T的3个元素中的最小值。

  } ADT Triplet

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

(1)预定义常量和类型:

   #define  TRUE    1

   #define  FALSE   0

   #define  OK      1

   #define  ERROR   0

   #define  INFEASIBLE  -1                      (不可行的)

   #define  OVERFLOW  -2      (溢出)

   // Status是函数的类型(返回值),其值是函数结果状态代码

   typedef int Status;

(2)数据结构的表示(存储结果)用类型定义(typedef)描述,数据元素类型约定为ElemType,由用户在使用该数据类型时自行定义。

(3)一般而言,a、b、c、d、e等用作数据元素名,

          i、j、k、m、n等用作整型变量名,

        p、q、r等用作指针变量名。

(4)赋值语句:

   串联赋值   变量名1=变量名2=···=变量名k=表达式;

   成组赋值   (变量名1,···,变量名k)=(表达式1,···,表达式k);

          结构名=结构名;

          结构名=(值1,···,值k);

          变量名[]=表达式;

          变量名[起始下标..终止下标]=变量名[起始下标..终止下标];

   交换赋值   变量名←→变量名;

(5)选择语句   switch(表达式){

            case 值1:     语句序列;   break;

            ……

            default:  语句序列;

          }

          

          switch{

            case 条件1:   语句序列;  break;

            ……

            default:  语句序列;

          }

(6)循环语句   for  while  do-while

(7)结束语句   函数:  return  [表达式];

          case:   break;

          异常结束语句:       exit(异常代码);

(8)输入输出   scanf([格式串],变量1,2,...,n);

            printf([格式串],表达式1,...,n);

(9)求不足整数值 floor(表达式);

     求进位整数值 ceil(表达式);

   判定文件结束 eof(文件变量)或eof

   判定行结束  eoln(文件变量)或eoln

(10)||运算和&&运算  若表达式1能够判断出最终结果,则表达式2不执行。

抽象数据类型Triplet的表示和实现:

typedef ElemType * Triplet;//由InitTriplet分配3个元素存储空间
//--------------基本操作的函数原型说明----------------
Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3);
//操作结果:构造了三元组T,元素e1,e2和e3的值分别被赋以参数v1,v2,v3的值。
Status DestroyTriplet(Triplet &T);
//操作结果:三元组T被销毁。
Status Get(Triplet T, int i, ElemType &e);
//初始条件:三元组T已存在,1<=i<=3。
//操作结果:用e返回T的第i元的值
Status Put(Triplet &T, int i, ElemType e);
//初始条件:三元组T已存在,1<=i<=3。
//操作结果:改变T的第i元的值为e。
Status IsAscending(Triplet T);
//初始条件:三元组T已存在。
//操作结果:如果三元组T的3个元素按升序排列,则返回1,否则返回0。
Status IsDescending(Triplet T);
//初始条件:三元组T已存在。
//操作结果:如果三元组T的3个元素按降序排列,则返回1,否则返回0。
Status Max(Triplet T, ElemType &e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的3个元素中的最大值。
Status Min(Triplet T, ElemType &e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的3个元素中的最小值
//--------------基本操作的函数原型说明----------------
Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3)
{ //操作结果:构造了三元组T,元素e1,e2和e3的值分别被赋以参数v1,v2,v3的值。
T = (ElemType *)malloc(3 * sizeof(ElemType));
if(!T) exit(OVERFLOW); //分配存储空间失败
T[0] = v1; T[1] = v2; T[2] = v3;
return OK;
} //InitTriplet
Status DestroyTriplet(Triplet &T)
{ //操作结果:三元组T被销毁。
free(T);
T = NULL;
return OK;
} //DestroyTriplet
Status Get(Triplet T, int i, ElemType &e){
//用e返回T的第i元的值
if(i<1 || i>3)
return ERROR;
e = T[i-1];
return OK;
} //Get
Status Put(Triplet &T, int i, ElemType e) {
//1<=i<=3。
//改变T的第i元的值为e。
if(i<1 || i>3)
return ERROR;
T[i-1] = e;
return OK;
} // Put
Status IsAscending(Triplet T) {
//如果三元组T的3个元素按升序排列,则返回1,否则返回0。
return (T[0] >= T[1]) && (T[1] >= T[2]);
} //IsAscending
Status IsDescending(Triplet T) {
//如果三元组T的3个元素按降序排列,则返回1,否则返回0。
return (T[0] <= T[1]) && (T[1] <= T[2]);
} //IsDescending
Status Max(Triplet T, ElemType &e) {
//用e返回T的3个元素中的最大值。
e = (T[0] >= T[1]) ? ((T[0] >= T[2]) ? T[0]:T[2]) : ((T[1] >= T[2]) ? T[1]:T[2]);
return OK;
}//Max
Status Min(Triplet T, ElemType &e) {
//用e返回T的3个元素中的最小值。
e = (T[0] <= T[1]) ? ((T[0] <= T[2]) ? T[0]:T[2]) : ((T[1] <= T[2]) ? T[1]:T[2]);
return OK;
}//Min

原文地址:https://www.cnblogs.com/zhwup/p/9371093.html

时间: 2024-10-08 17:52:00

严蔚敏《数据结构(C语言版)》——第1章 绪论的相关文章

《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

先附上文档归类目录: 课本源码合辑  链接??? <数据结构>课本源码合辑 习题集全解析  链接??? <数据结构题集>习题解析合辑 博主有话说: 01.自学编程,难免思路阻塞,所以从今天起,我(StrayedKing)决定在本博客陆续更新严蔚敏,吴伟民版<数据结构-C语言版>各章节的课本源码和配套习题集答案解析,目的是为了整理数据结构中的知识点,并与网友交流意见,集思广益,共同进步.        ★注★ 左侧随笔分类下用两个栏目:<课本源码>.<习

数据结构c语言版串的操作

#include<stdio.h> #include<malloc.h> #include<string.h> //定义字符串的结构体 typedef struct { char *str;//字符串 int maxLength;//最大可以存放字符的长度 int length;//目前的字符长度 }DString; //1.初始化操作 //初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值 void Initiate(DString *s,int max,

C语言 严蔚敏数据结构 线性表之链表实现

博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直接上代码,现阶段代码实现功能有:链表初始化.遍历.增.删.返回链表长度,后续功能陆续发布.其中肯定有很多问题,希望各位码哥留言. Linklist* InitList(int i)//i为链表大小 { Linklist *head; head = (Linklist*)malloc(sizeof(L

深入浅出数据结构C语言版(5)——链表的操作

上一次我们从什么是表一直讲到了链表该怎么实现的想法上:http://www.cnblogs.com/mm93/p/6574912.html 而这一次我们就要实现所说的承诺,即实现链表应有的操作(至于游标数组--我决定还是给它单独写个博文比较好~). 那么,我们的过程应该是怎么样的呢?首先当然是分析需要什么操作,然后再逐一思考该如何实现,最后再以代码的形式写出来. 不难发现,我们希望链表能支持的(基础,可以由此延伸)操作就是: 1.给出第n个元素 2.在第n个元素的后面插入一个元素(包含在最后一个

深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #define SIZE 1000 //表达式的单个元素所使用的结构体 typedef struct elem { int num = 0; //若元素存储操作数则num为该操作数 char oper = '='; //若元素存储操作符则oper为该操作符 bool IsNum = false; //用于

《数据结构(C语言版)》学习——day1,初识数据结构

1. 什么是数据结构 一般而言,使用计算机解决一个具体的问题时,大致需要经过以下几个步骤: ① 从具体的问题中抽象出一个适当的数学模型: ② 设计一个求解该数学模型的算法: ③ 编写程序,进行测试.调整,直至得到最终的问题解答. 对实际问题建立数学模型的实质是:分析问题,并从中提取操作的对象,并找出这些对象间含有的关系,然后使用数学的语言加以描述. 数据结构(data structure)可以定义为:相互之间存在一种或多种特定关系的数据元素的集合. 在任何问题中,数据元素都不是孤立存在的,而是存

深入浅出数据结构C语言版(12)——从二分查找到二叉树

在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不是能解决某个问题,就是能改善解决某个问题的效率.如果能够先了解到存在的问题以及已存在的解决办法的不足,那么学习新的知识就更容易接受,也更容易理解. 万幸的是,二叉树的讲解是可以按照上述顺序来进行的.那么,今天在我们讨论二叉树之前,我们先来讨论一种情形.一种操作:假设现在有一个数组,数组中的数据按照某

深入浅出数据结构C语言版(19)——堆排序

在介绍优先队列的博文中,我们提到了数据结构二叉堆,并且说明了二叉堆的一个特殊用途--排序,同时给出了其时间复杂度O(N*logN).这个时间界是目前我们看到最好的(使用Sedgewick序列的希尔排序时间复杂度为O(N4/3),下图为两者函数图像对比,但是注意,这并不是希尔排序与堆排序的对比,只是两个大O阶函数的对比).这篇博文,我们就是要细化用二叉堆进行排序的想法,实现堆排序. 在介绍优先队列的博文中(http://www.cnblogs.com/mm93/p/7481782.html)所提到

深入浅出数据结构C语言版(4)——表与链表

在我们谈论本文具体内容之前,我们首先要说明一些事情.在现实生活中我们所说的"表"往往是二维的,比如课程表,就有行和列,成绩表也是有行和列.但是在数据结构,或者说我们本文讨论的范围内,我们所说的"表"是一维的,即所有"元素"都是前后排列的.就我个人而言,这样的"表"用"队列"来形容比较恰当.但是,数据结构中"队列"这个名词是被一种特殊的"表"给占用了的,所以我们没法再用