- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
线性表习题答案[精选]
线性表习题 作业中普遍存在的问题: 自己定义的数据类型不写出其定义,而直接使用它定义变量; 混淆顺序表和链表的操作; 对函数的类型、形参类型以及形参个数不斟酌,随意乱定。 1. 指出以下算法中的错误和低效(即费时)之处,并将它改为一个既正确又高效的算法。 int DeleteK(SqList *a,int i,int k) { //本过程从顺序存储结构的线性表a中删除第i个元素 起的k个元素 int count,j; if(i1 || k0 || i+ka-length) return INFEASIBLE; //参数不合法 else { for(count=1;countk;count++) { //删除一个元素 for(j=a-length;j=i+1;j--) a-elem[j-1]=a-elem[j]; a-length--; } return OK; } }//DeleteK 参考答案: 本题给出的算法的低效之处在第二个循环,该算法的 时间复杂度O(n)=k*(a-length-i) 本题给出的算法的错误之处有: countk:导致少删除一个元素 for(j=a-length;j=i+1;j--) a-elem[j-1]=a-elem[j]; 导致元素的搬移顺序逆反了。 修改后的算法如下: int ModifyDeleteK(SqList *a,int i,int k) { //本过程从顺序存储结构的线性表a中删除第i个 元素起的k个元素 int j; if(i1 || k0 || i+ka-length) return INFEASIBLE; //参数不合法 else { for(j=i+k;j=a-length;j++) //删除k个元素 a-elem[j-k]=a-elem[j]; a-length-=k; return OK; } }//ModifyDeleteK 2. 试写一算法在带头结点的单链表结构上实现线性表操作LOCATE(L,X)。 LinkList LOCATE(LinkList L, ElemType X) { /* 初始条件:线性表L已存在 操作结果:返回L中X第一次出现的位置的指针。 若X不存在,则返回值为NULL。 */ LinkList p; int i=0; p=L-next; while(p) { ++i; //记录遍历的每个节点的位序 if(p-data==X) //在链表L中找到X return p; p=p-next; } if(!p) return NULL; //链表L中不存在X } 3.已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起(即令其中一个表的首元结点连在另一个表的最后一个结点之后),假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。 参考答案: typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList; //线性链表类型 void MergeList_L(LinkList ha,int m,LinkList hb, int n,LinkList *hc) { /* 初始条件:单链表ha和hb存在,其长度分别为 m和n 操作结果:归并ha和hb得到新的单链表hc */ LinkList p; if(m==0) //ha链表为空链表 { *hc=hb; free(ha); } if(n==0) //hb链表为空链表 { *hc=ha; free(hb); } if(mn) //将ha链表链接在hb链表之后 { p=hb-next; while(p-next) //寻找hb链表的尾结点 p=p-next; p-next=ha-next; *hc=hb; free(ha); } else //将hb链表链接在ha链表之后 { p=ha-next; while(p-next) //寻找hb链表的尾结点 p=p-next; p-next=hb-next; *hc=ha; free(hb); } } 4.已知指针la和lb分别指向两个无头结点单链表中的首元结点。下列算法是从表la中删除自第i个元素起共len个元
文档评论(0)