广义表(C++实现)
- 格式:pdf
- 大小:315.13 KB
- 文档页数:10
第五章1、设二维数组A【8】【10】是一个按行优先顺序存储在内存中的数组,已知A【0】【0】的起始存储位置为1000,每个数组元素占用4个存储单元,求:(1)A【4】【5】的起始存储位置。
A【4】【5】的起始存储位置为1000+(10*4+5)*4=1180;(2)起始存储位置为1184的数组元素的下标。
起始存储位置为1184的数组元素的下标为4(行下标)、6(列下标)。
2、画出下列广义表D=((c),(e),(a,(b,c,d)))的图形表示和它们的存储表示。
略,参考第5·2节应用题第5题分析与解答。
3、已知A为稀疏矩阵,试从时间和空间角度比较采用两种不同的存储结构(二维数组和三元组表)实现求∑a(i,j)运算的优缺点。
稀疏矩阵A采用二维数组存储时,需要n*n个存储单元,完成求∑ii a(1≤i≤n)时,由于a【i】【i】随机存取,速度快。
但采用三元组表时,若非零元素个数为t,需3t+3个存储单元(t个分量存各非零元素的行值、列值、元素值),同时还需要三个存储单元存储存稀疏矩阵A的行数、列数和非零元素个数,比二维数组节省存储单元;但在求∑ii a(1≤i≤n)时,要扫描整个三元组表,以便找到行列值相等的非零元素求和,其时间性能比采用二维数组时差。
4、利用三元组存储任意稀疏数组时,在什么条件下才能节省存储空间?当m行n列稀疏矩阵中非零元素个数为t,当满足关系3*t<m*n时,利用三元组存储稀疏数组时,才能节省存储空间。
5、求下列各广义表的操作结果。
(1)GetHead((a,(b,c),d))GetHead((a,(b,c),d))=a(2)GetTail((a,(b,c),d))GetTail((a,(b,c),d))=((b,c),d)(3)GetHead(GetTail((a,(b,c),d)))GetHead(GetTail((a,(b,c),d)))=(b,c)(4)GetTail(GetHead((a,(b,c),d)))GetTail(GetHead((a,(b,c),d)))=()第六章1、已知一棵树边的集合为{(i,m),(i,n),(e,i),(b,e),(b,d),(a,b),(g,j),(g,k),(c,g),(c,f),(h,l),(c,h),(a,c)}用树形表示法画出此树,并回答下列问题:(1)哪个是根结点?(2)哪些是叶结点?(3)哪个是g的双亲?(4)哪些是g的祖先?(5)哪些是g的孩子?(6)哪些是e的子孙?(7)哪些是e的兄弟?哪些是f的兄弟?(8)结点b和n的层次号分别是什么?(9)树的深度是多少?(10)以结点c为根的子树的深度是多少?(11)树的度数是多少?略。
数据结构(C语言版)(第2版)课后习题答案数据结构(C语言版)(第2版)课后习题答案目录第1章绪论1 第2章线性表5 第3章栈和队列13 第4章串、数组和广义表26 第5章树和二叉树33 第6章图43 第7章查找54 第8章排序65 第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。
如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。
数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。
在有些情况下,数据元素也称为元素、结点、记录等。
数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。
数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。
例如,学生基本信息表中的学号、姓名、性别等都是数据项。
数据对象:是性质相同的数据元素的集合,是数据的一个子集。
例如:整数数据对象是集合N={0,±1,±2,。
},字母字符数据对象是集合C={‘A’,‘B’,。
,‘Z’,‘a’,‘b’,。
,‘z’},学生基本信息表也可是一个数据对象。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。
逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。
存储结构:数据对象在计算机中的存储表示,也称为物理结构。
抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。
具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。
2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。
2022年中南财经政法大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、将线性表的数据元素进行扩充,允许带结构的线性表是()。
A.串B.树C.广义表D.栈2、有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是()。
A.60B.66C.18000D.333、连续存储设计时,存储单元的地址()。
A.一定连续B.一定不连续C.不一定连续D.部分连续,部分不连续4、在用邻接表表示图时,拓扑排序算法时间复杂度为()。
A.O(n)B.O(n+e)C.O(n*n)D.O(n*n*n)5、用不带头结点的单链表存储队列,其队头指针指向队头结点,队尾指针指向队尾结点,则在进行出队操作时()。
A.仅修改队头指针B.仅修改队尾指针C.队头、队尾指针都可能要修改D.队头、队尾指针都要修改6、排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一趟排序。
下列排序方法中,每一趟排序结束时都至少能够确定一个元素最终位置的方法是()。
Ⅰ.简单选择排序Ⅱ.希尔排序Ⅲ.快速排序Ⅳ.堆排Ⅴ.二路归并排序A.仅Ⅰ、Ⅲ、Ⅳ B.仅Ⅰ、Ⅱ、Ⅲ C.仅Ⅱ、Ⅲ、Ⅳ D.仅Ⅲ、Ⅳ、Ⅴ7、已知关键字序列5,8,12,19,28,20,15,22是小根堆(最小堆),插入关键字3,调整后的小根堆是()。
A.3,5,12,8,28,20,15,22,19B.3,5,12,19,20,15,22,8,28C.3,8,12,5,20,15,22,28,19D.3,12,5,8,28,20,15,22,198、一个具有1025个结点的二叉树的高h为()。
A.11B.10C.11至1025之间D.10至1024之间9、有关二叉树下列说法正确的是()。
A.二叉树的度为2B.一棵二叉树的度可以小于2C.二叉树中至少有一个结点的度为2D.二叉树中任何一个结点的度都为210、就平均性能而言,目前最好的内排序方法是()排序法。
c语言广义表C语言中没有内置的广义表数据结构,但可以通过结构体和指针来构建广义表。
广义表是一种含有嵌套元素的数据结构,可以包含原子元素和子表。
下面是一个示例代码,用于实现广义表的基本操作:```c#include <stdio.h>#include <stdlib.h>// 定义广义表的数据结构typedef struct GList {int tag;union {char atom;struct GList *sublist;} value;struct GList *next;} GList;// 创建广义表GList* createGList() {GList *list;char c;scanf("%c", &c);if (c == '#') {list = NULL;} else if (c == '(') {list = (GList *)malloc(sizeof(GList)); list->tag = 1;list->value.sublist = createGList(); list->next = createGList();} else {list = (GList *)malloc(sizeof(GList)); list->tag = 0;list->value.atom = c;list->next = createGList();}return list;}// 打印广义表void printGList(GList *list) {if (list == NULL) {printf("#");} else if (list->tag == 1) {printf("(");printGList(list->value.sublist);printf(")");printGList(list->next);} else {printf("%c", list->value.atom);printGList(list->next);}}// 主函数int main() {printf("请输入广义表:\n");GList *list = createGList();printf("广义表为:");printGList(list);printf("\n");return 0;}```这个示例代码实现了广义表的创建和打印功能。
广义表在学稀疏矩阵之后就应该学的,只是那时觉得看起来晕晕就跳过了,现在回头学了一下,觉得还是不错的一种结构。
下面是代码:文件"glist.h"view plain1.#include<iostream>2.#include<string>ing namespace std;4.5.enum elemTag {ATOM,LIST};6.class GList;7.8.class GLnode9.{10.private:11. elemTag Tag; //标志是原子还是子表 0:原子 1:子表12.union13. {14.char data; //原子结点值域15.struct//表结点指针域16. {17. GLnode *hp;18. GLnode *tp;19. }ptr;20. };21.friend class GList;22.};23.24.class GList25.{26.public:27. string Decompose(string &str)28. {29.//将非空串str分割成2部分,hstr为第一个','之前的子串,str为后面的30.int n,i,k;31. string ch,hstr;32. n=str.length();33.for(i=0,k=-1;i<n && (ch!="," || k!=0) ;i++)34. {35.//搜索最外层第一个逗号36. ch=str.substr(i,1); //从第i个位置起读1个字符37.if(ch=="(")38. ++k;39.else if(ch==")")40. --k;41. }42.if(i<n)43. {44. hstr=str.substr(1,i-2);//不要左括号,不要逗号,所以是i-245. str="("+str.substr(i,n-i);46. }47.else48. {49. hstr=str.substr(1,n-2);50. str="";51. }52.return hstr;53. }54.55./*----------------------------------------------------56. /从广义表书写形式串S创建采用头尾链表存储表示的广义表T57. /建立广义表头尾结点存储结构的递归定义:58. /基本项:当S为空串时,置空广义表59. / 当S为单字符串时,建立原子结点的子表60. /递归项:假设sub为脱去S最外层括号的子串,记为"s1,s2,s3,..,sn"61. / 每个si为非空字符串,对每个si建立一个表结点62. /--------------------------------------------------------*/63.64.void Create_GList(GLnode *&GL,string S) //创建广义表65. {66. string hsub;67.if(S=="()") //S为空串68. {69. GL=NULL;70. }71.else72. {73.74. GL=new GLnode;75.if(S.length()==1)76. {77. GL->Tag=ATOM;78. GL->data=S[0];79. }80.else81. {82. GL->Tag=LIST;83. hsub=Decompose(S); //从S中分离出表头串hsub84. Create_GList(GL->ptr.hp,hsub);85.if(S.empty())86. {87. GL->ptr.tp=NULL;88. }89.else90. {91. Create_GList(GL->ptr.tp,S);92. }93. }94. }95. }96.97.int GList_Depth(GLnode *GL) //求广义表深度98. {99./*-----------------------------------------100. /当广义表为空表时,深度为1,当广义表为原子时101. /深度为0,当广义表为广义表时,深度的求法为102. /GList_Depth(GL)=1+max{GList_Depth(lsi)}103. /-----------------------------------------*/ 104.105.if(!GL)106.return 1;107.if(GL->Tag==ATOM)108.return 0;109.int dep,max;110. GLnode *p;111.for(max=0,p=GL;p;p=p->ptr.tp)112. {113. dep=GList_Depth(p->ptr.hp);114.if(dep>max)115. max=dep;116. }117.return 1+max;118. }119.120.void Copy_GList(GLnode *GL,GLnode *&T) //T复制GL 121. {122.//当表为空时,复制空表,否则先复制表头在复制表尾123.if(!GL)124. T=NULL;125.else126. {127. T=new GLnode;128. T->Tag=GL->Tag;129.if(GL->Tag==ATOM)130. T->data=GL->data;131.else132. {133. Copy_GList(GL->ptr.hp,T->ptr.hp); 134. Copy_GList(GL->ptr.tp,T->ptr.tp); 135. }136. }137. }138.139./*-----------------------------------------------140. /遍历广义表,如果是空表就输出"()",如果遇到Tag=0 141. /的结点,则直接输出该结点的值,如果tag=1,说明142. /是一个子表,首先输出左括号,然后递归调用输出数据143. /元素,并当表尾不空的时候输出逗号,最后输出右括号144. /-----------------------------------------------*/ 145.void Traverse_GList(GLnode *L)146. {147.if(!L)148. cout<<"()";149.else150. {151.if(L->Tag==ATOM)152. cout<<L->data;153.else154. {155. GLnode *p=NULL;156. cout<<'(';157. p=L;158.while(p)159. {160. Traverse_GList(p->ptr.hp); 161. p=p->ptr.tp;162.if(p)163. cout<<',';164. }165. cout<<')';166. }167. }168. }169.170.void GetHead(GLnode *GL) //取表头171. {172.//取广义表第一个元素173. cout<<"广义表:";174. Traverse_GList(GL);175. cout<<endl;176.if(!GL || GL->Tag==0 )177. cout<<"原子和空表不能去表头"<<endl;178.else179. {180. GLnode *h=GL->ptr.hp;181.if(h->Tag==ATOM)182. cout<<"表头为:"<<h->data<<endl;183.else184. {185. cout<<"表头为:";186. Traverse_GList(h);187. cout<<endl;188. }189. }190. }191.192.void GetTail(GLnode *GL) //取表尾193. {194.//广义表表尾指的是除了第一个元素后所有剩余的元素组成的表195. cout<<"广义表:";196. Traverse_GList(GL);197. cout<<endl;198.199.if(!GL || GL->Tag==0)200. cout<<"原子和空表不能取表尾"<<endl;201.else202. {203. GLnode *t;204. t=GL->ptr.tp;205. cout<<"表尾为:";206. Traverse_GList(t);207. cout<<endl;208. }209. }210.211.int Length_GList_1(GLnode *GL) //求表长,非递归212. {213.//用非递归方式求广义表长度214.int len=0;215.if(GL && GL->Tag==LIST)216. {217.while(GL)218. {219. GL=GL->ptr.tp;220. len++;221. }222.return len;223. }224.else225.return 0;226. }227.228.int Length_GList_2(GLnode *GL) //求表长,递归229. {230.if(!GL)231.return 0;232.return 1+Length_GList_2(GL->ptr.tp);233. }234.235.void Replace_GList(GLnode *p,char x,char y,GLnode *&q) //替换236. {237.//将广义表p中元素x替换成y,构建新广义表q238.if(!p)239. q=NULL;240.else241. {242.if(p->Tag==ATOM)243. {244. q=new GLnode;245. q->Tag=ATOM;246. q->ptr.hp=NULL;247.if(p->data==x)248. q->data=y;249.else250. q->data=p->data;251. }252.else253. {254. GLnode *h,*t;255. Replace_GList(p->ptr.hp,x,y,h);//递归处理表头得到h 256. Replace_GList(p->ptr.tp,x,y,t);//递归处理表尾得到t 257. q=new GLnode;258. q->Tag=LIST;259. q->ptr.hp=h;260. q->ptr.tp=t;261. }262. }263. }264.265.int Is_Same(GLnode *p,GLnode *q)//判断是否相等266. {267.int flag=1;//1表示相等,0表示不相等268.if(p && q)269. {270.if(p->Tag==ATOM && q->Tag==ATOM)271. {272.if(p->data!=q->data)273. flag=0;274.else275. flag=1;276. }277.else if(p->Tag==LIST &&q->Tag==LIST)278. flag=Is_Same(p->ptr.hp,q->ptr.hp);279.else280. flag=0;281.if(flag)282. flag=Is_Same(p->ptr.tp,q->ptr.tp);283. }284.else285. {286.if(p && !q)287. flag=0;288.if(!p && q)289. flag=0;290. }291.return flag;292. }293.void Concat_Glist(GLnode *&GL,GLnode *LG) //连接两个广义表294. {295. GLnode *p=GL;296. GLnode *q=p->ptr.tp;297.while(q->ptr.tp)298. q=q->ptr.tp;299. q->ptr.tp=LG;300. GL=p;301. }302.303.};测试函数"main.cpp"view plain1.#include"glist.h"2.3.int main()4.{5. GList list;6. GLnode *GL=NULL;7. string S;8. cout<<"输入广义表S:";9. cin>>S;10. list.Create_GList(GL,S);11. cout<<"广义表S的深度为:"<<list.GList_Depth(GL)<<endl;12. cout<<"广义表S的长度为:"<<list.Length_GList_1(GL)<<endl;13. cout<<"广义表S的长度为:"<<list.Length_GList_2(GL)<<endl;14.15. list.GetHead(GL);16. list.GetTail(GL);17.18. GLnode *T;19. cout<<"复制广义表"<<endl;20. list.Copy_GList(GL,T);21. cout<<"遍历复制后的广义表T"<<endl;22. list.Traverse_GList(T);23. cout<<endl;24.25. string F;26. cout<<"输入广义表F:";27. cin>>F;28. GList list1;29. GLnode *LG;30. list1.Create_GList(LG,F);31.if(list.Is_Same(GL,LG))32. cout<<"广义表S和F相等"<<endl;33.else34. cout<<"广义表S和F不相等"<<endl;35.36. cout<<"广义表F的长度为:"<<list1.Length_GList_2(LG)<<endl;37.38.char x,y;39. cout<<"输入你要替换的字符: ";40. cin>>x;41. cout<<endl;42. cout<<"输入你要替换成哪个字符:";43. cin>>y;44. GLnode *k;45. list1.Replace_GList(LG,x,y,k);46. cout<<"替换后的广义表为:";47. list1.Traverse_GList(k);48. cout<<endl;49.50. cout<<"连接广义表S与被替换字符后的广义表F的表为:";51. list.Concat_Glist(GL,k);52. list.Traverse_GList(GL);53. cout<<endl;54.55.return 0;56.}下面是输出结果view plain1.输入广义表S:((a,b),(c,d))2.广义表S的深度为:23.广义表S的长度为:24.广义表S的长度为:25.广义表:((a,b),(c,d))6.表头为:(a,b)7.广义表:((a,b),(c,d))8.表尾为:((c,d))9.复制广义表10.遍历复制后的广义表T11.((a,b),(c,d))12.输入广义表F:(f,(g,h),(i,i))13.广义表S和F不相等14.广义表F的长度为:315.输入你要替换的字符: i16.17.输入你要替换成哪个字符:x18.替换后的广义表为:(f,(g,h),(x,x))19.连接广义表S与被替换字符后的广义表F的表为:((a,b),(c,d),f,(g,h),(x,x))20.Press any key to continue。