《数据结构—用C语言描述》课后习题答案.pdf
《《数据结构—用C语言描述》课后习题答案.pdf》由会员分享,可在线阅读,更多相关《《数据结构—用C语言描述》课后习题答案.pdf(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构课后习题参考答案第 一 章 绪论1.3 (1)0(n)(2)(2)0(n)(3)(3)0(n)(4)(4)0(/2)(5)(5)执行程序段的过程中,x,y 值变化如下:循环次数X0 (初始)9 11 0 019 21 0 029 31 0 091 0 01 0 01 01 0 11 0 01 19 19 91 29 21 0 02 01 0 19 92 19 19 83 01 0 19 83 19 19 7到 y=0 时,要执行1 0*1 0 0 次,可记为O (1 0*y)=0 (n)1.5 21 0 0,(2/3)n,l o g2n ,n/2,n3/2,(3/2)n,nl o g2
2、n,2n,n!,n第二章线性表(参考答案)在以下习题解答中,假定使用如下类型定义:(1)顺序存储结构:#defin e M AX S I ZE 1 0 2 4ty pedef in t El em T y pe;/实际上,El em T y pe可以是任意类型ty pedef struct El em T y pe dataM AX S I ZE;in t l ast;加 st表示终端结点在向量中的位置J sequen l ist;(2)链式存储结构(单链表)ty pedef struct n o de El em T y pe data;struct n o de*n ex t;l in k
3、 l ist;(3)链式存储结构(双链表)ty pedef struct n o de El em T y pe data;struct n o de*prio r,*n ex t;dl in k l ist;(4)静态链表ty pedef struct El em T y pe data;in t n ex t;)node;node saMAXSIZE;2.1 头指针:指向链表的指针。因为对链表的所有操均需从头指针开始,即头指针具有标识链表的作用,所以链表的名字往往用头指针来标识。如:链表的头指针是la,往往简称为“链表la”。头结点:为了链表操作统一,在链表第一元素结点(称为首元结点,或首
4、结点)之前增加的一个结点,该结点称为头结点,其数据域不无实际意义(当然,也可以存储链表长度,这只是副产品),其指针域指向头结点。这样在插入和删除中头结点不变。开始结点:即上面所讲第一个元素的结点。2.2 只设尾指针的单循环链表,从尾指针出发能访问链表上的任何结点。2 3void insert(ElemType A,int elenum,ElemType x)向 量 A 目前有elenum个元素,且递增有序,本算法将x 插入到向量A 中,并保持向量的递增有序。int i=0,j;while(ielenum&Ai=i;j)Aj+l=Aj;/向后移动元素Ai=x;/插入元素 /算法结束2 4void
5、 rightrotate(ElemType A,int n,k)/以向量作存储结构,本算法将向量中的n 个元素循环右移k 位,且只用个辅助空间。int num=0;/计数,最终应等于nint start=0;/记录开始位置(下标)while(numn)temp=Astart;暂存起点元素值,temp与向量中元素类型相同empty二 start;保存空位置下标next=(start-K+n)%n;/计算下一右移元素的下标while(next!=start)A empty=A next;/右移num+;/右移元素数加1empty二 next;next=(next-K+n)%n;/计算新右移元素的F
6、 标 _ _A empty二 temp;/把一轮右移中最后一个元素放到合适位置num+;start+;起 点 增 1,若 num n 则开始下一轮右移。/算法结束算法二算法思想:先将左面n-k个元素逆置,接着将右面k 个元素逆置,最后再将这n 个元素逆置。void rightrotate(ElemType A,int n,k)/以向量作存储结构,本算法将向量中的n 个元素循环右移k 位,且只用一个辅助空间。ElemType temp;for(i=0;i(n-k)/2;i+)左面 nk 个元素逆置temp=Ai;Ai=An-k-l-i;An-k-l-i=temp;for(i=l;i=k;i+)右
7、面k 个元素逆置temp=An-k-i;An-k-i=An-i;An-i=temp;for(i=0;ine x t,*p re=L,*s;p为工作指针,指向当前元素,p re 为前驱指针,指向当前元素的前驱s=(li nk li s t *)malloc(s i z e of (li nk li s t);申请空间,不判断溢出s-dat a=x;w h i le (p&p-dat ane x t;/查找插入位置p re-ne x t=s;s-ne x t=p;/插入元素 /算法结束2 6v oi d i nv e rt (li nk li s t *L)/本算法将带头结点的单链表L 逆置。算法
8、思想是先将头结点从表上摘下,然后从第一个元素结点开始,依次前插入以 L为头结点的链表中。li nk li s t *p=L-ne x t,*s;p为工作指针,指向当前元素,s 为 p的后继指针L-ne x t=nu ll;头结点摘下,指针域置空。算法中头指针L 始终不变w h i le (p)s=p-ne x t;/保留后继结点的指针p-ne x t=L-ne x t;/逆置L-ne x t=p;p=s;/将 p 指向下个待逆置结点)/算法结束2 7(1)i nt le ng t h l(li nk li s t *L)/本算法计算带头结点的单链表L的长度 li nk li s t *p=L-
9、ne x t;i nt i=0;/p为工作指针,指向当前元素,i表示链表的长度w h i le (p)i+;p=p-ne x t;re t u rn(i);/算法结束(2)i nt le ng t h l(node s a M AXS I Z E )/本算法计算静态链表s中元素的个数。i nt p=s a 0.ne x t,i=0;p为工作指针,指向当前元素,i表示元素的个数,静态链指针等于-1时链表结束w h i le (p!=-1)i+;p=s a p .ne x t;re t u rn(i);/算法结束2 8v oi d u ni on_ i nv e rt(li nk li s t *
10、A,*B,*C)A和B是防个带头结点的递增有序的单链表,本算法将两表合并成/一个带头结点的递减有序单链表C,利用原表空间。li nk li s t *p a=A-ne x t,*p b=B-ne x t,*C=A,*r;p a,p b为工作指针,分别指向A 表和B 表的当前元素,r 为当前逆置元素的后继指针,使逆置元素的表避免断开。算法思想是边合并边逆置,使递增有序的单链表合并为递减有序的单链表。C-ne x t=nu ll;头结点摘下,指针域置分。算法中头指针C 始终不变w h i le (p a&p b)/两表均不空时作i f (p a-dat adat a)/将 A 表中元素合并且逆置
11、r=p a-ne x t;p a-ne x t=C-ne x t;C-ne x t=p a;p a=r;)e ls e r=p b-ne x t;p b-ne x t=C-ne x t;C-ne x t=p b;p b=r;保留后继结点的指针/逆置恢复待逆置结点的指针/将 B 表中元素合并且逆置保留后继结点的指针/逆置恢复待逆置结点的指针/以下w h i le (p a)和 w h i le (p b)语句,只执行一个w h i le (p a)r=p a-ne x t;p a-ne x t=C-ne x t;C-ne x t=p a;p a=r;w h i le (p b)r=p b-ne
12、x t;p b-ne x t=C-ne x t;C-ne x t=p b;p b=r;f re e (B);释放B 表头结点 /算法结束/将 A 表中剩余元素逆置保留后继结点的指针/逆置恢复待逆置结点的指针/将 B 表中剩余元素逆置/保留后继结点的指针/逆置恢复待逆置结点的指针2 9v oi d de le t e p ri or(li nk li s t *L)长 度 大 于 1 的单循环链表,既无头结点,也无头指针,本算法删除*S的前驱结点 li nk li s t *p=s-ne x t,*p re=s;/p 为工作指 针,指向当前元素,/p re 为前驱指针,指向当前元素*p的前驱w
13、h i le (p-ne x t!=s)p re=p;p=p-ne x t;/查找*s 的前驱p re-ne x t=s;f re e(p);/删除元素 /算法结束2 10v oi d one _ t o_ t h re e(1i nk li s t *A,*B,*C)/A 是带工结点的的单链表,其数据元素是字符字母、字符、数字字符、其他字符。本算法将A 表分成/三个带头结点的循环单链表A、B 和 C,分别含有字母、数字和其它符号的同一类字符,利用原表空间。li nk li s t *p=A-ne x t,r;p为工作指针,指向A 表的当前元素,r 为当前元素的后继指针,使表避免断开。算法思想
14、是取出当前元素,根据是字母、数字或其它符号,分别插入相应表中。B=(li nk li s t *)malloc(s i z e of (li nk li s t);申请空间,不判断溢出B-ne x t=nu ll;/准备循环链表的头结点C=(li nk li s t *)malloc(s i z e of (li nk li s t);申请空间,不判断溢出C-ne x t=nu ll;/准备循环链表的头结点w h i le (p)r=p-ne x t;/用以记住后继结点i f (p-dat a=,a&p-dat adat a=,A&p-dat a ne x t=A-ne x t;A-ne x
15、t=p;/将字母字符插入 A 表e ls e i f (p-dat a=,O&p-dat ane x t=B-ne x t;B-ne x t=p;/将数字字符插入 B 表e ls e p-ne x t=C-ne x t;C-ne x t=p;/将其它符号插入 C 表P 二 r;恢复后继结点的指针/w h i le /算法结束2 11v oi d locat e(dli nk li s t *L)/L 是带头结点的按访问频度递减的双向链表,本算法先查找数据x,/查找成功时结点的访问频度域增1,最后将该结点按频度递减插入链表中适当位置。li nk li s t *p=L-ne x t,*q;/p
16、为工作指针,指向L表的当前元素,q为 p的前驱,用于查找插入位置。w h i le (p&p-dat a!=x)p=p-ne x t;/查找值为 x 的结点。i f (!p)re t u rn(不存在值为x的结点”);e ls e p-f re q+;/令元素值为x的结点的f re q 域 加 1。p-ne x t-p ri r=p-p ri or;/将 p结点从链表上摘下。p-p ri or-ne x t=p-ne x t;q=p-p ri or;/以下查找p结点的插入位置w h i le (q !=L&q-f re q p ri or;p-ne x t=q-ne x t;q-ne x t-
17、p ri or=p;/将 p 结点插入p-p ri or=q;q-ne x t=p;/算法结束第三章栈和队列(参考答案)/从数据结构角度看,栈和队列是操作受限的线性结构,其顺序存储结构/和链式存储结构的定义与线性表相同,请参考教材,这里不再重复。3.1 12 3 42 13 43 2 1 44 312 4 32 14 33 2 4 113 2 42 3 143 4 2 113 4 22 3 4 114 3 22 4 3 1设入栈序列元素数为n,则可能的出栈序列数为C2 nn=(l/n+l)*(2 n!/(n!)2)23.2 证明:由 j p k 说明p,在外之后出栈,即 p,被 P k 压在下
18、面,后进先出。由1以上两条,不可能存在i j next;while(idata);p=p-next;if(n%2!=0)p=p-next;/奇数个结点时跳过中心结点while(p&p-data=pop(s)p=p-next;if(p=null)printf(链表中心对称”);else printf(链表不是中心对称”);/算法结束3.4i n t m a t c h ()从键盘读入算术表达式,本算法判断圆括号是否正确配对(i n i t s;初始化栈ss c a n f (%c”,&c h);w h i l e (c h!=#)#是表达式输入结束符号s w i t c h (c h)c a s
19、 e :p u s h(s,c h);b r e a k;c a s e :i f (e m p t y(s)p r i n t f(括号不配对);e x i t(0);)p o p(s);i f (!e m p t y(s)p r i n t f (括号不配对”);e l s e p r i n t f (括 号 配 对);/算法结束3.5t y p e d e f s t r u c t /两栈共享一向量空间 El e m T y p e v m ;/栈可用空间 0m li n t t o p 2 /栈顶指针t w o s t a c k;i n t p u s h(t w o s t a
20、 c k *s,i n t i,El e m T y p e x)/两栈共享向量空间,i 是 0 或 1,表示两个栈,x是进栈元素,/本算法是入栈操作 i f (a b s(s-t o p 0 -s-t o p l )=l)r e t u r n(0);/栈满e l s e s w i t c h (i)c a s e 0:s-v +(s-t o p)=x;b r e a k;c a s e 1:s-v -(s-t o p)=x;b r e a k;d e f a u l t:p r i n t f (栈编号输入错误);r e t u r n (0);)r e t u r n (1);/入栈成
21、功)/算法结束El e m T y p e p o p(t w o s t a c k *s,i n t i)两栈共享向量空间,i 是 0 或 1,表示两个栈,本算法是退栈操作 El e m T y p e x;i f (i!=0&i!=l)r e t u r n(0);/栈编号错误e l s e s w i t c h (i)c a s e 0:i f (s-t o p 0=-l)r e t u r n(0);栈空e l s e x=s-v s-t o p-;b r e a k;c a s e 1:i f (s-t o p l =m)r e t u r n(0);栈空e l s e x=s-
22、v s-t o p+;b r e a k;d e f a u l t:p r i n t f (栈编号输入错误);r e t u r n(0);)r e t u r n (x);/退栈成功)/算法结束El e m T y p e t o p (t w o s t a c k *s,i n t i)/两栈共享向量空间,i 是 0 或 L 表示两个栈,本算法是取栈顶元素操作 El e m T y p e x;s w i t c h (i)c a s e 0:i f (s-t o p 0=-l)r e t u r n(0);栈空e l s e x=s-v s-t o p ;b r e a k;c a
23、 s e 1:i f (s-t o p l =m)r e t u r n(0);/栈空e l s e x=s-v s-t o p ;b r e a k;d e f a u l t:p r i n t f (栈编号输入错误);r e t u r n(0);)r e t u r n (x);/取栈顶元素成功 /算法结束3.6v o i d A c k e r m a n(i n t m,i n t n)/A c k e r m a n 函数的递归算法 i f (m=0)r e t u r n(n+1);e l s e i f (m!=0&n=0)r e t u r n (A c k e r m a
24、 n (m-l,1);e l s e r e t u r n(A c k e r m a n(m-1,A c k e r m a n(m,n-l)/算法结束3.7(1)l i n k l i s t *i n i t(l i n k l i s t *q)/q是以带头结点的循环链表表示的队列的尾指针,本算法将队列置空 q 二(l i n k l i s t *)m a l l o c(s i z e o f (l i n k l i s t);申请空间,不判断空间溢出q-n e x t=q;r e t u r n (q);/算法结束(2)l i n k l i s t *e n q u e u
25、 e(l i n k l i s t *q,El e m T y p e x)/q 是以带头结点的循环链表表示的队列的尾指针,本算法将元素x入队 s=(l i n k l i s t *)m a l l o c(s i z e o f (l i n k l i s t);申请空间,不判断空间溢出s-n e x t=q-n e x t;/将元素结点s入队列q-n e x t=s;q=s;/修改队尾指针return(q);/算法结束(3)linklist*delqueue(linklist*q)/q是以带头结点的循环链表表示的队列的尾指针,这是出队算法 if(q=q-next)return(nul
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构用C语言描述 数据结构 语言 描述 课后 习题 答案
限制150内