识别广义表的头尾 武汉理工大学 数据结构课程设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 )
//
广义表第一个字符必须是'(',否则终止函数
在整个程序中采用 getchar( )函数从键盘缓冲区读取输入的广义表数据。 creatlist( )函数的完全代码如下: /****************************************************************/
学
号:
0121110860218
课 程 设 计
题 学 专 班 姓
目 院 业 级 名
识别广义表的“头尾” 计算机科学与技术学院 物联网工程 物联网 1102 班 曾远梦 张霞
指导教师
2013
年 7
月 4
日
课程设计任务书
学生姓名: 指导教师: 题 曾远梦 张霞 专业班级: 物联网 1102 班
工作单位:计算机科学与技术学院
目: 识别广义表的“头尾”
初始条件:
写一个程序,建立广义表的存储结构,演示在此存储结构上实现的广义表求头 /求尾 操作序列的结果。 (1)设一个广义表允许分多行输入,其中可以任意地输入空格符,原子是不限长的仅 由字母或数字组成的串。 (2)广义表采用如教科书中图 5.8 所示结点的存储结构,试按表头和表尾的分解方法 编写建立广义表存储结构的算法。 (3) 对已建立存储结构的广义表施行操作, 操作序列为一个仅由 “t” (取表尾) 或 “h” (取表头)组成的串,它可以是空串(此时印出整个广义表),自左至右施行各种操作,再 以符号形式显示结果。 测试用例见题集 p138。
(2)GL_Elem(GList p)
//输出原子
GL_Elem( )十分简单,只是一个将存储的原子输出的函数,代码如下: void GL_Elem(GList p) { cout<<p->data ; } // 输出原子
(3)printf_GL(GList Ls,int &i)
//输出 (遍历)Ls 指针所指向的广
//创建广义表
单独的 creatlist( )函数并不能创建完整的广义表,需要与 main( )函数中的第 一部分相结合才能共同完成广义表的创建。creatlist( )在 main 中的调用如下: char c; c=getchar(); if(c!='(') return -1; GList Ls; creatlist(Ls);
问题描述
本课程设计主要完成对广义表的建立以及遍历(输出) ,并且对已建立的广 义表实施操作,操作序列为一串由“t” 、 “h”以及“ ”组成的字符串。 “t”表 示对广义表求表尾, “h”表示对广义表求表头, “ ”表示遍历当前整个广义表。
基本要求:
(1)设一个广义表允许分多行输入,其中可以任意地输入空格符,原子是不限 长的仅由字母或数字组成的串。 (2)广义表采用如教科书中图 5.8 所示结点的存储结构,试按表头和表尾的分 解方法编写建立广义表存储结构的算法。 (3)对已建立存储结构的广义表施行操作,操作序列为一个仅由“t” (取表尾) 或“h” (取表头)组成的串,它可以是空串(此时印出整个广义表) ,自左至右 施行各种操作,再以符号形式显示结果。
4
主要思想: 在对广义表的输出过程中,如何将括号正确的输出是一个棘手的 问题,故采用 i 作为括号计数器,在调用 printf_GL( )之前,已输出一个“(” ,故 参数 i=1。printf_GL( )完整的代码如下: /************************************************************/ void printf_GL(GList Ls,int &i) { //输出(遍历)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( )是一个递归函数。广义表的输出的两个关键问题:一是在何时输 出“ (” ,何时输出原子;二是在何时输出“) ” ,何时输出“, ” 。
设计
存储结构:
广义表的存储结构采用的是链式存储结构, 每个数据元素可用一个节点表示。 由于列表中的数据元素可能为原子或列表,由此需要两种结点:原子结点和表结 点。前者用于表示原子,后者用于表示列表,一个表结点可由 3 个域组成:标志 域、指示表头的指针域和指示表尾的指针域;而原子结点只需要两个域:标志域 和值域。 广义表的存储结构定义形式为(c++) :
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、 调试报告 调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分Hale Waihona Puke Baidu。 4、 经验和体会(包括对算法改进的设想) 5、 附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行 结果要包含这些测试数据和运行输出, 6、 设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为 0 分。
/***************************************************************/ 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
//义表,i 为括号计数器
同 creatlist( )函数一样,printf_GL( )并不能单独输出完整的已存储的广义表, 它需要与 main( )函数中的第二部分相结合才能共同完成广义表的输出。 printf_GL( )在 main( )中调用方式如下: /*******************************************************/ if(!Ls) cout<<"( )"; // Ls 指向空表 else { cout<<"("; // 广义表第一个字符为“ (” int i=1; //已有左括号,故 i=1 printf_GL(Ls,i); } /********************************************************/
三 测试用例设计…………………………………………………… 8 四 调试报告………………………………………………………… 9 五 经验和体会……………………………………………………… 11 六 源程序清单……………………………………………………… 11 七 运行结果………………………………………………………… 16 八 参考文献………………………………………………………… 18 九 本科生课程设计成绩评定表…………………………………… 19
时间安排:
1、第 20 周(6 月 29 日至 7 月 3 日)完成。 2、7 月 3 日 8:00 到计算中心检查程序、交课程设计报告、源程序(CD 盘)。
指导教师签名: 系主任(或责任教师)签名:
年 年
月 月
日 日
目录
一 问题描述………………………………………………………… 1
基本要求…………………………………………………………………… 1
二 设计……………………………………………………………… 1
存储结构……………………………………………………………………1 主要算法…………………………………………………………………… 2
creatlist(GList &Ls )……………………………………………………………………2 GL_Elem(GList p)………………………………………………………………………4 printf_GL(GList Ls,int &i)………………………………………………………………4 GetHead(GList &Ls)……………………………………………………………………6 void GetTail(GList &Ls)…………………………………………………………………6 void Get_HT(GList Ls)…………………………………………………………………7
当 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 )
//
广义表第一个字符必须是'(',否则终止函数
在整个程序中采用 getchar( )函数从键盘缓冲区读取输入的广义表数据。 creatlist( )函数的完全代码如下: /****************************************************************/
学
号:
0121110860218
课 程 设 计
题 学 专 班 姓
目 院 业 级 名
识别广义表的“头尾” 计算机科学与技术学院 物联网工程 物联网 1102 班 曾远梦 张霞
指导教师
2013
年 7
月 4
日
课程设计任务书
学生姓名: 指导教师: 题 曾远梦 张霞 专业班级: 物联网 1102 班
工作单位:计算机科学与技术学院
目: 识别广义表的“头尾”
初始条件:
写一个程序,建立广义表的存储结构,演示在此存储结构上实现的广义表求头 /求尾 操作序列的结果。 (1)设一个广义表允许分多行输入,其中可以任意地输入空格符,原子是不限长的仅 由字母或数字组成的串。 (2)广义表采用如教科书中图 5.8 所示结点的存储结构,试按表头和表尾的分解方法 编写建立广义表存储结构的算法。 (3) 对已建立存储结构的广义表施行操作, 操作序列为一个仅由 “t” (取表尾) 或 “h” (取表头)组成的串,它可以是空串(此时印出整个广义表),自左至右施行各种操作,再 以符号形式显示结果。 测试用例见题集 p138。
(2)GL_Elem(GList p)
//输出原子
GL_Elem( )十分简单,只是一个将存储的原子输出的函数,代码如下: void GL_Elem(GList p) { cout<<p->data ; } // 输出原子
(3)printf_GL(GList Ls,int &i)
//输出 (遍历)Ls 指针所指向的广
//创建广义表
单独的 creatlist( )函数并不能创建完整的广义表,需要与 main( )函数中的第 一部分相结合才能共同完成广义表的创建。creatlist( )在 main 中的调用如下: char c; c=getchar(); if(c!='(') return -1; GList Ls; creatlist(Ls);
问题描述
本课程设计主要完成对广义表的建立以及遍历(输出) ,并且对已建立的广 义表实施操作,操作序列为一串由“t” 、 “h”以及“ ”组成的字符串。 “t”表 示对广义表求表尾, “h”表示对广义表求表头, “ ”表示遍历当前整个广义表。
基本要求:
(1)设一个广义表允许分多行输入,其中可以任意地输入空格符,原子是不限 长的仅由字母或数字组成的串。 (2)广义表采用如教科书中图 5.8 所示结点的存储结构,试按表头和表尾的分 解方法编写建立广义表存储结构的算法。 (3)对已建立存储结构的广义表施行操作,操作序列为一个仅由“t” (取表尾) 或“h” (取表头)组成的串,它可以是空串(此时印出整个广义表) ,自左至右 施行各种操作,再以符号形式显示结果。
4
主要思想: 在对广义表的输出过程中,如何将括号正确的输出是一个棘手的 问题,故采用 i 作为括号计数器,在调用 printf_GL( )之前,已输出一个“(” ,故 参数 i=1。printf_GL( )完整的代码如下: /************************************************************/ void printf_GL(GList Ls,int &i) { //输出(遍历)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( )是一个递归函数。广义表的输出的两个关键问题:一是在何时输 出“ (” ,何时输出原子;二是在何时输出“) ” ,何时输出“, ” 。
设计
存储结构:
广义表的存储结构采用的是链式存储结构, 每个数据元素可用一个节点表示。 由于列表中的数据元素可能为原子或列表,由此需要两种结点:原子结点和表结 点。前者用于表示原子,后者用于表示列表,一个表结点可由 3 个域组成:标志 域、指示表头的指针域和指示表尾的指针域;而原子结点只需要两个域:标志域 和值域。 广义表的存储结构定义形式为(c++) :
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、 调试报告 调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分Hale Waihona Puke Baidu。 4、 经验和体会(包括对算法改进的设想) 5、 附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行 结果要包含这些测试数据和运行输出, 6、 设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为 0 分。
/***************************************************************/ 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
//义表,i 为括号计数器
同 creatlist( )函数一样,printf_GL( )并不能单独输出完整的已存储的广义表, 它需要与 main( )函数中的第二部分相结合才能共同完成广义表的输出。 printf_GL( )在 main( )中调用方式如下: /*******************************************************/ if(!Ls) cout<<"( )"; // Ls 指向空表 else { cout<<"("; // 广义表第一个字符为“ (” int i=1; //已有左括号,故 i=1 printf_GL(Ls,i); } /********************************************************/
三 测试用例设计…………………………………………………… 8 四 调试报告………………………………………………………… 9 五 经验和体会……………………………………………………… 11 六 源程序清单……………………………………………………… 11 七 运行结果………………………………………………………… 16 八 参考文献………………………………………………………… 18 九 本科生课程设计成绩评定表…………………………………… 19
时间安排:
1、第 20 周(6 月 29 日至 7 月 3 日)完成。 2、7 月 3 日 8:00 到计算中心检查程序、交课程设计报告、源程序(CD 盘)。
指导教师签名: 系主任(或责任教师)签名:
年 年
月 月
日 日
目录
一 问题描述………………………………………………………… 1
基本要求…………………………………………………………………… 1
二 设计……………………………………………………………… 1
存储结构……………………………………………………………………1 主要算法…………………………………………………………………… 2
creatlist(GList &Ls )……………………………………………………………………2 GL_Elem(GList p)………………………………………………………………………4 printf_GL(GList Ls,int &i)………………………………………………………………4 GetHead(GList &Ls)……………………………………………………………………6 void GetTail(GList &Ls)…………………………………………………………………6 void Get_HT(GList Ls)…………………………………………………………………7