1. 数据结构
众所周知,计算机程序是对信息进行的加工处理.在一般情况下,这些信息并不是没有组织,信息之间往往具有重要的结构关系,这就是数据结构的内容.
设有一个电话号码薄,它记录了N个人的名字和其相应的电话号码,假定按如下形式安排:
(a1,b1)(a2,b2)…(an,bn)
其中ai,bi(i=1,2…n) 分别表示某人的名字和对应的电话号码要求设计一个算法,当给定任何一个人的名字时,该算法能够打印出此人的电话号码,如果该电话簿中根本就没有这个人,则该算法也能够报告没有这个人的标志。
算法的设计,依赖于计算机如何存储人的名字和对应的电话号码, 或者说依赖于名字和其电话号码的结构, 数据的结构, 则直接影响算法的选择和效率.
上面的问题是一种数据结构问题.可以将其设计为: 二维数组, 表结构或者向量. 数据结构还要提供每种结构类型所定义的各种运算的算法.
通过以上可以认为: 数据结构就是研究数据的论技结构和物理结构以及它们之间的相互关系,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构任然是原来的结构类型.
2.基本概念和术语
数据: 对信息的一种符号表示.
数据元素: 是数据的基本单位,在程序中通常作为一个整体进行考虑和处理. 一个数据元素可由若干个数据项组成.
数据对象: 是性质相同的数据元素的集合. 是数据的一个子集.
数据结构: 是相互之间存在一种或多种特定关系的数据元素的集合. 数据结构主要指逻辑结构和物理结构.其逻辑结构通常分为四类基本结构:
集合, 线性结构, 树型结构, 图状结构或网状结构.
数据结构的形式定义为: 数据结构是一个二元组: Data – Structure=(D, S). 其中D是数据元素的有限集,S是D上关系的有限集.
例如复数的数据结构定义如下: Complex=(C, R).
其中C是含有两个实数的集合{C1, C2 }, 分别表示复数的实部和虚部. R={P}, P实定义在集合上的一种关系 { <C1, C2>}.
数据结构在计算机种的表示称为数据的物理结构,又称为存储结构.
数据结构不同于数据类型,也不同于数据对象,它不仅要描述数据类型的数据对象,而且要描述数据对象各元素之间的相互关系。
抽象数据类型: 一个数学模型以及定义在该模型上的一组操作.
抽象数据类型实际上就是对该数据结构的定义。因为它定义了一个数据的逻辑结构以及在此结构上的一组算法。用三元组描述如下:
(D,S,P)
数据结构的存储方式: 顺序存储结构和链式存储结构.
程序题1:巳知线性表LA和线性表LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的元素仍按值非递减有序排列。
此问题的算法如下:
void mergelist(list la,list lb,list &lc)
initlist(lc);
I=j=1;k=0;
la-len=listlength(la);
lb-len=listlength(lb);
while((I<=la-len)&&(j<=lb-len)){
l getelem(la,I,ai);getelem(lb,j,bj);
l
if(ai<=bj){listinsert(lc,++k,ai);++I;}
else{listinsert(lc,++k,bj);++j;}
}
while(I<=la-len){
getelem((la,I++,ai);listinsert(lc,++k,ai);
}
while(j<=lb-len){
getelem((lb,j++,bj);listinsert(lc,++k,bi);
}
}
线性表的顺序存储结构
# define ListSize
100
typedef int DataType;
typedef struc{
DataType data[ListSize];
int length;
} Sqlist;
线性表的插入和删除操作运算:
插入操作
使长度为n的线性表
(a1,…a i-1,ai,…,an)
变成长度为n+1的线性表
(a1,…a i-1,x,ai,…,an)
算法2.3
l Void InsertList(Sqlist*L,DataType x,int I)
l {
l
int j;
l
if(I<1 || I>l.length+1)
l
printf(“Position error”);
l
return ERROR
l if(l.length>=ListSize)
l
printf(“overflow”);
l
exit(overflow);
l
for(j=l.length-1;j>=I-1;j--)
l
l.data[j+1]=l.data[j];
l
l.data[I-1]=x;
l
l.length++;
l }
删除操作:
Void deleteList(Sqlist*L,int I)
{
int j;
if(I<1 || I>l.length)
printf(“Position error”);
return ERROR
for(j=i;j<=l.length-1;j++)
l.data[j-1]=l.data[j];
l.length--;
}