计专数据结构实验指导书.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《计专数据结构实验指导书.pdf》由会员分享,可在线阅读,更多相关《计专数据结构实验指导书.pdf(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、陕 西 理 工 学 院 重 点 课 程 数 据 结 构 实 验 指 导 书 曹 记 东 李 征 郭 天 印 编 著 计 算 机 科 学 与 技 术 系 2011年 9 月目 录 数 据 结 构 上 机 实 验 的 目 的 和 要 求.1实 验 一 线 性 表 的 插 入 和 删 除.2实 验 二 单 链 表 的 插 入 和 删 除.5实 验 三 栈.9实 验 四 栈 和 队 列.12实 验 五 二 叉 树 操 作.17实 验 六 哈 夫 曼 树 的 应 用.21实 验 七 图 的 遍 历 操 作.28实 验 八 排 序.35实 验 九 查 找.41实 验 十 哈 希 表 设 计.46 数 据
2、结 构 上 机 实 验 的 目 的 和 要 求 通 过 上 机 实 验 加 深 对 课 程 内 容 的 理 解,增 加 感 性 认 识,提 高 软 件 设 计、编 写 及 调 试 程 序 的 能 力。要 求 所 编 的 程 序 能 正 确 运 行,并 提 交 实 验 报 告。实 验 报 告 的 基 本 要 求 为:1、需 求 分 析:陈 述 程 序 设 计 的 任 务,强 调 程 序 要 做 什 么,明 确 规 定:(1)输 入 的 形 式 和 输 出 值 的 范 围;(2)输 出 的 形 式;(3)程 序 所 能 达 到 的 功 能;(4)测 试 数 据:包 括 正 确 的 输 入 输 出
3、结 果 和 错 误 的 输 入 及 输 出 结 果。2、概 要 设 计:说 明 用 到 的 数 据 结 构 定 义、主 程 序 的 流 程 及 各 程 序 模 块 之 间 的 调 用 关 系。3、详 细 设 计:提 交 带 注 释 的 源 程 序 或 者 用 伪 代 码 写 出 每 个 操 作 所 涉 及 的 算 法。4、调 试 分 析:(1)调 试 过 程 中 所 遇 到 的 问 题 及 解 决 方 法;(2)算 法 的 时 空 分 析;(3)经 验 与 体 会。5、用 户 使 用 说 明:说 明 如 何 使 用 你 的 程 序,详 细 列 出 每 一 步 操 作 步 骤。6、测 试 结 果
4、:列 出 对 于 给 定 的 输 入 所 产 生 的 输 出 结 果。若 有 可 能,测 试 随 输 入 规 模 的 增 长 所 用 算 法 的 实 际 运 行 时 间 的 变 化。实 验 一 顺 序 表 的 插 入 和 删 除 一、实 验 目 的 1、掌 握 用 Turbo C 上 机 调 试 线 性 表 的 基 本 方 法;2、掌 握 线 性 表 的 基 本 操 作,插 入、删 除、查 找,以 及 线 性 表 合 并 等 运 算 在 顺 序 存 储 结 构 和 链 接 存 储 结 构 上 的 运 算。二、实 验 内 容 线 性 表 基 本 操 作(插 入、删 除、查 找、合 并)的 实 现
5、 三、程 序 实 现:typedef Null 0;typedef int datatype;#define maxsize 1024;typedef struct datatype datamaxsize;int last;sequenlist;int insert(L,x,i)sequenlist*L;int i;int j;if(*L).last=maxsize-l)printfif“overflow);return Null;else if(i(*L).last+l)printfferror);return Null;)else for(j=(*L).last;j=i-l;j-)(*L
6、).data j4-l=(*L).dataj;(*L).datai-l=x;(*L).last=(*L).last+l;return(l);int delete(L,i)sequenlist*L;int i;int j;if(i(*L).last+l)printf(error);return Null;else forQ=i,j=(*L).last;j+)(*L).dataj-l=(*L).dataj;(*L).data-;fretum(l);void c re atlist()sequenlist*L;int n,i,j;printf(“请 输 入 n 个 数 据 rT);scanf(d”,
7、&n);fbr(i=O;in;i+)printfCMata%d=,9 i);scanf(*L).datai);(*L).last=n-l;fprintout(L)sequenlist*L;int i;for(i=O;i(*L).last;i+)printfC4data%d=,i);printfCt%d,(*L).datai);m a in()sequenlist*L;char cmd;int i,t;c ls c r();printf(i,I.插 入 n);printffd,D 删 除 rT);printff4q,Q退 出 n);do docmd=getchar();while(cmd!=6d
8、,)I I(cmd!=D)I I(cmd!=q,)I I(cm d!=Q)I I(cmd!=i)I I(cmd!=T);switch(cmd)case 6i cr;scanf(&x);scanfi(&i);insert(L,x,i);printout(L);break;case d J D;scanfif&i);delete(L,i);printout L);break;while(cmd!=q)&(cmd!=Q);实 验 二 单 链 表 的 插 入 和 删 除 一、实 验 目 的:了 解 和 掌 握 线 性 表 的 逻 辑 结 构 和 链 式 存 储 结 构,掌 握 单 链 表 的 基 本
9、算 法 及 相 关 的 时 间 性 能 分 析。二、实 验 内 容:单 链 表 的 基 本 操 作 实 现 建 立 一 个 数 据 域 定 义 为 字 符 串 的 单 链 表,在 链 表 中 不 允 许 有 重 复 的 字 符 串;根 据 输 入 的 字 符 串,先 找 到 相 应 的 结 点,后 删 除 之。三、程 序 实 现:#include,stdio.hn#includenstring.hn#includenstdlib.hH#includenctype.hHtypedef struct nodef 定 义 结 点 char data10;结 点 的 数 据 域 为 字 符 串 str
10、uct node*next;ListNode;typedef ListNode*LinkList;LinkList CreatListRl();ListNode*LocateNode();结 点 的 指 针 域/自 定 义 LinkList单 链 表 类 型 函 数,用 尾 插 入 法 建 立 带 头 结 点 的 单 链 表 函 数,按 值 查 找 结 点 void DeleteList();/函 数,删 除 指 定 值 的 结 点 void printlist();void DeleteAll();主 函 数/函 数,打 印 链 表 中 的 所 有 值 函 数,删 除 所 有 结 点,释 放
11、 内 存 void main()printf(H Delete node(y/n):n);输 入“y”或 n”去 选 择 是 否 删 除 结 点 scanf(n%sn,num);if(strcmp(num,nyn)=0|strcmp(num,Yn)=0)char*ch,*num;LinkList head;head=CreatListR 1();用 尾 插 入 法 建 立 单 链 表,返 回 头 指 针 printlist(head);/遍 历 链 表 输 出 其 值printf(uPlease input Delete_data:n);scanf(%s”,ch);输 入 要 删 除 的 字
12、符 串 DeleteList(head,ch);printlist(head);iDeleteAll(head);删 除 所 有 结 点,释 放 内 存)用 尾 插 入 法 建 立 带 头 结 点 的 单 链 表 LinkList CreatListRl(void)(char*ch;LinkList head=(LinkList)malloc(sizeof(ListNode);生 成 头 结 点 ListNode*s,*r,*pp;r=head;r-next=NULL;printf(Input#to end);输 入#”代 表 输 入 结 束 printf(nPlease input Node
13、_data:n);scanf(n%s,1,ch);输 入 各 结 点 的 字 符 串 while(strcmp(ch,n#H)!=O)pp=LocateNode(head,ch);按 值 查 找 结 点,返 回 结 点 指 针 if(pp=NULL)没 有 重 复 的 字 符 串,插 入 到 链 表 中 s=(ListNode*)malloc(sizeof(ListNode);strcpy(s-data,ch);r-next=s;r=s;r-next=NULL;)printf(nInput#to end”);printf(nPlease input Node data:);scanf(H%sn
14、,ch);freturn head;返 回 头 指 针 f 按 值 查 找 结 点,找 到 则 返 回 该 结 点 的 位 置,否 则 返 回 NULL=ListNode*LocateNode(LinkList head,char*key)ListNode*p=head-next;从 开 始 结 点 比 较 while(strcmp(p-data,key)!=0&p)直 到 p 为 NULL 或 p-data 为 key 止 p=p-next;扫 描 下 一 个 结 点 return p;若 p=NULL则 查 找 失 败,否 则 p 指 向 找 到 的 值 为 key的 结 点)/删 除 带
15、 头 结 点 的 单 链 表 中 的 指 定 结 点 void DeleteList(LinkList head,char*key)(ListNode*p,*r,*q=head;p=LocateNode(head,key);按 key 值 查 找 结 点 的 if(p=NULL)若 没 有 找 到 结 点,退 出 printf(nposition error1 1);exit(0);)while(q-next!=p)/p为 要 删 除 的 结 点,q 为 p 的 前 结 点 q=q-next;r=q-next;q-next=r-next;free(r);释 放 结 点)打 印 链 表 void
16、 printlist(LinkList head)(ListNode*p=head-next;从 开 始 结 点 打 印 while(p)printf(n%s,H,p-data);p=p-next;)printf(n);)删 除 所 有 结 点,释 放 空 间 void DeleteAll(LinkList head)ListNode*p=head,*r;while(p-next)r=p-next;free(p);p=r;)free(p);实 验 三 栈 一、实 验 目 的:1.熟 练 掌 握 栈 的 结 构,以 及 这 种 数 据 结 构 的 特 点;2.能 够 在 两 种 存 储 结 构
17、上 实 现 栈 的 基 本 运 算,特 别 注 意 栈 满 和 栈 空 的 判 断 条 件 及 描 述 方 法;二、实 验 内 容:计 算 表 达 式 的 值 计 算 用 运 算 符 后 缀 法 表 示 的 表 达 式 的 值。后 缀 表 达 式 也 称 逆 波 兰 表 达 式,比 中 缀 表 达 式 计 算 起 来 更 方 便 简 单 些,中 缀 表 达 式 要 计 算 就 存 在 着 括 号 的 匹 配 问 题,所 以 在 计 算 表 达 式 值 时 一 般 都 是 先 转 换 成 后 缀 表 达 式,再 用 后 缀 法 计 算 表 达 式 的 值。如:表 达 式(a+b*c)/d-e用
18、后 缀 法 表 示 应 为 abc*+d/e-。只 考 虑 四 则 算 术 运 算,且 假 设 输 入 的 操 作 数 均 为 1位 十 进 制 数(0 9),并 且 输 入 的 后 缀 形 式 表 达 式 不 含 语 法 错 误。三、程 序 实 现:#include#define add 43#define subs 45#define mult 42#define div 47 运 算 符 加 号+的 A SC II码 运 算 符 减 号 的 A SC II码/运 算 符 乘 号*的 A SC II码 运 算 符 除 号/的 A SC II码#define MAXSIZE 100typed
19、ef struct int stkdataMAXSIZE;用 数 组 来 表 示 栈 空 间,定 义 长 度 为 M AXSIZE的 堆 栈 int top;/栈 顶 JSTKzone;typedef STKzone*STK;typedef enumtrue=l,false=O bool;typedef enum ok,error status;STKzone expSTKzone;STK expSTK;STK initSTK(STKzone*stack_zone)执 行 栈 初 始 化,建 栈 指 针 7S T K p;p=stack_zone;p-top=0;status push(int
20、*term,STK pstk)将 一 结 构 型 数 据 送 入 栈 中 if(pstk-top=M AX SIZE)return error;栈 满,进 栈 失 败 pstk-stkdatapstk-top=*term;(pstk-top)-H-;栈 顶 指 针 移 动 return ok;/pushbool emptySTK(STK pstk)判 断 栈 是 否 为 空 栈 retum(pstk-top=0);)status pop(int*pdata,STK pstk)/从 栈 中 取 出 一 结 构 型 数 据 if(emptySTK(pstk)return error;(pstk-t
21、op);退 栈*pdata=pstk-stkdatapstk-top;return ok;void synerror()printf(un表 达 式 语 法 错!”);exit();)int eval(char tag,int al,int a2)switch(tag)case add:return(al+a2);case subs:retum(al-a2);case mult:return(a 1*a2);case div:return(al/a2);f)main()char c;int opd 1,opd2,temp,c 1;expSTK=initSTK(&expSTKzone);prin
22、tf(Hn后 置 表 达 式:”);whi le(c=getchar()!=,n,)if(c=*)continue;if(c47)&(c58)判 断 是 否 是 09 的 字 符 putchar(c);cl=c-48;把 输 入 的 字 符 型 数 字 转 换 成 数 字 if(push(&c 1,expSTK)=error)/运 算 分 量 进 栈 printsn表 达 式 太 长 n);exit();else if(c=add)1 1(c=subs)1 1(c=muIt)|(c=div)putchar(c);if(pop(&opdl,expST2=eiror)将 运 算 量 1 出 栈 s
23、ynerror();if(pop(&opd2,expSTK)=error)将 运 算 量 2 出 栈 synerror();temp=eval(c,opd2,opd 1);计 算 得 到 结 果 push(&temp,expSTK);将 运 算 结 果 进 栈)else synerror();出 现 非 法 字 符/whileif(pop(&opd 1,expSTK)=error)synerror();if(!(emptySTK(expSTK)synerror();printf(c-%-3dn,opd 1);/main_end实 验 四 栈 和 队 列 一、实 验 目 的:1.掌 握 队 列
24、和 栈 的 顺 序 存 储 结 构 和 链 式 结 构,以 便 在 实 际 背 景 下 灵 活 运 用。2.掌 握 栈 和 队 列 的 特 点,即 先 进 后 出 与 先 进 先 出 的 原 则。二、实 验 内 容:停 车 场 管 理 根 据 题 目 要 求,停 车 场 只 有 一 个 大 门,因 此 可 用 一 个 栈 来 模 拟;而 当 栈 满 后,继 续 来 的 车 辆 只 能 停 在 便 道 上,根 据 便 道 停 车 的 特 点,可 知 这 可 以 用 一 个 队 列 来 模 拟,安 排 队 的 车 辆 先 离 开 便 道,进 入 停 车 场。由 于 在 停 车 场 中 间 的 车
25、辆 可 以 提 出 离 开 停 车 场,而 且 要 求 在 离 开 车 辆 到 停 车 场 大 门 之 间 的 车 辆 都 必 须 先 离 开 停 车 场,让 此 车 离 去,然 后 再 让 这 些 车 辆 依 原 来 的 次 序 进 入 停 车 场,因 此 在 一 个 栈 和 一 个 队 列 的 基 础 上,还 需 要 有 一 个 地 方 保 存 为 了 让 路 离 开 停 车 场 的 车 辆,很 显 然 这 也 应 该 用 一 个 栈 来 模 拟。因 此 本 题 中 用 到 两 个 栈 和 一 个 队 列。对 于 停 车 场 和 车 辆 规 避 所,有 车 辆 进 入 和 车 辆 离 去
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 指导书
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内