16章作业.docx
- 文档编号:7962384
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:11
- 大小:83.27KB
16章作业.docx
《16章作业.docx》由会员分享,可在线阅读,更多相关《16章作业.docx(11页珍藏版)》请在冰豆网上搜索。
16章作业
第1章绪论
【书面作业】
1、下列是几种二元组表示的数据结构,画出它们的逻辑结构图,并指出它们分别属于何种结构。
①A=(K,R),其中
K={a,b,c,d,e,f,g,h}
R={r}
r={,,
②B=(K,R),其中
K={a,b,c,d,e,f,g,h}
R={r}
r={
③C=(K,R),其中
K={a,b,c,d,e,f}
R={r}
r={,,,
2、求下面程序段的时间复杂度
①for(i=0;i for(j=0;j a[i][j]=0;{i++;for(j=0;j s+=i;}s+=b[i][j]; ④x=n;y=0; while((x>=(y+1)*(y+1)) y=y+1; 【上机作业】 1.熟悉VC++编程环境 2.TRIPLET算法实现(看懂程序) 3.已知输入x,y,z三个不相等的整数,实现三个数从小到大顺序的输出,其中x中存放最小数,y中存放次小数。 要求使用引用参数来实现。 4.测试算法的运行时间 在此,我们通过一个比较两个算法执行效率的程序例子,掌握测试算法运行时间的基本方法。 这里涉及到C语言中标准的函数库sys/timeb。 sys/timeb函数库中提供了处理与时间相关的函数。 其中函数ftime的功能是获取当前的系统时间。 输入两个C语言主程序test3_2.cpp和test3_3.cpp,并运行。 主文件(test3_2.cpp): #include #include voidmain() { 1timebt1,t2; 2longt; 3doublex,sum=1,sum1; 4inti,j,n; 5printf("请输入x,n: "); 6scanf("%lf,%d",&x,&n); 7ftime(&t1);//求得当前时间 8for(i=1;i<=n;i++) 9{ 10sum1=1; 11for(j=1;j<=i;j++) 12sum1=sum1*(-1.0/x); 13sum+=sum1; 14} 15ftime(&t2);//求得当前时间 16t=(t2.time-t1.time)*1000+(t2.millitm-t1.millitm);//计算时间差,转换成毫秒 17printf("sum=%lf用时%ld毫秒\n",sum,t); } 主文件(test3_3.cpp): #include #include voidmain() { timebt1,t2; longt; doublex,sum1=1,sum=1; inti,n; printf("请输入x,n: "); scanf("%lf,%d",&x,&n); ftime(&t1);//求得当前时间 for(i=1;i<=n;i++) { sum1*=-1.0/x; sum+=sum1; } ftime(&t2);//求得当前时间 t=(t2.time-t1.time)*1000+(t2.millitm-t1.millitm);//计算时间差,转换成毫秒 printf("sum=%lf用时%ld毫秒\n",sum,t); } 考虑如下问题: (1)这两个算法的功能是什么? (2)它们的时间复杂度分别是多少? 哪个算法更优? 第2章线性表 【书面作业】 1.在什么情况下用顺序表比链表好? 2.已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列 a.在P结点后插入S结点的语句序列是。 b.在P结点前插入S结点的语句序列是。 c.在表首插入S结点的语句序列是。 d.在表尾插入S结点的语句序列是。 (1)P->next=S; (2)P->next=P->next->next; (3)P->next=S->next; (4)S->next=P->next; (5)S->next=L; (6)S->next=NULL; (7)Q=P; (8)while(P->next! =Q)P=P->next; (9)while(P->next! =NULL)P=P->next; (10)P=Q; (11)P=L; (12)L=S; (13)L=P; 3.已知L是带头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。 a.删除P结点的直接后继结点的语句序列是。 b.删除P结点的直接前驱结点的语句序列是。 c.删除P结点的语句序列是。 d.删除首元结点的语句序列是。 e.删除尾元结点的语句序列是。 (1)P=P->next; (2)P->next=P; (3)P->next=P->next->next; (4)P=P=>next->next; (5)while(P! =NULL)P=P->next; (6)while(Q->next! =NULL){P=Q;Q=Q->next;} (7)while(P->next! =Q)P=P->next; (8)while(P->next->next! =Q)P=P->next; (9)while(P->next->next! =NULL)P=P->next; (10)Q=P; (11)Q=P->next; (12)P=L; (13)L=L->next; (14)free(Q); 4.简述以下算法的功能 (1)StatusA(LinkedListL){//L是无表头结点的单链表 if(L&&L->next){ Q=L;L=L->next;P=L; While(P->next)P=P->next; P->next=Q;Q->next=NULL; } returnOK; }//A (2)voidBB(LNode*s,LNode*q){ p=s; while(p->next! =q)p=p->next; p->next=s; }//BB voidAA(LNode*pa,LNode*pb){ //pa和pb分别指向单循环链表中的两个结点 BB(pa,pb); BB(pb,pa); }//AA 5.已知有一个单向循环链表,其每个结点中含三个域: pre,data和next,其中data为数据域,next为指向后继结点的指针域,pre也为指针域,但它的值为空(NULL),试编写算法将此单向循环链表改为双向循环链表,即使pre成为指向前驱结点的指针域。 【上机作业】 (1)设顺序表va中的数据元素递增有序。 试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。 (2)已知线性表中的元素以值递增有序排列,并以单链表作存储结构。 试写一高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)同时释放被删结点空间,并分析你的算法的时间复杂度(注意: mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。 (3)假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中有值相同的元素)排列的线性表C,并要求利用原表(即A表和B表)的结点空间构造C表。 第3章栈和队列 【书面作业】 1.简述以下算法的功能(栈的元素类型SElemType为int)。 (1)statusalgo1(StackS){ inti,n,A[255]; n=0; while(! StackEmpty(S)){n++;Pop(S,A[n]);}; for(i=1;i<=n;i++)Push(S,A[i]); } (2)statusalgo2(StackS,inte){ StackT;intd; InitStack(T); while(! StackEmpty(S)){ Pop(S,d); if(d! =e)Push(T,d); } while(! StackEmpty(T)){ Pop(T,d); Push(S,d); } } 2.写出以下程序段的输出结果(队列中元素类型QElemType为char)。 voidmain(){ QueueQ;InitQueue(Q); Charx=’e’,y=’c’; EnQueue(Q,’h’);EnQueue(Q,’r’);EnQueue(Q,y); DeQueue(Q,x);EnQueue(Q,x); DeQueue(Q,x);EnQueue(Q,’a’); while(! QueueEmpty(Q)){ DeQueue(Q,y); printf(y); } printf(x); } 3.有6个元素a,b,c,d,e,f依次进栈,允许任何时候出栈,能否得到下列出栈序列? (1)cdbefa (2)abedfc(3)dceabf(4)baefcd(5)abcdef 4.用一维数组a[7]顺序存储一个循环队列,队首和队尾指针分别用front和rear表示,当前队列中已有5个元素: 23,45,67,80,34,其中,23为队首元素,front的值为3,请画出对应的存储状态,当连续做4次出队运算后,再让15,36,48元素依次进队,请再次画出对应的存储状态。 【上机作业】 1.试写一个将某十进制数转化为其他任意进制数的算法。 2.试写一个判别表达式中开、闭括号是否配对出现的算法。 3.教材P64上循环队列算法实现。 第4章串 【上机作业】 1.编写算法,实现串的基本操作Replace(&S,T,V)。 要求采用定长顺序存储表示,并且不允许调用串的基本操作。 2.编写算法,在串的堆存储机构上实现串的插入操作StrInsert(&S,pos,T)和串的删除操作StrDelete(&S,pos,len)。 第6章树和二叉树 【书面作业】 1.试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。 2.对题1所得各种形态的二叉树,分别写出前序、中序和后序遍历的序列。 3.请对下图所示的二叉树进行后序线索化,为每个空指针建立相应的前驱或后继线索。 4.分别画出和下列树对应的各个二叉树: 5.画出和下列二叉树对应的森林: (a) (b) (c) (d) 6.假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。 试为这8个字母设计哈夫曼编码(按右子树根结点的权小于等于左子树根结点的权构造Huffman树)。 7.假设一棵二叉树的先序序列为EBADCFHGIKJ和中序序列为ABCDEFGHIJK。 请画出该树。 【上机作业】 (1)建立一棵二叉树,实现层序遍历 (2)赫夫曼编码与译码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 16 作业
![提示](https://static.bdocx.com/images/bang_tan.gif)