数据结构C语言描述习题及答案耿国华.doc

上传人:h**** 文档编号:167931 上传时间:2018-07-13 格式:DOC 页数:88 大小:550KB
下载 相关 举报
数据结构C语言描述习题及答案耿国华.doc_第1页
第1页 / 共88页
数据结构C语言描述习题及答案耿国华.doc_第2页
第2页 / 共88页
数据结构C语言描述习题及答案耿国华.doc_第3页
第3页 / 共88页
数据结构C语言描述习题及答案耿国华.doc_第4页
第4页 / 共88页
数据结构C语言描述习题及答案耿国华.doc_第5页
第5页 / 共88页
点击查看更多>>
资源描述

1、第 1 章 绪 论 习 题 一、问答题 1. 什么是数据结构? 2. 四类基本数据结构的名称与含义。 3. 算法的定义与特性。 4. 算法的时间复杂度。 5. 数据类型的概念。 6. 线性结构与非线性结构的差别。 7. 面向对象程序设计语言的特点。 8. 在 面向对象程序设计中,类的作用是什么? 9. 参数传递的主要方式及特点。 10. 抽象数据类型的概念。 二、判断题 1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。 2. 算法就是程序。 3. 在高级语言(如 C、或 PASCAL)中,指针类型是原子类型。 三、计算下列程序段中 X=X+1 的语句频度 for(i=1;

2、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的有序性。 提示 : voi

3、d insert(SeqList *L; ElemType x) ( 1)找出应插入位置 i,( 2)移位,( 3) 参 P. 229 2.5 写一算法,从顺序表中删除自第 i 个元素开始的 k 个元素。 提示 : 注意检查 i 和 k 的合法性。 (集体搬迁,“新房”、“旧房”) 以 待移动元素下标 m(“旧 房号”) 为中心, 计算 应移入位置(“新房号”) : for ( m= i 1+k; mlast; m+) L elem m k = L elem m ; 同时以 待移动元素下标 m 和 应移入位置 j 为中心: 以 应移入位置 j 为中心,计算 待移动元素下标 : 2.6 已知线性

4、表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于 mink 且小于 maxk 的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意: mink 和 maxk 是给定的两个参变量,它们的值为任意的整数)。 提示 : 注意检查 mink 和 maxk 的合法性: mink next; while (p!=NULL ( 2) 找到 最后一个应删结点的后继 s,边找边 释放 应删结点 s=p; while (s!=NULL free(t); ( 3) pre next = s; 2.7 试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空

5、间将线性表( 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 m

6、erge(LinkList A; LinkList B; LinkList *C) pa=A next; pb=B next; *C=A; (*C) next=NULL; while ( pa!=NULL pa=pa next; smaller next = (*C) next; /* 头插法 */ (*C) next = smaller; else smaller=pb; pb=pb next; smaller next = (*C) next; (*C) next = smaller; while ( pa!=NULL) smaller=pa; pa=pa next; smaller ne

7、xt = (*C) next; (*C) next = smaller; while ( pb!=NULL) smaller=pb; pb=pb next; smaller next = (*C) next; (*C) next = smaller; LinkList merge(LinkList A; LinkList B) LinkList C; pa=A next; pb=B next; C=A; C next=NULL; return C; 2.9 假设有一个循环链表的长度大于 1,且表中既无头结点也无头指针。已知 s 为指向链表某个结点的指针,试编写算法在链表中删除指针 s 所指结点

8、的前趋结点。 提示 :设指针 p 指向 s 结点的前趋的前趋,则 p 与 s 有何关系? 2.10 已知有单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其它字符), 试编写算法来构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。 2.11 设线性表 A=(a1, a2,a m), B=(b1, b2,b n),试写一个按下列规则合并 A、 B 为线性表 C 的算法,使得: C= (a1, b1,a m, bm, bm+1, ,b n) 当 mn 时; 或者 C= (a1, b1,a n, bn, an

9、+1, ,a m) 当 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 建立一个带头结点的线性链表,用以

10、存放输入的二进制数,链表中每个结点的 data 域存放一个二进制位。并在此链表上实现对二进制数加 1 的运算 。 提示 :可将低位放在前面。 2.14 设多项式 P(x)采用课本中所述链接方法存储。写一算法,对给定的 x 值,求 P(x)的值。 提示 : float PolyValue(Polylist p; float x) 实习题 1 将若干城市的信息存入一个带头结点的单链表,结点中的城市信息包括城市名、城市的位置坐标。要求: ( 1) 给定一个城市名,返回其位置坐标; ( 2) 给定一个位置坐标 P 和一个距离 D,返回所有与 P 的距离小于等于 D 的城市。 2 约瑟夫环问题。 约瑟夫

11、问题的一种描述是:编号为 1, 2, n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值 m,从第一个人开始顺时针自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有的人全部出列为止。试设计一个程序,求出出列顺序。 利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号。 例如 m 的 初值为 20; n=7, 7 个人的密码依次是: 3, 1, 7, 2, 4, 8, 4,出列的顺序为 6, 1, 4, 7, 2, 3, 5。

12、 第二章 答案 实习题二: 约瑟夫环问题 约瑟夫问题的一种描述为:编号 1,2,n 的 n 个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个报数上限值 m,从第一个人开始顺时针自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有的人全部出列为止。试设计一个程序,求出出列顺序。利用单向循环链表作为存 储结构模拟此过程,按照出列顺序打印出各人的编号。 例如 , m 的初值为 20; n=7, 7 个人的密码依次是: 3,1,7,2,4,8,4, 出列顺序为6,1,4,7,

13、2,3,5。 【解答】算法如下: typedef struct Node int password; int num; struct Node *next; Node,*Linklist; void Josephus() Linklist L; Node *p,*r,*q; int m,n,C,j; L=(Node*)malloc(sizeof(Node); /*初始化单向循环链表 */ if(L=NULL) printf(“n 链表申请不到空间 !“);return; L-next=NULL; r=L; printf(“请输入数据 n 的值 (n0):“); scanf(“%d“, for(j=1;jpassword=C; p-num=j; r-next=p; r=p; r-next=L-next; printf(“请输入第一个报数上限值 m(m0):“); scanf(“%d“, printf(“*n“); printf(“出列的顺序为 :n“); q=L; p=L-next; while(n!=1) /*计算出列的顺序 */ j=1; while(jnext; j+; printf(“%d-“,p-num); m=p-password; /*获得新密码 */

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 教育教学资料库 > 复习参考

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。