识别广义表的头尾 武汉理工大学 数据结构课程设计
武汉理工大学信息工程学院数据结构ppt课件ch0-C语言

如何在ch0_bigint2.c中添加编写减法功能?
数据结构讲义 第0章 C语言
信息工程学院 魏洪涛
Email:
何谓计算机高手
能打字、上网、文字处理。 能进行软硬件管理、配置、排错。 能编写程序。 能分清用户、设计者、ቤተ መጻሕፍቲ ባይዱ序员、编程工具、
操作系统、硬件之间的关系。 能体会到数据结构的作用。 能体会到离散数学的作用。 能体会到数学的作用。
C语言
数据类型
– C语言为什么要有数据类型?
运算符与表达式
– 赋值表达式左边和右边的变量所代表的意义?
流程控制:顺序、选择、循环 函数、函数参数传递、递归调用 数组、结构体、指针 文件
例1 数组
例2 指针(长整数)
例3 递归
右下左上
例4 迷宫求解
作业
阅读并改进程序ch0_bigint2.c,如果结果 的第一个字符为“0”,则去掉它。
广义表的头尾链表表示及算法的实现

广义表的头尾链表表示及算法的实现
钟治初
【期刊名称】《信息技术》
【年(卷),期】2009(000)006
【摘要】讨论了广义表的头尾链表存储表示及相关算法的实现,包括广义表的建立、输出、销毁、复制、求表头、求表尾、计算深度等算法的实现.
【总页数】2页(P157-158)
【作者】钟治初
【作者单位】嘉应学院计算机系,梅州,514015
【正文语种】中文
【中图分类】TP311.12
【相关文献】
1.广义表的二叉链式存储表示及其算法设计研究 [J], 赵永虹
2.基于对称边双循环链表的三角格网表示与实现 [J], 孟亮;方金云;韩承德
3.广义表的二叉链式存储表示及其算法设计 [J], 陈海山;吴芸
4.在单链表上实现一元多项式的表示和相加 [J], 张绍兵;季厌浮
5.多元多项式布尔函数的链表表示及实现 [J], 陈逢林;胡永模
因版权原因,仅展示原文概要,查看原文内容请购买。
广义表课程设计

广义表课程设计一、教学目标本课程的教学目标是使学生掌握广义表的基本概念、性质和操作算法,培养学生运用广义表解决实际问题的能力。
具体目标如下:1.知识目标:(1)了解广义表的定义、基本性质和运算规则;(2)掌握广义表的深度和长度概念,并能运用其判断和计算;(3)熟悉广义表的递归表示方法,理解递归的含义和应用;(4)掌握广义表的扩展运算,包括表的展开、逆序、求幂等;(5)了解广义表在计算机科学中的应用领域。
2.技能目标:(1)能够运用广义表表示和处理各种数据结构;(2)能够运用广义表解决实际问题,如编程实现递归算法;(3)能够运用广义表对算法进行优化和改进。
3.情感态度价值观目标:(1)培养学生的抽象思维能力,提高解决问题的综合素质;(2)培养学生勇于探索、创新的精神,培养合作意识;(3)使学生认识到广义表在计算机科学中的重要性,激发学生对计算机科学的热爱。
二、教学内容本课程的教学内容主要包括广义表的基本概念、性质和操作算法。
具体安排如下:1.第一章:广义表的基本概念,介绍广义表的定义、特点和表示方法;2.第二章:广义表的性质,包括广义表的长度、深度、递归表示等;3.第三章:广义表的运算,包括表的展开、逆序、求幂等操作;4.第四章:广义表的应用,介绍广义表在计算机科学中的应用领域和实例。
三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:通过教师的讲解,使学生掌握广义表的基本概念和性质;2.讨论法:引导学生分组讨论广义表的运算规则和应用实例,培养学生的合作意识;3.案例分析法:分析广义表在计算机科学中的应用实例,使学生了解广义表的实际价值;4.实验法:安排上机实验,让学生动手实践广义表的操作,提高学生的实际编程能力。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。
1.教材:选用《计算机科学基础》系列教材,为学生提供系统、科学的学习资源;2.参考书:推荐《广义表论》等参考书籍,丰富学生的知识体系;3.多媒体资料:制作课件、教学视频等,以图文并茂的形式呈现教学内容;4.实验设备:提供计算机实验室,让学生进行上机实验,提高实际操作能力。
数据结构广义表

{ printf("("); /*输出'('*/
if (g->val.sublist==NULL) printf(""); /*输出空子表*/
else DispGL(g->val.sublist); /*递归输出子表*/
}
else printf("%c", g->val.data); /*为原子时输出元素值*/
假如把每个表旳名字(若有旳话)写在其表旳前面,则 上面旳5个广义表可相应地体现如下:
A()
B(e)
C(a,(b,c,d))
D(A(),B(e),C(a,(b,c,d)))
E((a,(a,b),((a,b),c)))
若用圆圈和方框分别体现表和单元素,并用线段把表 和它旳元素(元素结点应在其表结点旳下方)连接起来,则 可得到一种广义表旳图形体现。例如,上面五个广义表 旳图形体现如下图所示。
A() B(e) C(a,(b,c,d)) D(A(),B(e),C(a,(b,c,d))) E((a,(a,b),((a,b),c)))
AB e
C A
a b cd
D BC
ea b cd
E
a
ab
c
ab
8.2 广义表旳存储构造
广义表是一种递归旳数据构造,所以极 难为每个广义表分配固定大小旳存储空间,所
GLNode *CreatGL(char *&s)
{ GLNode *h;char ch=*s++; /*取一种扫描字符*/
if (ch!='\0')
/*串未结束判断*/
{ h=(GLNode *)malloc(sizeof(GLNode));/*创建新结点*/
《数据结构》实验1

《数据结构》实验1《数据结构与算法》第1次实验题目及要求实验一:线性表、队列与栈及其操作算法一、实验内容1.建立包括头结点和3个结点(4,2,1)的单链表,实现单链表建立、插入、删除和顺序查找等基本操作。
2.编程用一维数组来模拟一个栈,实现入栈和出栈操作,解决括号匹配问题。
3.编程用一维数组来模拟一个队列,实现入队列和出队列操作,解决杨辉三角问题。
二、实验要求1.掌握单链表的各种运算(表内结点的插入﹑删除,输出单链表等)。
2.掌握栈的结构和算法应用。
3.掌握队列的结构和算法应用。
三、实验报告要求实验报告使用教务处统一印制的《武汉理工大学学生实验报告书》,主要包括:1) 实验预习报告:主要包括下列内容:[1] 实验目的和意义。
[2] 问题描述:包括目标、任务、条件和约束的描述。
[3] 实验原理与方法:阐述所使用的方案的工作原理。
[4] 实验方案和技术路线,包括:数据结构设计和核心算法设计描述、主模块及功能模块层次结构、主要功能模块的输入、输出和算法框架描述、功能模块之间的调用与被调用关系等内容。
2) 实验过程记录:主要包括下列内容:[1] 上机实验的调试过程,包括编译时出现的错误信息、错误分析、解决方法和解决过程。
[2] 上机实验的测试过程,包括测试范例,测试结果,测试结果的分析与讨论,测试过程中遇到的主要问题及所采用的解决措施。
[3] 软件使用说明:主要描述如何使用你的程序以及使用时的主要事项。
[4] 实验输出结果。
3) 结果与讨论:主要包括下列内容:[1] 实验结果分析:对本次实验进行分析和评价。
[2] 小结、建议和体会:说明程序的改进思想、经验和体会。
[3] 思考题:回答教师布置的讨论题。
[4] 程序清单:根据教师的要求,以电子文档形式或者打印附件形式提交所设计的程序清单。
要求:1、用Visual C++ 上机编程,请预习VC++软件;2、本要求适用后面两个实验;3、请同学们做实验时把课本带来,需要借助书上的例子;4、不能在课堂上完成的,自己课后完成,然后将课后完成的结果运行给老师看。
武汉理工大学数据结构课程设计

学号:课程设计题目链式简单选择排序学院计算机科学与技术学院专业班级姓名LDSD指导教师耿枫2013 年7 月 2 日课程设计任务书学生姓名: LDSD 专业班级:指导教师:耿枫工作单位:计算机科学与技术学院题目:链式简单选择排序初始条件:试写一个程序,以单链表作为存储结构,实现简单选择排序。
1、课程设计报告中应有你的算法的时间复杂度分析;2、测试用例自己设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1、问题描述简述题目要解决的问题是什么。
2、设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4、经验和体会(包括对算法改进的设想)5、附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。
时间安排:1、第20周(6月29日至7月3日)完成。
2、7月3 日8:00到计算中心检查程序、交课程设计报告、源程序(CD盘)。
指导教师签名:年月日系主任(或责任教师)签名:年月日目录1.课程设计问题描述及开发工具........................................... - 4 -1.1 课程设计问题描述................................................ - 4 -1.2 开发工具........................................................ - 4 - 2.程序设计............................................................. - 4 -2.1思想描述......................................................... - 4 -2.2存储结构设计..................................................... - 6 -2.3 主要算法设计.................................................... - 6 -2.3.1 链表的创建................................................. - 6 -2.3.2随机数据产生函数........................................... - 7 -2.3.3链式简单排序............................................... - 8 -2.3.4词法分析................................................... - 9 - 3.程序调试过程问题与改正............................................... - 9 - 4.运行结果及说明...................................................... - 10 -4.1以随机方式创建链表.............................................. - 10 -4.2 用户自己写入数据............................................... - 11 -4.3 比较三组不同输入数据的排序..................................... - 11 - 5.时间复杂度分析...................................................... - 13 - 6.经验与体会.......................................................... - 14 - 7.课程设计源程序...................................................... - 14 -链式简单选择排序链式简单选择排序主要涉及到数据结构中链表和排序两个知识点,其中,链表的知识又涉及创建、插入、遍历等。
数据结构实验:广义表

广义表实验:广义表基本操作实现实验目的:1、熟悉的存储方式;2、通过实验,深入理解递归以及广义表中的递归实现;实验要求:1、在vc++或tc环境下实现基本功能;2、先完成基本功能,基本功能为必做内容,有多余时间的同学可以做选做的内容;3、独自完成实验操作,并给出相关的数据;4、每次实验后,撰写实验报告,并在下星期一由学习委员收集并按学号整理好后,交任课教师。
实验内容及步骤:必做题:1、由字符串构建一个广义表;2、输出该广义表;3、求广义表的长度和深度;选做:1、求广义表的表头、表尾;2、输出广义表的所有的原子,并求该广义表中的最大原子;附:程序可以使用参考的,更提倡自己编写,使用参考程序的同学把函数的功能读懂,并用实例去走一遍。
参考程序:#include"stdio.h"#include"malloc.h"typedef char elemtype;typedef struct lnode{int tag;union{elemtype data;struct lnode *sublist;}val;struct lnode *link;}glnode;glnode *creatgl(char *&s){glnode *h;char ch;ch=*s;s++;if(ch!='\0'){h=(glnode *)malloc(sizeof(glnode));if(ch=='('){h->tag=1;h->val.sublist=creatgl(s);}else if(ch==')')h=NULL;else{h->tag=0;h->val.data=ch;}}else h=NULL;ch=*s;s++;if(h!=NULL)if(ch==',')h->link=creatgl(s);elseh->link=NULL;return h;}int gllength(glnode *g) {int n=0;g=g->val.sublist;while(g){n++;g=g->link;}return n;}int gldepth(glnode *g) {int max=0,dep;if(g->tag==0)return 0;g=g->val.sublist;if(g==NULL)return 1;while(g){if(g->tag==1){dep=gldepth(g);if(dep>max)max=dep;}g=g->link;}return(max+1);}void dispgl(glnode *g){if(g){if(g->tag==1){printf("(");if(g->val.sublist==NULL)printf("");elsedispgl(g->val.sublist);}elseprintf("%c",g->val.data);if(g->tag==1)printf(")");if(g->link){printf(",");dispgl(g->link);}}}void main(){glnode *g;char *s="(a,(b,c),d,(e,(f,g)))";g=creatgl(s);printf("输出广义表g:");dispgl(g);printf("\n");printf("输出广义表g的长度:");printf("%d\n",gllength(g));printf("输出广义表g的深度:");printf("%d\n",gldepth(g));}。
数据结构课程设计 广义表的运算

《数据结构》课程设计题目:广义表的运算广义表是线性表的推广。
线性表的元素仅限于原子项。
广义表的元素或者是原子,或者是一个广义表,有其自身结构。
广义表通常用圆括号括起来,用逗号分隔其中的元素。
为了区分原子和广义表,书写时用大写字母表示广义表,用小写字母表示原子。
LS=(a1,a2,…,an),LS是广义表的名字,n为它的长度,若ai是广义表,则称它为LS的子表。
若广义表非空(n>=1),则a1是LS的表头,其余元素组成的表(a2,…,an)称为LS的表尾。
一个表展开后所含括号的层数称为广义表的深度。
本设计要求实现广义表的建立、查找、输出、取表头、取表尾及求深度等运算。
选择合适的存储结构表示广义表,并能实现下列运算要求:(1)用大写字母表示广义表,用小写字母表示原子,并提供设置广义表的值的功能。
(2)取广义表L的表头和表尾的函数head(L)和tail(L)。
(3)能用这两个函数的复合形式求出广义表中的指定元素。
(4)由广义表的字符串形式到广义表的转换函数Lists Str_ToLists_(S);例如Str_ToLists_(“ (a,(a,b),c)”)的值为一个广义表。
(5)由广义表到广义表的字符串形式的转换函数char * Lists_To_Str(L)。
(6)最好能设置多个广义表。
解:本题的解法如下:1算法设计1.由于广义表(a1,a2,…,an)中的数据元素可以具有不同的结构(或是原子或是列表)因此难以用顺序存储结构表示,通常采取链式存储结构,每个元素都可以用一个结点表示。
一个表结点可由3个域组成:标志域,指针表头的指针域和指针表尾的指针域;而原子结点只需两个域:标志域和值域。
2.假设以字符串L=(a1,a2,…,an) 的形式定义广义表L,建立相应的存储结构。
对广义表进行的操作下递归定义时,可以有两种方法。
一种是把广义表分解成表头和表尾两部分;另一种是把广义表堪称含有n个并列子表(假设原子也视作子表)的表。
武汉理工大学数据结构与算法综合实验图与景区信息管理系统

学生学号Xxxx 实验课成绩
学生实验报告书
实验课程名称数据结构与算法综合实验开课学院计算机科学与技术学院指导教师姓名xxx
学生姓名xxx
学生专业班级xxxx
2015-- 2016学年第 2 学期
实验课程名称:数据结构与算法综合实验
2.综合分析和结论
由于上一次的哈夫曼树没有写成功所以我回去以后有好好学习了一下数据结构,本次实验也比第一次有了经验了,通过和视频的学习我本次把实验全都做出来了。
但在实现的过程中对算法的理解还不够透彻,有待提高。
第三部分:实验小结、收获与体会
通过本次试验,我进一步掌握了有关图的相关算法,也对数据结构在实际编程的应用中有了进一步的了解,也对深度优先搜索、迪杰斯特拉、普里姆算法有了进一步的了解。
同时,我也发现自己对于图的有关知识掌握的还远远不够,对于一些算法还不能熟练应用于编程中,所以,在以后的学习中,要多编程,以提高自己的动手编程能力。
武汉理工大学数据结构课程设计排序算法比较

课程设计课程名称数据结构题目排序码的比较次数、记录移动次数的定量分析学院计算机科学与技术学院专业软件工程班级姓名指导教师李晓红2013 年12 月24 日课程设计任务书学生姓名:专业班级:指导教师:李晓红工作单位:计算机科学与技术学院题目: 排序码比较次数、记录移动次数的定量分析初始条件:理论:学习了《数据结构》课程,掌握了一种计算机高级语言。
实践:计算机技术系实验中心提供计算机及软件开发环境。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能:(1)选择书中3~5个排序算法,对它们稍作修改,即在算法中插入关于排序码比较次数和元素移动次数的统计语句。
用修改后的排序算法对同一个随机数序分别进行排序,统计排序过程中排序码的比较次数和元素的移动次数。
(2)至少分析5组排序码。
每组排序码由键盘输入或者随机函数产生。
2、数据结构设计;3、主要算法设计;4、编程及上机实现;5、撰写课程设计报告,包括:(1)设计题目;(2)摘要和关键字(中文和英文);(3)正文,包括引言、需求分析、数据结构设计、算法设计、有关技术的讨论、设计体会等;(4)结束语;(5)参考文献。
时间安排:2013年12月16日-25日12月19日查阅资料12月20日确定功能和功能结构,数据结构设计,功能模块的算法设计12月21—22日编程并上机调试12月23日撰写报告12月24日验收程序,提交设计报告书。
指导老师:年月日目录摘要和关键字 (4)Abstract (5)1引言 (6)2需求分析 (7)2.1基础分析 (7)2.2功能分析 (7)3数据结构设计 (8)3.1头文件 (8)3.2结构体定义 (8)3.3功能函数的声明 (8)3.4主函数 (8)4算法设计 (10)4.1定义结构体 (10)4.2输入函数 (10)4.3输出函数 (11)4.4直接插入排序 (11)4.5 拆半插入排序 (12)4.6简单选择排序 (13)4.7冒泡排序 (14)4.8快速排序 (14)5运行结果 (16)5.1初始界面 (16)5.2第一次排序 (16)5.3第二次排序 (17)5.4第三次排序 (19)5.5第四次排序 (20)5.6第五次排序 (21)5.7退出界面 (23)6有关技术的讨论 (24)7设计体会 (25)结束语 (26)附:参考文献 (26)摘要:本程序的主要功能是排序码比较次数、记录移动次数的定量分析。
数据结构课程设计广义表的操作需求分析

2.广义表的查找
• 要求输入为单个字符,若存在则系统显示: 查找元素存在,反之显示查找元素不存在。
3.广义表的输出
• 对于给定的广义表依序输出其中元素,输 出包括大小写字母,空格字符,圆括号和 逗号。
ห้องสมุดไป่ตู้.广义表求表头
• 输出广义表的表头即第一个元素,若是表 则输出该表。
5.广义表取表尾
• 输出广义表的表尾即最后一个元素,若是 表则输出该表。
• 显示:广义表的深度是:2
• 7.广义表逆序输出
• 显示:(g,f,(c,d,e),(a,b))
• 8.广义表的插入操作
• 显示:输入插入数据:(h,i) • 输出广义表:((h,i)g,f,(c,d, e),(a,b))
• 9.广义表的删除操作
• 输入删除数据:f • 输出广义表:((h,i)g,(c,d,e), (a,b))
• 输入广义表如下:
• ((a,b),(c,d,e),f,g)
• 输入需要查找数据:d • 则显示存在此数据
• 输入:i • 则显示不存在此数据
• 3.输出广义表:
• 显示:((a,b),(c,d,e),f,g)
• 4.广义表取表尾 • 显示:g
• 5.广义表取表头 • 显示:(a,b)
• 6.广义表求深度
6.广义表求深度
• 若为空表则返回1;若不为空,设Depth为 任意子表的深度,输出Depth的最大值
7.求广义表的逆表
• 将广义表逆序输出
8.广义表的插入
• 在广义表表头中插入所需数据,数据可包 括单个数据元素和表
9.广义表的删除
• 删除广义表中某数据,数据包括单个数据 元素和表
测试数据
数据结构广义表课程设计

数据结构广义表课程设计。
一、课程目标知识目标:1. 理解广义表的基本概念,掌握广义表的定义及表示方法;2. 学会使用线性表、链表等数据结构实现广义表的基本操作;3. 了解广义表在实际应用中的优势及其与其他数据结构的关系。
技能目标:1. 能够运用所学知识编写程序实现广义表的创建、插入、删除等基本操作;2. 能够分析并解决使用广义表过程中遇到的问题,如存储空间的优化、操作的效率等;3. 能够运用广义表解决实际问题,如表达式的求值、图的邻接表表示等。
情感态度价值观目标:1. 培养学生面对复杂问题时的分析、解决问题能力,增强自信心;2. 培养学生的团队协作精神,学会与他人共同探讨、研究问题;3. 激发学生对数据结构及其应用的兴趣,认识到数据结构在计算机科学中的重要性。
本课程针对高中年级学生,充分考虑学生的认知水平、学习兴趣和实际需求,结合课程性质和教学要求,制定具体、可衡量的学习目标。
通过本课程的学习,学生将能够掌握广义表的相关知识,提高编程能力和解决问题的能力,培养良好的情感态度价值观。
二、教学内容本章节教学内容主要包括以下几部分:1. 广义表的基本概念:广义表的定义、特点及其与线性表、链表等数据结构的区别与联系;2. 广义表的表示方法:顺序存储结构、链式存储结构及其优缺点分析;3. 广义表的基本操作:创建、插入、删除、查找等操作的具体实现方法;4. 广义表的应用实例:表达式求值、图的邻接表表示等;5. 存储空间优化及操作效率分析。
教学大纲安排如下:1. 引言及广义表基本概念(1课时);2. 广义表的表示方法及存储结构(1课时);3. 广义表的基本操作实现(2课时);4. 广义表的应用实例分析(1课时);5. 存储空间优化及操作效率分析(1课时)。
教学内容与教材关联性如下:1. 教材第二章“线性表”中链表部分为广义表的链式存储结构奠定了基础;2. 教材第五章“树与二叉树”中树的结构与广义表具有相似性,为学生理解广义表提供参考;3. 教材第八章“图”中图的邻接表表示可运用广义表进行实现。
识别广义表的头尾 武汉理工大学 数据结构课程设计

/***************************************************************/ typedef struct GLNode //广义表结点定义
1
{ int tag; //表结点类型 (tag=0 表示原子结点,tag=1 表示表结点) union { char data; struct { struct GLNode *hr,*tr;}; //hr 为表头指针 tr 为表尾指针 }; }*GList; /**************************************************************/ tag=1 hr 表结点 tag=0 data 原子结点 tr
2
void creatlist(GList &Ls ) //创建广义表 { char c; c=getchar(); //拾取一个合法字符 if(c==' ') //空表的情况 { Ls=NULL; c=getchar(); if(c!=')') return ; //空表的下一个合法字符应该是')' } else { //当前输入的广义表非空 GList p; Ls=new GLNode; Ls->tag =1; //表结点 if(c!='(') //表头为单原子 { Ls->hr =new GLNode; p=Ls->hr; p->tag =0; p->data=c; //建立原子结点 } else { // 表头为广义表 creatlist(Ls->hr); // 对此广义表递归建立存储结构 } c=getchar(); if (c==',') creatlist(Ls->tr); //当前广义表未结束,等待输入下一个子表 else if (c==')') Ls->tr =NULL; //当前广义表输入结束 } } /*****************************************************************/ 广义表是采用递归的方式定义的,因此 creatlist( )中广义表也是采用递归的 方式建立的。 主要思想: 由于广义表的第一个字符“ (”在 main( )函数中已被读取,因此 creatlist( ) 中从键盘数据缓冲区读取的第一个字符是所输入的广义表的第二个字符。 若当层 广义表非空,则应建立表结点。在建立原子结点时所用的判断方法为 if(c!=’(’) 是 因为“,”之后的字符要么是“ (” ,要么是原子。在经过代码 : if (c==',') creatlist(Ls->tr); , 递归建立的广义表的读取的第一个字符只能是原子 或者“(” ,而不可能是“,” ,因此建立原子结点的判断方法为 if(c!=’(’)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//义表,i 为括号计数器
同 creatlist( )函数一样,printf_GL( )并不能单独输出完整的已存储的广义表, 它需要与 main( )函数中的第二部分相结合才能共同完成广义表的输出。 printf_GL( )在 main( )中调用方式如下: /*******************************************************/ if(!Ls) cout<<"( )"; // Ls 指向空表 else { cout<<"("; // 广义表第一个字符为“ (” int i=1; //已有左括号,故 i=1 printf_GL(Ls,i); } /********************************************************/
GList p=Ls->hr; if(!p) //空表 { cout<<"( )"; } else { if(p->tag==1) //p 指向表结点 { cout<<"("; i++; printf_GL(p,i); } else if(p->tag ==0) { GL_Elem(p); //若 p 指向原子结点则输出原子 } } GList k=Ls->tr; //表结点的尾指针 if(k) { cout<<","; //尾指针存在表示此表中还有元素 printf_GL(k,i); // 遍历下一结点 } else if(!k&&i) { cout<<")"; i--; } } /***************************************************************/ printf_GL( )是一个递归函数。广义表的输出的两个关键问题:一是在何时输 出“ (” ,何时输出原子;二是在何时输出“) ” ,何时输出“, ” 。
2
void creatlist(GList &Ls ) //创建广义表 { char c; c=getchar(); //拾取一个合法字符 if(c==' ') //空表的情况 { Ls=NULL; c=getchar(); if(c!=')') return ; //空表的下一个合法字符应该是')' } else { //当前输入的广义表非空 GList p; Ls=new GLNode; Ls->tag =1; //表结点 if(c!='(') //表头为单原子 { Ls->hr =new GLNode; p=Ls->hr; p->tag =0; p->data=c; //建立原子结点 } else { // 表头为广义表 creatlist(Ls->hr); // 对此广义表递归建立存储结构 } c=getchar(); if (c==',') creatlist(Ls->tr); //当前广义表未结束,等待输入下一个子表 else if (c==')') Ls->tr =NULL; //当前广义表输入结束 } } /*****************************************************************/ 广义表是采用递归的方式定义的,因此 creatlist( )中广义表也是采用递归的 方式建立的。 主要思想: 由于广义表的第一个字符“ (”在 main( )函数中已被读取,因此 creatlist( ) 中从键盘数据缓冲区读取的第一个字符是所输入的广义表的第二个字符。 若当层 广义表非空,则应建立表结点。在建立原子结点时所用的判断方法为 if(c!=’(’) 是 因为“,”之后的字符要么是“ (” ,要么是原子。在经过代码 : if (c==',') creatlist(Ls->tr); , 递归建立的广义表的读取的第一个字符只能是原子 或者“(” ,而不可能是“,” ,因此建立原子结点的判断方法为 if(c!=’(’)。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写
等具体要求) 课程设计报告按学校规定格式用 A4 纸打印(书写),并应包含如下内容: 1、 问题描述 简述题目要解决的问题是什么。 2、 设计 存储结构设计、主要算法设计(用类 C 语言或用框图描述)、测试用例设计; 3、 调试报告 调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。 4、 经验和体会(包括对算法改进的设想) 5、 附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行 结果要包含这些测试数据和运行输出, 6、 设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为 0 分。
设计
存储结构:
广义表的存储结构采用的是链式存储结构, 每个数据元素可用一个节点表示。 由于列表中的数据元素可能为原子或列表,由此需要两种结点:原子结点和表结 点。前者用于表示原子,后者用于表示列表,一个表结点可由 3 个域组成:标志 域、指示表头的指针域和指示表尾的指针域;而原子结点只需要两个域:标志域 和值域。 广义表的存储结构定义形式为(c++) :
3
当 getchar( )读取的字符为“(”时,表示要进入下一层广义表,故使用语句 creatlist(Ls->hr); 递归建立下一层广义表。 当 getchar( )读取的字符为“,”时,表示当层广义表未结束,还有子表需要 建立,故用 creatlist(Ls->tr); 递归建立剩余的子表。 当 getchar( )读取的字符为“)”时,表示当层广义表已结束,则表结点的表尾 指针应为空,即 Ls->tr =NULL; 缺点:函数 creatlist( )的纠错能力较差,要求输入的广义表应为广义表的标 准正确形式,如(a,b,(a,1,(d,3,4))) ,如果输入的形式错误,如:(s,d(,o)) 就会造成 整个程序无法运行下去。
主要算法:
程序主体由几个关键函数组成:creatlist(GList &Ls )、GL_Elem(GList p)、 printf_GL(GList Ls,int &i)、 GetHead(GList &Ls)、 GetTail(GList &Ls)、 Get_HT(GList Ls) 以及 main()函数中的三个部分,下面将对这些函数一一介绍。 (1)creatlist(GList &Ls )
/***************************************************************/ typedef struct GLNode //广义表结点定义
1
{ int tag; //表结点类型 (tag=0 表示原子结点,tag=1 表示表结点) union { char data; struct { struct GLNode *hr,*tr;}; //hr 为表头指针 tr 为表尾指针 }; }*GList; /**************************************************************/ tag=1 hr 表结点 tag=0 data 原子结点 tr
4
主要思想: 在对广义表的输出过程中,如何将括号正确的输出是一个棘手的 问题,故采用 i 作为括号计数器,在调用 printf_GL( )之前,已输出一个“(” ,故 参数 i=1。printf_GL( )完整的代码如下: /************************************************************/ void printf_GL(GList Ls,int &i) { //输出(遍历)Ls 指针所指向的广义表 //i 为括号计数器
//创建广义表
单独的 creatlist( )函数并不能创建完整的广义表,需要与 main( )函数中的第 一部分相结合才能共同完成广义表的创建。creatlist( )在 main 中的调用如下: char c; c=getchar(); if(c!='(') return -1; GList Ls; creatlist(Ls);
目: 识别广义表的“头尾”
初始条件:
写一个程序,建立广义表的存储结构,演示在此存储结构上实现的广义表求头 /求尾 操作序列的结果。 (1)设一个广义表允许分多行输入,其中可以任意地输入空格符,原子是不限长的仅 由字母或数字组成的串。 (2)广义表采用如教科书中图 5.8 所示结点的存储结构,试按表头和表尾的分解方法 编写建立广义表存储结构的算法。 (3) 对已建立存储结构的广义表施行操作, 操作序列为一个仅由 “t” (取表尾) 或 “h” (取表头)组成的串,它可以是空串(此时印出整个广义表),自左至右施行各种操作,再 以符号形式显示结果。 测试用例见题集 p138。
问题描述
本课程设计主要完成对广义表的建立以及遍历(输出) ,并且对已建立的广 义表实施操作,操作序列为一串由“t” 、 “h”以及“ ”组成的字符串。 “t”表 示对广义表求表尾, “h”表示对广义表求表头, “ ”表示遍历当前整个广义表。
基本要求:
(1)设一个广义表允许分多行输入,其中可以任意地输入空格符,原子是不限 长的仅由字母或数字组成的串。 (2)广义表采用如教科书中图 5.8 所示结点的存储结构,试按表头和表尾的分 解方法编写建立广义表存储结构的算法。 (3)对已建立存储结构的广义表施行操作,操作序列为一个仅由“t” (取表尾) 或“h” (取表头)组成的串,它可以是空串(此时印出整个广义表) ,自左至右 施行各种操作,再以符号形式显示结果。
学
号:
0121110860218