《数据结构与算法(C语言版)》课后习题答案.pdf
《《数据结构与算法(C语言版)》课后习题答案.pdf》由会员分享,可在线阅读,更多相关《《数据结构与算法(C语言版)》课后习题答案.pdf(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、课 后 习 题 答 案 模 块 1数 据 结 构 概 述 一、填 空 题 1、数 据 元 素 2、数 据 项 3、集 合 结 构、线 性 结 构、树 型 结 构、图 形 结 构 4、顺 序 存 储、链 式 存 储 5、有 穷 性、确 定 性、可 行 性、输 入、输 出 二、判 断 题 1、X 2、X 3、X 4、/5、J模 块 2 线 性 表 一、选 择 题 1、A 2,C 3、D 4、C 5、B 6、A 7、A 8、D二、填 空 题 1,(n-1)/22、主 要 是 使 插 入 和 删 除 等 操 作 统 一,在 第 一 个 元 素 之 前 插 入 元 素 和 删 除 第 一 个 结 点 不
2、 必 另 作 判 断。另 外,不 论 链 表 是 否 为 空,链 表 头 指 针 不 变。3、(1)数 据 元 素 的 前 后 顺 序(2)元 素 中 的 指 针 4、(1)顺 序(2)链 式 5、(1)0(1)(2)0(n)6、(1)4(2)27、从 任 一 结 点 出 发 都 可 访 问 到 链 表 中 每 一 个 元 素。8、(1)p-next(2)s-data(3)t9、14410、L-next-next=L三、判 断 题 1、X 2、X 3、X 4、5、M 6、X 7、8,X四、程 序 设 计 题 1、void Insert_SqList(SqList va,int x)/*把 x
3、插 入 递 增 有 序 表 va 中*/int i;if(va.length MAXSIZE)return;for(i=va.length-1;va.elemx&i=0;i一 一)va.elemi+l=va.elem;va.elemi+l=x;va.length+;/*Insert_SqList*/2、【算 法 分 析】比 较 顺 序 表 A 和 B,并 用 返 回 值 表 示 结 果,值 为 1,表 示 A B;值 为 T,表 示*B;值 为 0,表 示 A二 B。1)当 两 个 顺 序 表 可 以 互 相 比 较 时,若 对 应 元 素 不 等,则 返 回 值 为 1或 T;2)当 两 个
4、 顺 序 表 可 以 互 相 比 较 的 部 分 完 全 相 同 时,若 表 长 也 相 同,则 返 回 值 为 0;否 则,哪 个 较 长,哪 个 就 较 大【算 法 源 代 码】int ListComp(SqList A,SqList B)for(i=l;i=A.length&i=B.length;i+)if(A.elem!=B.elem)return A.elemB.elem?l:-l;if(A.length=B.length)return 0;return A.lengthB.length?1:T;/*当 两 个 顺 序 表 可 以 互 相 比 较 的 部 分 完 全 相 同 时,哪
5、个 较 长,哪 个 就 较 大*/*ListComp*/3、【算 法 分 析】1)单 链 表 ha的 头 结 点 作 为 连 接 后 的 链 表 的 头 结 点,即 hc=ha;2)查 找 单 链 表 ha的 最 后 一 个 结 点,由 指 针 p 指 向,即 p-next=NULL;3)将 单 链 表 hb的 首 元 结 点(非 头 结 点)连 接 在 p之 后,即 p-next=hb-next;4)回 收 单 链 表 hb的 头 结 点 空 间【算 法 源 代 码】void ListConcat(LinkList ha,LinkList hb,LinkList*hc)/*把 链 表 hb
6、接 在 ha后 面 形 成 链 表 he*/*hc=ha;p=ha;/*由 指 针 p 指 向 ha的 尾 元 结 点*/p=p-next;p-next=hb-next;free(hb);/*ListConcat*/4、【算 法 分 析】1)生 成 新 结 点 存 放 元 素 b,由 指 针 new指 向;2)将 new插 入 在 单 链 表 的 第 i个 元 素 的 位 置 上:若 i=l,new插 在 链 表 首 部;否 则 查 找 第 i T 个 结 点,由 指 针 P指 向,然 后 将 new插 在 p之 后。【算 法 源 代 码】void Insert(LinkList*L,int
7、i,int b)LinkList new;new=(LinkList*)malloc(sizeof(LNode);new-data=b;if(i=l)/*插 入 在 链 表 头 部*/New-next=*L;*L=new;else/*插 入 在 第 i 个 元 素 的 位 置*/P=*L;while(il)p=p-next;new-next=p-next;p-next=new;/*Insert*/5、【算 法 分 析】1)查 找 最 后 一 个 不 大 于 mink的 元 素 结 点,由 指 针 p指 向;2)如 果 还 有 比 mink更 大 的 元 素,查 找 第 一 个 不 小 于 ma
8、xk的 元 素,由 指 针 q 指 向;3)p-next=q,即 删 除 表 中 所 有 值 大 于 mink且 小 于 maxk的 元 素。【算 法 源 代 码】void Delete_Between(LinkList*L,int mink,int maxk)P=*L;while(p-next-datanext;/*p 是 最 后 一 个 不 大 于 mink的 元 素*/if(p-next)/*如 果 还 有 比 mink更 大 的 元 素*/q=p-next;while(q-datanext;/*q 是 第 一 个 不 小 于 maxk 的 元 素*/p-next=q;)/*Delete
9、_Between*/6、【算 法 务 析】1)初 始 化 指 针 P和 q,分 别 指 向 链 表 中 相 邻 的 两 个 元 素;2)当 p-next不 为 空 时,做 如 下 处 理:若 相 邻 两 元 素 不 相 等 时,P和 q都 向 后 推 一 步;否 则,当 相 邻 元 素 相 等 时,删 除 多 余 元 素。【算 法 源 代 码】void Delete_Equal(LinkList*L)P=(*L)-next;q=p-next;/*p和 q 指 向 相 邻 的 两 个 元 素*/while(p-next)if(p-data!=q-data)/*若 相 邻 两 元 素 不 相 等
10、时,p 和 q 都 向 后 推 一 步*/p=p-next;q=p-next;else while(q-data=p-data)/*当 相 邻 元 素 相 等 时 删 除 多 余 元 素*/r=q;q=q-next;free(r);)p-next=q;p=q;q=p-next;/*else*/*while*/*Delete_Equal*/7、【算 法 分 析】1)空 表 或 长 度 为 1的 表,不 做 任 何 处 理;2)表 长 大 于 2 时,做 如 下 处 理:首 先 将 整 个 链 表 一 分 为 二,即 从 链 表 的 第 一 元 素 结 点 处 断 开;逐 个 地 把 剩 余 链
11、表 的 当 前 元 素 Q插 入 到 链 表 的 头 部。【算 法 源 代 码】void LinkList_reverse(LinkList L)if(!L-next|!L-next-next)return;p=L-next;q=p-next;s=q-next;p-next=NULL;/*从 链 表 的 第 一 元 素 结 点 处 新 开*/while(s-next)q-next=p;p=q;q=s;s=s-next;/*把 L 的 元 素 逐 个 插 入 新 表 表 头*/q-next=p;s-next=q;L-next=s;/*LinkList_reverse*/8、【算 法 分 析】1)
12、初 始 化 指 针 P 指 向 链 表 A 的 当 前 元 素,指 针 q指 向 链 表 B 的 当 前 元 素;2)当 链 表 A 和 B 均 为 结 束 时,做 如 下 处 理:将 B 的 元 素 插 入 若 A 非 空,将 A 的 元 素 插 入 指 针 P 和 q 同 时 后 移【算 法 源 代 码】void mergel(LinkList A,LinkList B,LinkList*C)p=A-next;q=B-next;*C=A;while(p&q)s=p-next;p-next=q;/*将 B 的 元 素 插 入*/if(s)t=q-next;q-next=s;/*若 A 非 空
13、,将 A 的 元 素 插 入*/P=s;q=t;/*指 针 p和 q 同 时 后 移*/Awhile*/*mergel*/9、【算 法 分 析】按 从 小 到 大 的 顺 序 依 次 把 A 和 B 的 元 素 插 入 新 表 的 头 部 pc处,最 后 处 理 A 或 B 的 剩 余 元 素。【算 法 源 代 码】void reverse_merge(LinkList A,LinkList B,LinkList*C)LinkList pa,pb,pre;pa=A-next;pb=B-next;/*pa和 pb分 别 指 向 A 和 B 的 当 前 元 素*/pre=NULL;while(pa
14、|pb)if(pa-datadata|!pb)/*将 A 的 元 素 插 入 新 表*/pc=pa;q=pa-next;pa-next=pre;pa=q;else/*将 B 的 元 素 插 入 新 表*/pc=pb;q=pb-next;pb-next=pre;pb=q;pre=pc;)*C=A;A-next=pc;/*构 造 新 表 头*/*reverse_merge*/10、【算 法 分 析】先 从 B和 C 中 找 出 共 有 元 素,记 为 same,再 在 A 中 从 当 前 位 置 开 始,凡 小 于 same的 元 素 均 保 留(存 到 新 的 位 置),等 于 same的 就
15、跳 过,到 大 于 same时 就 再 找 下 一 个 same。【算 法 源 代 码】void SqList_Intersect_Delete(SqList*A,SqList B,SqList C)i=0;j=0;k=0;m=0;/*i指 示 A 中 元 素 原 来 的 位 置,m 为 移 动 后 的 位 置*/whi le(i(*A).length&jB.length&.kC.length)if(B.elemjC.elemk)k+;else same=B.elemj;/*找 到 了 相 同 元 素 same*/while(B.elemj=same)j+;while(C.elemk=same
16、)k+;/*j 和 k 后 移 到 新 的 元 素*/while(i(*A).length&(*A).elemsame)(*A).elemm+=(*A).elemi+;/*需 保 留 的 元 素 移 动 到 新 位 置*/while(i(*A).length&(*A).elem=same)i+;/*跳 过 相 同 的 元 素*/)/*while*/while(inext!=NULL)/*链 表 不 为 空 表*/p=la-next-next;/*P指 向 第 一 结 点 的 后 继*/la-next-next=NULL;/*直 接 插 入 原 则 认 为 第 一 元 素 有 序,然 后 从 第
17、 二 元 素 起 依 次 插 入*/while(p!=NULL)r=p-next;/*暂 存 p 的 后 继*/q=la;while(q-next!=NULL&q-next-datadata)q=q-next;/*查 找 插 入 位 置*/p-next=q-next;/*将 p 结 点 链 入 链 表*/q-next=p;p=r;12、【算 法 分 析】1)在 双 向 链 表 中 查 找 数 据 值 为 x 的 结 点,由 指 针 p 指 向,若 找 不 到,直 接 返 回,否 则 执 行 第 2 步;2)修 改 x 结 点 的 访 问 频 度 freq,并 将 结 点 从 链 表 上 摘 下
18、;3)顺 结 点 的 前 驱 链 查 找 该 结 点 的 位 置,即 找 到 一 个 结 点 的 访 问 频 度 大 于 x 结 点 的 访 问 频 度,由 指 针 q 指 向;若 q 和 P 不 是 相 邻 结 点,调 整 位 置,把 P 插 在 q之 后。【算 法 源 代 码】DuLNode*Locate_DuList(DuLinkList*L,int x)p=(*L)-next;whi1e(p.data!=x&p!=(*L)p=p-next;if(p=(*L)return NULL;/*没 找 到 x结 点*/p-freq+;p-pre-next=p-next;p-next-pre=p-
19、pre;/*将 x 结 点 从 链 表 上 摘 下*/q=p-pre;whi 1 e(q-freqfreq&p!=(*L)q=q-pre;/*查 找 插 入 位 置*/if(q!=ppre)/*将 x 结 点 插 入*/q-next-pre=p;p-next=q-next;q-next=p;p-preq;/*调 整 位 置*/)return p;/*Locate_DuList*/13、【算 法 分 析】留 下 三 个 链 表 中 公 共 数 据,首 先 查 找 两 表 A 和 B 中 公 共 数 据,再 去 C 中 找 有 无 该 数 据。要 消 除 重 复 元 素,应 记 住 前 驱,要 求
20、 时 间 复 杂 度 0(m+n+p),在 查 找 每 个 链 表 时,指 针 不 能 回 溯。【算 法 源 代 码】LinkList Common(LinkList A,LinkList B,LinkList C)pa=A-next;pb=B-next;pc=C-next;/*pa,pb 和 pc 是 工 作 指 针*/pre=A;while(pa&pb&pc)/*当 三 表 均 不 空 时,查 找 共 同 元 素*/while(pa&pb)if(pa-datadata)/*处 理 pa 结 点,后 移 指 针*/u=pa;pa=pa-next;free(u);)else if(pa-dat
21、a pb-data)pb=pb-next;else if(pa&pb)/*处 理 A和 B 表 元 素 值 相 等 的 结 点*/while(pc&pc-datadata)pc=pc-next;if(pc)if(pc-datapa-data)/*处 理 pa 结 点,后 移 指 针*/u=pa;pa=pa-next;free(u);)elseif(pre=A)/*结 果 表 中 第 一 个 结 点*/pre-next=pa;pre=pa;pa=pa-nextelse if(pre-data=pa-data)/*重 复 结 点 不 链 入 A 表*/u=pa;pa=pa-next;free(u)
22、;elsepre-next=pa;pre=pa;pa=pa-next;/*将 新 结 点 链 入 A 表*/pb=pb-next;pc=pc-next;/*链 表 的 工 作 指 针 后 移*/elseif(pa=NULL)pre-next=NULL;/*若 A 表 已 结 束,置 A 表 表 尾*/else/*处 理 原 A 表 未 到 尾 而 B 或 C 到 尾 的 情 况*/pre-next=NULL;/*置 A 表 表 尾 标 记*/while(pa!=NULL)/*删 除 原 A 表 剩 余 元 素。*/u=pa;pa=pa-next;free(u);)14、【算 法 分 析】本 题
23、 要 求 将 一 个 链 表 分 解 成 两 个 链 表,两 个 链 表 都 要 有 序,两 链 表 建 立 过 程 中 不 得 使 用 malloc申 请 空 间,这 就 是 要 利 用 原 链 表 空 间,随 着 原 链 表 的 分 解,新 建 链 表 旗 之 排 序。【算 法 源 代 码】discreat(LinkList p,LinkList q,LinkList head)p=NULL;q=NULL;/*p和 q链 表 初 始 化 为 空 表*/s=head;while(s!=NULL)r=s-next;/*暂 存 s 的 后 继*/if(s-data%2=0)/*处 理 偶 数*/
24、if(p=NULL)p=s;p-next=NULL;/*第 一 个 偶 数 结 点*/else pre=p;if(pre-datas-data)s-next=pre;p=s;/*插 入 当 前 最 小 值 结 点*/elsewhile(pre-next!=NULL)if(pre-next-datadata)pre=pre-next;/*查 找 插 入 位 置*/s-next=pre-next;/*链 入 结 点*/pre-next=s;else/*处 理 奇 数 链 if(q=NULL)q=s;q-next=NULL;/*第 一 奇 数 结 点*/elsepre=q;if(pre-datas-
25、data)s-next=pre;q=s;/*修 改 头 指 针*/elsewhile(pre-next!=NULL)/*查 找 插 入 位 置*/if(pre-next-datadata)pre=pre-next;s-next=pre-next;/*链 入 结 点*/pre-next=s;/*结 束 奇 数 链 结 点*/s=r;/*s指 向 新 的 待 排 序 结 点*/模 块 3 枝 一、选 择 题 1,B、A、C、C、A 2、B 3、B 4、A 5、C 6、A 7、D 8、C 9、D 10、B二、填 空 题 1、操 作 受 限(或 限 定 仅 在 表 尾 进 行 插 入 和 除 操 作)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构与算法C语言版 数据结构 算法 语言版 课后 习题 答案
限制150内