- 绪论
- 线性表
1.绪论
基础概念:
数据:数据是描述客观事物的数值、字符以及能输入计算机且能被计算机处理的各种符号集合
(数据包括:数值、字符、声音、图像等一切可以输入计算机中的符号集合)
数据元素:数据元素是组成数据的基本单位,是数据集合的个体。数据项是有独立含义的最小单位。(例如:学籍表是数据,每个学生的记录是一个数据元素,而每个数据元素又由“学号”、“姓名”等数据项组成)
数据对象:数据对象是性质相同的数据元素的集合,是数据的一个子集。
数据概念归纳:
数据特点:可被计算机接收,可被加工
数据结构:可分为数据元素、数据对象
数据结构:指相互之间存在一种或多种特定关系的数据元素,数据结构要研究数据元素之间的相互关系与组织方式。
数据类型:数据类型时一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。
抽象数据类型:包括数据对象、数据元素键的结构关系、操作三部分。
数据元素之间的相互关系:包括数据的逻辑结构、数据的存储结构和数据的运算集合。
数据的逻辑结构:集合结构(结构中的数据元素之间除了同属于一个集合的关系之外,无任何其他关系),线性结构(结构中的数据元素之间存在着一对一的线性关系),树形结构(结构中的数据元素之间存在着一对多的层次关系),图结构或网状结构(结构中的数据元素之间存在着多对多的任意关系)。
数据的存储结构:又称物理结构是逻辑结构在计算机中的存储映像,包括数据元素映像和关系映像。
逻辑结构与存储结构的关系:存储结构是逻辑结构的映像与元素本身的映像。逻辑结构是数据结构的抽象,存储结构是数据结构的实现,两者综合起来建立了数据元素之间的结构关系。
数据元素之间的关系在计算机中可用顺序存储和非顺序存储结构这两种不同的表示方式来存放
数据结构的基本内容:按某种逻辑关系组织起来的一批数据,按一定的映像方式将其存放在计算机的存储器中,并在这些数据上定义一个运算集合。
算法:是规则的有限集合,是为解决特定问题而规定的一系列操作。
算法的特性:
(1)有限性:有限步骤之内正常结束,不能形成无穷循环
(2)确定性:算法中的每一个步骤必须有确定含义,无二义性
(3)可行性:原则上能精确进行,操作可通过已实现的基本运算执行有限次而完成
(4)输入:有多个或0个输入
(5)输出:至少有一个或多个输出
算法的设计要求:
(1)算法的正确性
(2)可读性
(3)健壮性
(4)高效率和低存储量
算法性能评价:主要从算法执行时间与占用存储空间两方面考虑。算法性能与问题规模相关。
数据结构与C语言表示:
程序设计的实质:算法+数据结构=程序
结构化程序设计的目的:通过设计良好的程序,以程序良好的静态结构来保证程序动态执行的正确性,使程序易理解、易调试、易维护,以提高软件开发的效率,减少出错率。
结构化程序设计的构成单元:任何程序都可由顺序、选择、重复三种基本控制结构组成。
结构化程序设计方法:
自顶向下,逐步求精
独立功能,一个入口,一个出口的模块化结构
仅用三种基本控制结构的设计原则
面向对象与抽象数据类型:
面向对象=对象+类+继承+通信
面向对象程序设计的特点:封装性(encapsulation)、继承性(inheritance)和多态性(polymorphism)。
数据结构上的基本操作主要为:插入、删除、更新、查找、排序。
结构化开发数面向过程的开发方法,与结构化开发方法相比,采用面向对象开发方法开发的程序具有更高的可靠性、可修改性、可维护性、可复用性、可适用性和可理解性。
抽象数据类型:集中体现了程序设计中一些最基本原则:分解、抽象和信息隐藏。
2.线性表
线性表:是n个类型相同的数据元素的有限序列,对于n>0,除第一个元素无直接前驱,最后一个元素无直接后继外,其余每个数据元素只有一个直接前驱和一个直接后继。
线性表的特点:
(1)同一性:线性表由同类型数据元素组成,每一个数据元素属于同一数据类型。
(2)有穷性:线性表由有限个数据元素组成,表长度就是表中元素的个数。
(3)有序性:线性表中相邻元素之间存在着序偶关系。
地址的计算:
Loc(ai)=Loc(a1)+(i-1)xk
Loc(a1):基地址,第一个元素的地址,k为元素空间所占大小
线性表顺序存储表示:
利用定义的顺序表的数据类型SeqList可以定义变量。变量L的定义与使用方法:
(1)通过变量定义语句SeqList L;将L定义为SeqList类型的变量,可以通过L.elem[i-1]访问顺序表中序号为i的元素ai,通过L.last得到顺序表中最后一个元素下标,而L.last+1是顺序表的长度。
(2)通过指针变量定义语句SeqList L1,*L;L=&L1;将L定义为指向SeqList类型的指针变量。可通过L->elem[i-1]访问顺序表中序号为i的元素,使用L->Last+1得到顺序表的长度。
//顺序表按内容查找运算
int Locate(SeqList L,ElemType e)
//在顺序表中查找与e相等的元素L.elem[i]==e,找到元素返回i+1,找不到则返回-1
{
int i=0;//初值为0从第一个元素开始比较
while((i<=L.last)&&(L.elem[i]!=e))
i++;
if(i<L.last)
return(i+1);
else
return(-1);
}
//顺序表的插入运算
#define OK;
#define ERROR 0;
int InsList(SeqList *L,int i, ElemType e)
//在顺序表L中第i个元素之前插入一个元素
{
int k;
if(i<1)||(i>L->last+2)//判断插入位置
{
printf("插入位置i值不合法");
return(ERROR);
}
if(L->last>=MAXSIZE-1)
{printf("表已满");return(ERROR);}
for(k=L->last;k>=i-1;k--)
L->elem[k+1]=L->elem[k];
L->elem[i-1]=e;
L->last++;
return(OK);
}
//顺序表的删除运算
int DelList(SeqList *L,int i;ElemType *e)
//在顺序表中删除第i个元素,并用智者参数e返回其值
{
int k;
if((i<1)||(i>L->last+1))
{printf("删除位置不合法");return(ERROR);}
*e=L->elem[i-1];
for(k=i;i<=last;k++)
L->elem[k-1]=L->elem[k];
L->last--;
return(OK);
}