




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 2 章 线性表1 .编写一个算法,往单链表里数据为w0 的结点前面插入一个给定值x 的结点。2 .写出将单链表逆置的算法。即若原单链表中存储元素的次序为a0,a1,a2,an-1 ,则单链表逆置后便为an-1,an-2,a1,a0。要求就地逆置,即不再重新开辟存储空间, 只通过调整指针 来完成,并且使用尽可能少的附加单元。3 简述以下算法的功能。(1) Status A(LinkedList L) / L 是无表头结点的单链表if (L && L->next)Q =L; L =L->next; P =L ;while ( P->next) P =P->
2、;next ;P->next =Q; Q->next = NULL; return OK; / A(2) void BB(LNode *s, LNode *q ) p =s ;while (p->next!=q) p =p->next ; p->next =s; /BBvoid AA(LNode *pa, LNode *pb) / pa 和 pb 分别指向单循环链表中的两个结点BB(pa, pb); BB(pb, pa); /AA4 指出以下算法的错误和低效(即费时)之处,并将它改写为一个既正确又高效的算法。Status DeleteK(SqList &a
3、, int i, int k)/本过程从顺序存储结构的线性表a 中删除第i 个元素起的k 个元素if(i<1 | k<0 | i+k>a.length)return INFEASIBLE;/参数不合法elsefor(count=1; count<k; count+)/删除一个元素for(j=a.length; j>=i+1; j-)a.elemj-1= a.elemj; a.length-; returnOK;/DeleteK5 试写一算法在带表头结点的单链表结构上实现线性表操作LOCATE(L,X)。6 试写一算法在带头结点的单链表结构上实现线性表操作Lengt
4、h(L) 。7 已知指针ha 和 hb 分别指向两个单链表的头结点,并且已知两个链表的长度分别为m 和n 。试写一算法将这两个链表连接在一起(即令其中一个表的首结点连在另一个表的最后一个结点之后), 假设指针hc 指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。8已知指针la和lb分别指向两个无头结点单链表中的首元结点.下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中第j个元素之前,试问此算法是否正确?若 有错,则请改正之。Status DeleteAndInsertSub(LinkedList la,LinkedLis
5、t lb,int i ,int j ,int len)if (i<0|j<0|len<0) return INFEASIBLE;p=la; k=1;while(k<i) p=p->next; k+; q=p;while(k<=len) q=q->next; k+; s=lb; k=1;while(k<j) s=s->next; k+; s->next=p; q->next=s->next; return OK;/DeleteAndInsertSub9写一个算法,实现顺序表的就地逆置,即在原表的存储空间将线性表(a1,a2,
6、.,an)逆置为(an,an-1,.,a1) 。10假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将 A 表和 B 表归并为一个按元素值递增有序(即非递增有序,允许表中含有值相同的元素)排列的线性表 C,并要求利用原表(即 A表和B表)的结点空间构造C表。第 2 章 答案1 . 编写一个算法,往单链表里数据为w0 的结点前面插入一个给定值x 的结点。Status Insert_List ( LinkList &L, ElemType w0, ElemType x ) LinkList p,r;LNode *s;P=L->next;while( p
7、&& p->data !=w0) r=p; p=p->next; if(p) s=(LNode *) malloc( sizeof(LNode); s->data=x;s->next=p;r->next=s; return OK; return ERROR;2 .写出将单链表逆置的算法。即若原单链表中存储元素的次序为a0,a1,a2,an-1 ,则单链表逆置后便为an-1,an-2,a1,a0。要求就地逆置,即不再重新开辟存储空间,只通过调整指针来完成,并且使用尽可能少的附加单元。void ReversList ( LinkList &L)
8、 LinkList p,q;if(L=NULL) return ERROR;p=L->next;L->next=NULL; while(p) q=p->next; p->next=L; L=p;p=q; return OK;3 简述以下算法的功能。(1) Status A(LinkedList L) / L 是无表头结点的单链表if (L && L->next)Q =L; L =L->next; P =L ;while ( P->next) P =P->next ;P->next =Q; Q->next = NULL;
9、return OK; / A如果存在两个及以上结点,该算法将把第一个结点插入到表尾,原来表中第二个结点变成了第一个结点。(2) void BB(LNode *s, LNode *q ) p =s ;while (p->next!=q) p =p->next ;p->next =s; /BBvoid AA(LNode *pa, LNode *pb) / pa 和 pb 分别指向单循环链表中的两个结点BB(pa, pb);BB(pb, pa); /AA形成两个独立的单循环链表,pa 和 pb 作为首结点4 指出以下算法的错误和低效(即费时)之处, 并将它改写为一个既正确又高效的算
10、法。Status DeleteK(SqList &a, int i, int k)/ 本过程从顺序存储结构的线性表a 中删除第i 个元素起的k 个元素if(i<1 | k<0 | i+k>a.length)return INFEASIBLE;/ 参数不合法elsefor(count=1; count<k; count+)/删除一个元素for(j=a.length; j>=i+1; j-)a.elemj-1= a.elemj;a.length-;returnOK;/DeleteK参数不合法的地方有错i<1 | i>a.length | k<
11、0 | i+k>a.length低效的地方是每次删除一个元素都要逐个移动元素,实际上可以一次移到地方for(j=i;j<=a.length-k;j+)a.elemj=a.elemj+k;a.length-=k;LOCATE(L,X)。5 试写一算法在带表头结点的单链表结构上实现线性表操作int LOCATE(LinkList L, ElemType X) int i=0;LinkList p;p=L->next;while(p && p->data!=X) p=p->next;i+; return i;6 试写一算法在带头结点的单链表结构上实现线性
12、表操作Length(L) 。int Length(LinkList L)int i=0;LinkList p;p=L->next;while(p)p=p->next;i+; return i;7 已知指针ha 和 hb 分别指向两个单链表的头结点,并且已知两个链表的长度分别为m 和 n 。试写一算法将这两个链表连接在一起(即令其中一个表的首结点连在另一个表的最后一个结点之后), 假设指针hc 指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。void MergeList ( LinkList ha,LinkList hb,int m,in
13、t n,LinkList &hc)LinkList p,q;if(m<n)hc=ha;p=ha->next;q=p;while(p) q=p;p=p->next;p=hb;q->next=hb->next;free(p);elsehc=hb;p=hb->next;q=p;while(p)q=p;p=p->next;p=ha;q->next=ha->next;free(p);时间复杂度为O(min(m,n)8 已知指针la 和 lb 分别指向两个无头结点单链表中的首元结点.下列算法是从表la 中删除自第 i 个元素起共len 个元素后
14、,将它们插入到表lb 中第 j 个元 b 素之前 ,试问此算法是否正确?若有错,则请改正之。Status DeleteAndInsertSub(LinkedList la,LinkedList lb,int i ,int j ,int len)if (i<0|j<0|len<0) return INFEASIBLE;p=la; k=1;while(k<i) p=p->next; k+; q=p;while(k<=len) q=q->next; k+; s=lb; k=1;while(k<j) s=s->next; k+; s->nex
15、t=p; q->next=s->next;preturn OK;/DeleteAndInsertSubStatus DeleteAndInsertSub(LinkedList la,LinkedList lb,int i ,int j ,int len)LinkList p,q,s;if (i<0|j<0|len<0) return INFEASIBLE;p=la; k=1;while(p&&k<i) p=p->next; k+; if(p=NULL) return INFEASIBLE;q=p;k=0;while(q&&
16、;k<=len) q=q->next; k+;if(q=NULL) return INFEASIBLE;s=lb; k=1;while(s&&k<j) s=s->next; k+; if(s=NULL) return INFEASIBLE;q->next=s->next;s->next=p;return OK;/DeleteAndInsertSub9 写一个算法,实现顺序表的就地逆置,即在原表的存储空间将线性表(a1,a2,.,an )逆置为(an,an-1,.,a1) 。void revers(SqList &L)int i;ElemType t;for(i=0;i<L.length/2;i+) t=L.elemi;elemi=elemL.length-1-i;elemL.length-1-i=t; return OK;10假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A 表和 B 表归并为一个按元素值递增有序(即非递减有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即 A表和B表)的结点空间构造C表。Status MergeList(LinkList A,LinkLi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年绿色金融产品创新模式与风险管理分析报告
- 现场作业讲评课件
- 上海市嘉定区嘉定二中2026届高三上化学期中预测试题含解析
- 2025年营养师考试模拟试卷:冲刺阶段营养干预方案设计
- 2025年电气工程师考试试卷:电气自动化控制专项训练
- 2025年银行从业资格考试 银行法律法规专项训练试卷
- 2025年电气工程师考试重点难点 电气设计专项训练试题集
- 2025年小学数学毕业升学考试综合题型冲刺试卷
- 2025年小学数学毕业升学考试易错题型解析与应用模拟试卷
- 新疆伊宁生产建设兵团五校联考2026届化学高一上期中复习检测试题含解析
- 纸品供应及质量保证措施
- 2025年北京市中考物理试卷真题(含答案)
- 2025年安徽高考地理试卷真题(含答案)
- 安全数据脱敏技术
- 膝关节损伤康复护理讲课件
- 社区儿童主任培训课件
- 工厂行车吊装方案(3篇)
- 私企公司车辆管理制度
- 2025年上海市中考语文试卷真题(含答案及解析)
- 2025-2030年中国油田服务行业市场运行分析及竞争格局与投资发展研究报告
- 交房活动仪式策划方案
评论
0/150
提交评论