南京工业大学数据结构作业答案(全)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

作业11.数据结构和数据类型两个概念之间有区别吗?答:简单地说,数据结构定义了一组按某些关系结合在一起的数组元素。数据类型不仅定义了一组带结构的数据元素,而且还在其上定义了一组操作。2.阅读下列C程序段,写出相应的执行结果(每小题4分,共8分)(1)。printf(“Inputx”);scanf(“%d”,&x);if(x=30)if(x20)y=x;elseif(x10)y=2*x;if(x0&&x30)printf(“x=%d,y=%d”,x,y);elseprintf(“输入数据错!”);试写出当x分别为18,8时的执行结果。答:运行结果为:x=18,y=36x=8,y=运行前的值,且从x=30开始为数据错3.分析下面各程序段的时间复杂度作业2(2)。longintfact(n)intn;{longf;if(n1)f=n*fact(n-1);elsef=1;return(f);}main(){intn;longy;n=5;y=fact(n);printf(“%d,%ld\n”,n,y);}答:运行结果为:5,120此题为递归运算2.s=0;fori=0;in;i++)for(j=0;jn;j++)s+=B[i][j];sum=s;答:O(n2)1.for(i=0;in;i++)for(j=0;jm;j++)A[i][j]=0;答:O(m*n)3.x=0;for(i=1;in;i++)for(j=1;j=n-i;j++)x++;解:因为x++共执行了n-1+n-2+……+1=n(n-1)/2,所以执行时间为O(n2)4.i=1;while(i=n)i=i*3;答:O(log3n)1.【严题集2.3②】试比较顺序存储结构和链式存储结构的优缺点。在什么情况下用顺序表比链表好?答:①顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。优点:存储密度大(=1?),存储空间利用率高。缺点:插入或删除元素时不方便。②链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针优点:插入或删除元素时很方便,使用灵活。缺点:存储密度小(1),存储空间利用率低。顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。2.【严题集2.1①】描述以下三个概念的区别:头指针、头结点、首元结点(第一个元素结点)。在单链表中设置头结点的作用是什么?答:首元结点是指链表中存储线性表中第一个数据元素a1的结点。为了操作方便,通常在链表的首元结点之前附设一个结点,称为头结点,该结点的数据域中不存储线性表的数据元素,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理。头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针。若链表中附设头结点,则不管线性表是否为空表,头指针均不为空。否则表示空表的链表的头指针为空。这三个概念对单链表、双向链表和循环链表均适用。是否设置头结点,是不同的存储结构表示同一逻辑结构的问题。头结点headdatalink头指针首元结点简而言之,头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针;头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息(内放头指针?那还得另配一个头指针!!!)首元素结点是指链表中存储线性表中第一个数据元素a1的结点。3.已知P结点是双向链表的中间结点,试从下列提供的答案中选择合适的语句序列。a.在P结点后插入S结点的语句序列是-----------。b.在P结点前插入S结点的语句序列是-----------。c.删除P结点的直接后继结点的语句序列是----------。d.删除P结点的直接前驱结点的语句序列是----------。e.删除P结点的语句序列是------------。(1)P-next=P-next-next;(10)P-prior-next=P;(2)P-prior=P-prior-prior;(11)P-next-prior=P;(3)P-next=S;(12)P-next-prior=S;(4)P-prior=S;(13)P-prior-next=S;(5)S-next=P;(14)P-next-prior=P-prior(6)S-prior=P;(15)Q=P-next;(7)S-next=P-next;(16)Q=P-prior;(8)S-prior=P-prior;(17)free(P);(9)P-prior-next=p-next;(18)free(Q);解答:a.(12)(7)(3)(6)3必须在12和7的后面,其余的顺序可变b.(13)(8)(4)(5)同上c.(15)(1)(11)(18)不可变d.(16)(2)(10)(18)不可变e.(9)(14)(17)4.编写程序,将若干整数从键盘输入,以单链表形式存储起来,然后计算单链表中结点的个数(其中指针P指向该链表的第一个结点)。注:统计结点个数是【省统考样题】的要求,也是教材P604-6计算链表长度的要求,编程又简单,很容易作为考题。解:编写C程序如下(已上机通过):全局变量及函数提前说明:---------------------------------#includestdio.h#includestdlib.htypedefstructliuyu{intdata;structliuyu*link;}test;liuyu*p,*q,*r,*head;intm=sizeof(test);voidmain()/*第一步,从键盘输入整数,不断添加到链表*/{inti;head=(test*)malloc(m);/*m=sizeof(test);*/p=head;i=0;while(i!=-9999){printf(/ninputaninteger[stopby'-9999']:);scanf(%d,&i);p-data=i;/*inputdataissaved*/p-link=(test*)malloc(m);/*m=sizeof(test));*/q=p;p=p-link;}q-link=NULL;/*原先用p-link=NULL似乎太晚!*/p=head;i=0;/*统计链表结点的个数并打印出来*/while(p-link!=NULL){printf(%d,p-data);p=p-link;i++;}printf(\nnodenumber=%d\n,i-1);/*结点的个数不包括-9999*/}作业31.假设正读和反读都相同的字符序列为“回文”,例如,‘abba’和‘abcba’是回文,‘abcde’和‘ababab’则不是回文。假设一字符序列已存入计算机,请分析用线性表、堆栈和队列等方式正确输出其回文的可能性?答:线性表是随机存储,可以实现,靠循环变量(j--)从表尾开始打印输出;堆栈是后进先出,也可以实现,靠正序入栈、逆序出栈即可;队列是先进先出,不易实现。哪种方式最好,要具体情况具体分析。若正文在机内已是顺序存储,则直接用线性表从后往前读取即可,或将堆栈栈顶开到数组末尾,然后直接用POP动作实现。(但堆栈是先减后压还是……)若正文是单链表形式存储,则等同于队列,需开辅助空间,可以从链首开始入栈,全部压入后再依次输出。2.顺序队的“假溢出”是怎样产生的?如何知道循环队列是空还是满?答:一般的一维数组队列的尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出”。采用循环队列是解决假溢出的途径。另外,解决队满队空的办法有三:①设置一个布尔变量以区别队满还是队空;②浪费一个元素的空间,用于区别队满还是队空。③使用一个计数器记录队列中元素个数(即队列长度)。我们常采用法②,即队头指针、队尾指针中有一个指向实元素,而另一个指向空闲元素。判断循环队列队空标志是:f=rear队满标志是:f=(r+1)%N3.设循环队列的容量为40(序号从0到39),现经过一系列的入队和出队运算后,有①front=11,rear=19;②front=19,rear=11;问在这两种情况下,循环队列中各有元素多少个?答:用队列长度计算公式:(N+r-f)%N①L=(40+19-11)%40=8②L=(40+11-19)%40=324.试写一个算法判别读入的一个以‘@’为结束符的字符序列是否是“回文”。答:编程如下:intPalindrome_Test()//判别输入的字符串是否回文序列,是则返回1,否则返回0{InitStack(S);InitQueue(Q);while((c=getchar())!='@'){Push(S,c);EnQueue(Q,c);//同时使用栈和队列两种结构}while(!StackEmpty(S)){Pop(S,a);DeQueue(Q,b));if(a!=b)returnERROR;}returnOK;}//Palindrome_Test作业4:1.设如下图所示的二叉树B的存储结构为二叉链表,root为根指针,结点结构为:(lchild,data,rchild)。其中lchild,rchild分别为指向左右孩子的指针,data为字符型,root为根指针,试回答下列问题:(1).对下列二叉树B,执行下列算法traversal(root),试指出其输出结果;C的结点类型定义如下:structnode{chardata;structnode*lchild,rchild;};C算法如下:voidtraversal(structnode*root){if(root){printf(“%c”,root-data);traversal(root-lchild);printf(“%c”,root-data);traversal(root-rchild);}}(2).假定二叉树B共有n个结点,试分析算法traversal(root)的时间复杂度。二叉树B解:这是“先根再左再根再右”,比前序遍历多打印各结点一次,输出结果为:ABCCEEBADFFDGG特点:①每个结点肯定都会被打印两次;②但出现的顺序不同,其规律是:凡是有左子树的结点,必间隔左子树的全部结点后再重复出现;如A,B,D等结点。反之马上就会重复出现。如C,E,F,G等结点。时间复杂度以访问结点的次数为主,精确值为2*n,时间渐近度为O(n).2.试写出如图所示的二叉树分别按先序、中序、后序遍历时得到的结点序列。答:DLR:ABDFJGKCEHILMLDR:BFJDGKACHELIMLRD:JFKGDBHLMIECAABDCFGE3.把如图所示的树转化成二叉树。答:注意全部兄弟之间都要连线(包括度为2的兄弟),并注意原有连线结点一律归入左子树,新添连线结点一律归入右子树。ABECKFHDLGIMJ4.画出和下列二叉树相应的森林。答:注意根右边的子树肯定是森林,而孩子结点的右子树均为兄弟。5.编写按层次顺序(同一层自左至右)遍历二叉树的算法(或:按层次输出二叉树中所有结点)。解:思路:既然要求从上到下,从左到右,则利用队列存放各子树结点的指针是个好办法。这是一个循环算法,用while语句不断循环,直到队空之后自然退出该函数。技巧之处:当根结点入队后,会自然使得左、右孩子结点入队,而左孩子出队时又会立即使得它的左右孩子结点入队,……以此产生了按层次输出的效果。法一:level(liuyu*T)/*liuyu*T,*p,*q[100];假设max已知*/{intf,r;f=0;r=0;/*置空队*/r=(r+1)%max;q[r]=T;/*根结点进队*/while(f!=r)/*队列不空*/{f=(f+1%max);

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功