初赛复习三 数据结构
程序=算法+数据结构:
算法:对特定问题求解步骤的一种描述。他又正确性,可读性,健壮性,效率和地存储量。 算法的时间复杂度:
1.1 基本概念和术语 1.数据(data):
是对客观事物的符号的表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。 2.数据元素(data element):
是数据的基本单位,在计算机程序中通常作为一个整体来处理。一个数据元素由多个 数据项(data item)组成,数据 项是数据不可分割的最小单位。 3.数据结构(data structure):
是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是一个二元组,记为: data_structure=(D,S).其中D为数据元素的集合,S是D上关系的集合。
数据元素相互之间的关系称为结构(structure)。根据数据元素之间关系的不同特性,通常由下列四类基本结构:
(1)集合:数据元素间的关系是同属一个集合 (2)线性结构:数据元素间存在一对一的关系。 (3)树形结构:结构中的元素间的关系是一对多的关系。
(4)图(网)状结构:结构中的元素间的关系是多对多的关系。
1.2 数据的逻辑结构和物理结构
逻辑结构:数据元素之间存在的关系(逻辑关系)叫数据的逻辑结构。 物理结构:数据结构在计算机中的表示(映象)叫数据的物理结构。
一种逻辑结构可映象成不同的存储结构:顺序存储结构和非顺序存储结构(链式存储结构和散列结构)。
第二章 线性表
(1)了解线性表的逻辑结构是数据元素之间存在着线性关系,在计算机中表示这种关系的两种不同的存储结构是顺序存储结构和链式存储结构。 (2)熟练掌握线性表的两种存储结构:顺序存储结构和链式存储结构. (3)熟练掌握线性表的两种存储结构的基本算法:查找、插入、删除等. 2.1 线性表的逻辑结构及基本运算 type p=^ rec;//指针 1.线性表简单的定义A=(a0,a1,a2,...,an-1)
rec=record //记录型 (1)有且仅有一个开始结点(表头结点)a0,它没有直接前驱,只有一个直接后继; data:integer; (2)有且仅有一个终端结点(表尾结点)an-1,它没有直接后继,只有一个直接前驱; next:pointer; (3)其它结点都有一个直接前驱和直接后继;
end; (4)元素之间为一对一的线性关系。
var head:pointer; 设有一批整数(12,56,45,86,77,……,),如何存放呢? 下图是一个简单链表结构示意图:
P data next P:指针 P^:指针指向的数据
P^.data P^.next
其中:①每个框表示链表的一个元素,称为结点。
②框的顶部表示了该存储单元的地址(当然,这里的地址是假想的)。
③每个结点包含两个域:一个域存放整数,称为数据域,另一个域存放下一个结点(称为该结点的后继结点,相应地,该结点为后继结点的前趋结点)的地址。
④链表的第一个结点称为表头,最后一个结点表尾,称为指针域;
⑤指向表头的指针head称为头指针(当head为nil时,称为空链表),在这个指针变量中 存放了表头的地址。
⑥在表尾结点中,由指针域不指向任何结点,一般放入nil。 ⒈结点的插入
如下图所示,要在P结点和Q结点之间插入一个结点m,其操作如下: 只要作如下操作即可: New(m);//分配存储空间 read(m^.data); m^.next:=q; p^.next:=m; ⒉结点的删除
如下图所示,要在删除结点P的操作如下: 要删除结点P,则只要将其前趋结点的指针域指向P 的后继结点即可。
q^.next:=p^.next; dispose(p);//释放存储空间
2.2环形链表结构
在单向链表中,表尾结点的指针为空。如果让表尾结点 的指针域指向表头结点,则称为单向环形链表,简称单链环。 如图所示。
type p=^node node=record data:integer; next:p; end;
2.3双向链表结构
单链表中,每个结点只有一个指向其后继结点的指针域。如果每个结点不仅有一个指向其后继结点的指针域,还有一个指向其前趋的指针域,则这种链表称为双向链表。如图所示。 双向链表示意图
可用如下定义一个数据域为整型的双向链表:
type pointer=^node; node=record
prev:pointer; data:integer; next:pointer; end;
(NIOP2009).在带尾指针(链表指针clist指向尾结点)的非空循环单链表中每个结点都以next字段的指针指向下一个节点。假定其中已经有2个以上的结点。下面哪些说法是正确的:(多选) A) 如果p指向一个待插入的新结点,在头部插入一个元素的语句序列为:
p^.next:= clist^.next; clist^.next:= p;
B) 如果p指向一个待插入的新结点,在尾部插入一个元素的语句序列为:
p^.next:= clist; clist^.next:= p;
C) 在头部删除一个结点的语句序列为:
p:= clist^.next; clist^.next:= clist^.next^.next; dispose(p); D) 在尾部删除一个结点的语句序列为。
p:= clist; clist:= clist ^.next; dispose(p);
(NIOP2010)双向链表中有两个指针域llink和rlink,分别指向该结点的前驱及后继。设p指向链表中的一个结点,他的左右结点均为非空。现要求删除结点p,则下列语句序列中正确的是(多选( )。
A.p->rlink->llink=p->rlink;
p->llink->rlink=p->llink; delete p; B.p->llink->rlink=p->rlink;
p->rlink->llink = p->llink; delete p; C.p->rlink->llink = p->llink;
p->rlink->llink ->rlink = p->rlink; delete p; D.p->llink->rlink = p->rlink;
p->llink->rlink->link = p->llink; delete p;
P
江苏信息学奥赛数据结构教程



