1.以下说法正确的是( D )
A.数据元素是数据的最小单位
B.数据项是数据的基本单位
C.数据结构是带有结构的各数据项的集合
D.一些表面上很不相同的数据可以有相同的逻辑结构
2.以下数据结构中哪个是非线性数据结构( A )
A.树 B.字符串 C.队列 D.栈
3.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用
( D )存储方式最节省运算时间。
A.单链表 B.仅有头指针的单循环链表
C.双向链表 D.仅有尾指针的单循环链表
4.设有长度为 n(n>1)的循环单链表,若从表中删除首元节点的时间复杂度为 O(n),此时采用
的循环单链表的结构是( A )
A.只有头指针,没有头节点 B.只有尾指针,没有头节点
C.只有尾指针,带头节点 D.只有头指针,带头节点
5.一个栈的输入序列为 1 2 3 4 5,则下列序列中不可能是栈的输出序列的是( B )
A. 2 3 4 1 5 B.5 4 1 3 2
C.2 3 1 4 5 D.1 5 4 3 2
6.数组 Q[n]用来表示一个循环队列,f 为当前队列头元素的前一位置,r 为队尾元素的位置,假定队列中元素的个数小于 n,计算队列中元素的公式为( D )
A.r-f
B.(n+f-r)%n
C.n+r-f
D.(n+r-f)%n
7.用链式方式存储的队列,在进行删除运算时( D )
A.仅修改头指针
B.仅修改尾指针
C.头、尾指针都要修改
D.头、尾指针可能都要修改
8.设有两个串 p 和 q,其中 q 是 p 的子串,求 q 在 p 中首次出现的位置的算法称为( C )
A.求子串
B.串联接
C.模式匹配
D.求串长
9.广义表 A=(a,b,(c,d),(e,(f,g))),则 Head(Tail(Head(Tail(Tail(A)))))的值为( D )
A.(g)
B.(d)
C.c
D.d
10.设广义表 L=((a,b,c)),则 L 的长度和深度分别为( C )
A.1 和 1
B.1 和 3
C.1 和 2
D.2 和 3
x=n;//n>1
while(x>=(y+1)*(y+1))
y++;
参考答案:
算法是为了解决某类问题而规定的一个有限长度的操作序列。
算法的 5 个重要特性:
有穷性。一个算法必须是在执行有穷步后结束,且每一步都必须在有穷的时间内完成。
确定性。对一个每种情况下所应执行的操作,在算法中都有确切的规定,不能产生二义性,算法的执行者或阅读者都能明确其含义以及如何执行。
算法中的所有操作都可以通过将已经实现的操作运算执行有限次来实现。
输入:一个算法有 0 个或者多个输入。
输出:一个算法有一个或者多个输出。
评价算法优劣性的基本标准:正确性、可读性、健壮性、高效性
O( n )
a. 在双向链表存储结构中,实现删除 p 所指的结点;
b. 在双向循环链表中,在 p 指针所指的结点后插入 q 所指向的新结点;
参考答案:
a. p->next->prior=p->prior; p->prior->next=p->next;
b.q->prior=p; q->next=p->next; p->next->prior=q; p->next=q;
(5 分)什么是栈?栈的特点是什么?根据教材给出栈空和栈满的判定条件。
参考答案:栈是限定仅在表尾进行插入和删除操作的线性表,特点是后进先出。栈空:
S.top=S.base; 栈满: S.top-S.base==S.stackzie.
(5 分)什么是队列?队列的特点是什么?循环队列满和空的判定条件是什么?
参考答案:队列它只允许在表的一端进行插入,而在另一端进行删除,特点是先进先出。
队空:Q.rear = =Q.rear; 队满:(Q.rear+1)%MAXSIZE==Q.front;
参考答案:loc(a324)=1024+(264+1*4+3)*2=1134
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
现有两个带头结点的非空单循环链表 LA、LB,请先画示意图,然后编写一个算法,将这两个单循环链表合并为一个单循环链表,并使其头指针为 LA。函数头为
LinkList merge(LinkList &LA, LinkList & LB)。
void Inverse_L(LinkList &L) //将 L 原地逆转,空间复杂度为 O(1)
{//一边遍历链表,一遍利用前插法把待处理结点插入
LinkList p, q;
p=L->next;//p 指向首元结点
L->next=NULL;//头结点指针域置空
while(p) //遍历链表
{
q=p->next;//q 指向 p 的后继,即保存下一个待处理结点
p->next=L->next;
L->next=p;
p=q; }
} //Inverse_L()
写出算法 change§,交换 p 所指向的结点和它的前缀结点的顺序。
void change(DuLinkList p)
{
DuLinkList q;
q= p->prior;
q->prior->next=p;
p->prior=q->prior;
q->next=p->next;
q->prior=p;
p->next->prior=q;
p->next=q;
}
学习数据相关的基本概念,包括数据、数据元素、数据项、数据对象、数据结构等,明确数据元素和数据项的关系。
掌握数据结构所含两个层次(逻辑结构和存储结构)的具体含义及其相互关系。逻辑结构是从具体问题抽象出来的数学模型,它与数据的存储无关。存储结构是逻辑结构在计算机中的存储表示,其中,顺序存储结构借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述;链式存储结构无须占用一整块存储空间,通常借助程序设计语言的指针类型来描述,用指针存放后继元素的存储地址。
算法是为了解决某类问题而规定的一个有限长度的操作序列。理解算法五个特性的含义和明确算法优劣的四个评价标准。
算法效率变量的两个主要方面是分析算法的时间复杂度和空间复杂度,以考查算法的时间和空间效率。掌握算法时间复杂度和空间复杂度的分析方法,能够对算法进行基本的时间复杂度与空间复杂度的分析。一般情况下,鉴于运算空间较为充足,故将算法的时间复杂度作为分析的重点。
线性表的顺序存储结构即顺序表是一种随机存取结构,可借助数组来表示。给定数组的下标,便可以存取相应的元素。而线性表的链式存储结构即链表是一种顺序存取结构,链表结点的存取都要从头指针开始,顺链而行。能够从时间和空间复杂度的角度比较顺序和链式两种存储结构的不同特点和其适用的场合,明确它们各自的优缺点,能够依据实际应用问题的需求选用合理的存储结构,能够研究、设计有效的基于线性表的算法,并能够分析算法的性能。
掌握顺序表和链表的查找、插入和删除以及链表的创建(前插和后插)等基本操作,并能够设计出线性表应用的常用算法,比如线性表的合并、有序表的合并、多项式的加法运算等算法。
除了单链表外,掌握不同形式的链表(循环链表和双向链表)的特点,插入和删除等基本操作的实现及其应用场合。
掌握顺序栈和链栈的进栈和出栈算法,明确栈空和顺序栈满的条件
掌握循环队列和链队列的进队和出队算法,明确队空和循环队列队满的条件
深刻理解递归算法执行过程中栈的状态变化过程,便于更好地使用递归算法,了解将递归程序转换为非递归程序的方法。
掌握栈和队列的特点,能够在相应的应用问题中正确选用不同的数据结构,能够借助栈和队列的基本操作来解决某些实际应用问题,如中缀表达式求值、中缀表达式转换为后缀表达式、后缀表达式求值
串是内容受限的线性表,它限定了表中的元素为字符。串有两种基本存储结构:顺序存储和链式存储,但多采用顺序存储结构。串的常用算法是模式匹配算法,主要有 BF 算法和KMP 算法。掌握 BF 算法和 KMP 算法的具体实现,明确 KMP 对 BF 的改进之处,掌握 KMP算法中 next 数组和 nextval 数组的计算方法。
多维数组可以看成线性表的推广,数组一般采用顺序存储结构,存储多维数组时,应先将其确定转换为一维结构, 有按 “行“ 转换和按 “列“ 转换两种 , 掌握两种不同转换方法数组地址的计算方法(通常考查二维数组)。对于几种常见形式的特殊矩阵, 比如对称矩阵、 三角矩阵和对角矩阵,在存储时可进行压缩存储, 掌握特殊矩阵的压缩存储方法。
广义表是另外一种线性表的推广形式,线性表可以看成广义表的特例。掌握广义表的相关概念,主要包括长度和深度。 掌握广义表的基本操作,主要包括取表头和取表尾的操作