资源预览内容
第1页 / 共88页
第2页 / 共88页
第3页 / 共88页
第4页 / 共88页
第5页 / 共88页
第6页 / 共88页
第7页 / 共88页
第8页 / 共88页
第9页 / 共88页
第10页 / 共88页
亲,该文档总共88页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第 1 章章 绪绪 论论 习题 一、问答题 1.什么是数据结构? 2.四类基本数据结构的名称与含义。 3.算法的定义与特性。 4.算法的时间复杂度。 5.数据类型的概念。 6.线性结构与非线性结构的差别。 7.面向对象程序设计语言的特点。 8.在面向对象程序设计中,类的作用是什么? 9.参数传递的主要方式及特点。 10. 抽象数据类型的概念。 二、判断题 1.线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。 2.算法就是程序。 3.在高级语言(如 C、或 PASCAL)中,指针类型是原子类型。 三、计算下列程序段中 X=X+1 的语句频度 for(i=1;i=n;i+) for(j=1;j=i;j+) for(k=1;k=j;k+) x=x+1; 提示: i=1 时: 1 = (1+1)1/2 = (1+12)/2 i=2 时: 1+2 = (1+2)2/2 = (2+22)/2 i=3 时: 1+2+3 = (1+3)3/2 = (3+32)/2 i=n 时: 1+2+3+n = (1+n)n/2 = (n+n2)/2 f(n) = (1+2+3+n) + (12 + 22 + 32 + + n2 ) / 2 = (1+n)n/2 + n(n+1)(2n+1)/6 / 2 =n(n+1)(n+2)/6 =n3/6+n2/2+n/3 区分语句频度和算法复杂度: O(f(n) = O(n3) 四、试编写算法求一元多项式 Pn(x)=a0+a1x+a2x2+a3x3+anxn的值 Pn(x0),并确定算 法中的每一语句的执行次数和整个算法的时间复杂度, 要求时间复杂度尽可能的小, 规定算 法中不能使用求幂函数。注意:本题中的输入 ai(i=0,1,n), x 和 n,输出为 Pn(x0).通常算 法的输入和输出可采用下列两种方式之一: (1) 通过参数表中的参数显式传递; (2) 通过全局变量隐式传递。 试讨论这两种方法的优缺点,并在本题算法中以你认为较好的一种方式实现输入和输出。 提示:float PolyValue(float a , float x, int n) 核心语句: p=1; (x 的零次幂) s=0; i 从 0 到 n 循环 s=s+ai*p; p=p*x; 或: p=x; (x 的一次幂) s=a0; i 从 1 到 n 循环 s=s+ai*p; p=p*x; 实习题 设计实现抽象数据类型“有理数” 。基本操作包括有理数的加法、减法、乘法、除法, 以及求有理数的分子、分母。 第一章答案 1.3 计算下列程序中 x=x+1 的语句频度 for(i=1;i=n;i+) for(j=1;j=i;j+) for(k=1;k=j;k+) x=x+1; 【解答】x=x+1 的语句频度为: T(n)=1+(1+2)+(1+2+3)+(1+2+n)=n(n+1)(n+2)/6 1.4 试编写算法,求 pn(x)=a0+a1x+a2x2+.+anxn的值 pn(x0),并确定算法中每一语句的执 行次数和整个算法的时间复杂度, 要求时间复杂度尽可能小, 规定算法中不能使用求幂函数。 注意:本题中的输入为 ai(i=0,1,n)、x 和 n,输出为 Pn(x0)。 算法的输入和输出采用下列 方法(1)通过参数表中的参数显式传递(2)通过全局变量隐式传递。讨论两种方法的优 缺点,并在算法中以你认为较好的一种实现输入输出。 【解答】 (1)通过参数表中的参数显式传递 优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通 用性强,移置性强。 缺点:形参须与实参对应,且返回值数量有限。 (2)通过全局变量隐式传递 优点:减少实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗 缺点:函数通用性降低,移植性差 算法如下:通过全局变量隐式传递参数 PolyValue() int i,n; float x,a,p; printf(“nn=”); scanf(“%f”, printf(“nx=”); scanf(“%f”, for(i=0;in;i+) scanf(“%f ”, /*执行次数:n 次 */ p=a0; for(i=1;i=n;i+) p=p+ai*x; /*执行次数:n 次*/ x=x*x; printf(“%f”,p); 算法的时间复杂度:T(n)=O(n) 通过参数表中的参数显式传递 float PolyValue(float a , float x, int n) float p,s; int i; p=x; s=a0; for(i=1;inext=S; (2)P-next= P-next-next; (3)P-next= S-next; (4)S-next= P-next; (5)S-next= L; (6)S-next= NULL; (7)Q= P; (8)while(P-next!=Q) P=P-next; (9)while(P-next!=NULL) P=P-next; (10)P= Q; (11)P= L; (12)L= S; (13)L= P; 2.4 已知线性表 L 递增有序。试写一算法,将 X 插入到 L 的适当位置上,以保持线性表 L 的有序性。 提示:void insert(SeqList *L; ElemType x) (1)找出应插入位置 i, (2)移位, (3) 参 P. 229 2.5 写一算法,从顺序表中删除自第 i 个元素开始的 k 个元素。 提示:注意检查 i 和 k 的合法性。 (集体搬迁, “新房” 、 “旧房” ) 以待移动元素下标 m(“旧房号” )为中心, 计算应移入位置(“新房号” ): for ( m= i1+k; mlast; m+) Lelem mk = Lelem m ; 同时以待移动元素下标 m 和应移入位置 j 为中心: 以应移入位置 j 为中心,计算待移动元素下标: 2.6 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效 算法,删除表中所有大于 mink 且小于 maxk 的元素(若表中存在这样的元素) ,分析你的算 法的时间复杂度(注意:mink 和 maxk 是给定的两个参变量,它们的值为任意的整数) 。 提示:注意检查 mink 和 maxk 的合法性:mink next; while (p!=NULL (2)找到最后一个应删结点的后继 s,边找边释放应删结点 s=p; while (s!=NULL free(t); (3)prenext = s; 2.7 试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表 (a1, a2., an)逆置为(an, an-1,., a1) 。 (1)以一维数组作存储结构,设线性表存于 a(1:arrsize)的前 elenum 个分量中。 (2)以单链表作存储结构。 方法 1:在原头结点后重新头插一遍 方法 2:可设三个同步移动的指针 p, q, r,将 q 的后继 r 改为 p 2.8 假设两个按元素值递增有序排列的线性表 A 和 B, 均以单链表作为存储结构, 请编写算 法, 将 A 表和 B 表归并成一个按元素值递减有序的排列的线性表 C, 并要求利用原表 (即 A 表和 B 表的)结点空间存放表 C. 提示:参 P.28 例 2-1 void merge(LinkList A; LinkList B; LinkList *C) pa=Anext; pb=Bnext; *C=A; (*C)next=NULL; while ( pa!=NULL pa=panext; smallernext = (*C)next; /* 头插法 */ (*C)next = smaller; else smaller=pb; pb=pbnext; smallernext = (*C)next; (*C)next = smaller; while ( pa!=NULL) smaller=pa; pa=panext; smallernext = (*C)next; (*C)next = smaller; while ( pb!=NULL) smaller=pb; pb=pbnext; smallernext = (*C)next; (*C)next = smaller; LinkList merge(LinkList A; LinkList B) LinkList C; pa=Anext; pb=Bnext; C=A; Cnext=NULL; return C; 2.9 假设有一个循环链表的长度大于 1,且表中既无头结点也无头指针。已知 s 为指向链表 某个结点的指针,试编写算法在链表中删除指针 s 所指结点的前趋结点。 提示:设指针 p 指向 s 结点的前趋的前趋,则 p 与 s 有何关系? 2.10 已知有单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其 它字符) , 试编写算法来构造三个以循环链表表示的线性表, 使每个表中只含同一类的字符, 且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。 2.11 设线性表 A=(a1, a2,am),B=(b1, b2,bn),试写一个按下列规则合并 A、B 为线性 表 C 的算法,使得: C= (a1, b1,am, bm, bm+1, ,bn) 当 mn 时; 或者 C= (a1, b1,an, bn, an+1, ,am) 当 mn 时。 线性表 A、 B、 C 均以单链表作为存储结构, 且 C 表利用 A 表和 B 表中的结点空间构成。 注意:单链表的长度值 m 和 n 均未显式存储。 提示:void merge(LinkList A; LinkList B; LinkList *C) 或:LinkList merge(LinkList A; LinkList B) 2.12 将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式中各自仅含 奇次项或偶次项,并要求利用原链表中的结点空间来构成这两个链表。 提示:注明用头指针还是尾指针。 2.13 建立一个带头结点的线性链表, 用以存放输入的二进制数, 链表中每个结点的 data 域 存放一个二进制位。并在此链表上实现对二进制数加 1 的运算 。 提示:可将低位放在前面。 2.14 设多项式 P(x)采用课本中所述链接方法存储。写一算法,对给定的 x 值,求 P(x)的值。 提示:float PolyValue(Polylist p; float x) 实习题 1将若干城市的信息存入一个带头结点的单链表,结点中的城市信息包括城市名、城市的 位置坐标。要求: (1)给定一个城市名,返回其位置坐标; (2)给定一个位置坐标 P 和一个距离 D,返回所有与 P 的距离小于等于 D 的城市。 2约瑟夫环问题。 约瑟夫问题的一种描述是:编号为 1,2,n 的 n 个人按顺时针方向围坐一圈,每 人持有一个密码(正整数) 。一开始任选一个整数作为报数上限值 m,从第一个人开始顺时针 自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 值,从 他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有的人全部出列为止。 试设计一个程序,求出出列顺序。 利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号。 例如 m 的初值为 20;n=7,7 个人的密码依次是:3,1,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号