




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
资料收集于网络 如有侵权请联系网站 删除 谢谢 第二章 线性表2.1 填空题 (1)一半 插入或删除的位置 (2)静态 动态 (3)一定 不一定 (4)头指针 头结点的next 前一个元素的next2.2 选择题 (1)A (2) DA GKHDA EL IAF IFA(IDA) (3)D (4)D (5) D2.3 头指针:在带头结点的链表中,头指针存储头结点的地址;在不带头结点的链表中,头指针存放第一个元素结点的地址; 头结点:为了操作方便,在第一个元素结点前申请一个结点,其指针域存放第一个元素结点的地址,数据域可以什么都不放; 首元素结点:第一个元素的结点。2.4已知顺序表L递增有序,写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。void InserList(SeqList *L,ElemType x) int i=L-last; if(L-last=MAXSIZE-1) return FALSE; /顺序表已满 while(i=0 & L-elemix) L-elemi+1=L-elemi; i-; L-elemi+1=x; L-last+;2.5 删除顺序表中从i开始的k个元素int DelList(SeqList *L,int i,int k) int j,l; if(iL-last) printf(The Initial Position is Error!); return 0; if(k=L-last) L-last=L-last-k; /*modify the length*/ for(j=i-1,l=i+k-1;llast;j+,l+) L-elemj=L-eleml; L-last=L-last-k; return 1;2.6 已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,删除线性表中所有值为item的数据元素。算法1void DeleteItem(SeqList *L,ElemType item) int i=0,j=L-last; while(ij) while(ielemi!=item) i+; while(ielemi=item) j-; if(ielemi=L-elemj; i+; j-; L-last=i-1;算法2void DeleteItem (SeqList *L,ElemType e)int i,j;i=j=0;while(L-elemi!=e & ilast)i+;j=i+1;while(jlast)while(L-elemj=e & jlast)j+;if(jlast)L-elemi=L-elemj;i+; j+;L-last=i-1;2.7 编写算法,在一非递减的顺序表L中,删除所有值相等的多余元素。要求时间复杂度为O(n),空间复杂度为O(1)。void DeleteRepeatItem(SeqList *L) int i=0,j=1; while(jlast) if(L-elemi=L-elemj) j+; else L-elemi+1=L-elemj; i+; j+; L-last=i; 2.8已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度。void DelData(LinkList L,ElemType mink,ElemType maxk)Node *p=L-next,*pre=L;while(!p & p-data next;while(p) if(p-data maxk) break; else pre-next=p-next; free(p); p=pre-next; T(n)=O(n);2.9试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1, a2., an)逆置为(an, an-1,., a1)。(1) 以一维数组作存储结构。(2) 以单链表作存储结构。(略)(1)void ReverseArray(ElemType a,int n)int i=0,j=n-1;ElemType t;while(inext; L-next=NULL; while(p!=NULL) q=p-next; p-next=L-next; L-next=p; p=q; 2.10已知一个带有表头结点的单链表,假设链表只给出了头指针L。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data域的值,并返回1;否则,至返回0。(提示:设置两个指针,步长为k)int SearchNode(LinkList L,int k)Node *p=L,*q;int i=0;while(inext; if(p=NULL) return 0; /不存在倒数第k个元素q=L-next;while(p-next!=NULL) /p到终点时,q所指结点为倒数第k个q=q-next; p=p-next;printf(%d,q-data);return 1;2.11把元素递增排列的链表A和B合并为C,且C中元素递减排列,使用原空间。(头插法)LinkList ReverseMerge(LinkList *A, LinkList *B) LinkList C; Node *pa=A-next,*pb=B-next; /pa和pb分别指向A,B的当前元素 A-next=NULL; C=A; while(pa!=NULL & pb!=NULL) if(pa-data data) /*将pa的元素前插到pc表*/ temp=pa-next; pa-next=C-next; C-next=pa; pa=temp; else temp=pb-next; pb-next=C-next; C-next=pb; pb=temp; /*将pb的元素前插到pc表*/ while(pb!=NULL) temp=pa-next; pa-next=C-next; C-next=pa; pa=temp; /*将剩余pa的元素前插到pc表*/ while(pb!=NULL) temp=pb-next; pb-next=C-next; C-next=pb; pb=temp; /*将剩余pb的元素前插到pc表*/ return hc;2.12一单链表,以第一个元素为基准,将小于该元素的结点全部放到前面,大于该结点的元素全部放到后面。时间复杂度要求为O(n),不能申请新空间。void AdjustList(LinkList L) Node *pFlag=L-next,*q=L-next-next,*temp=NULL; pflag-next=NULL; while(q!=NULL) if(q-data data) /插到链表首端 temp=q-next; q-next=L-next; L-next=q; q=temp; Else /插到pFlag结点后面 temp=q-next; q-next=pFlag-next; pFlag-next=q; q=temp; 2.13假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表某个结点的指针,试编写算法在链表中删除指针s所指结点的前驱结点。void DelPreNode(Node* s) Node* p=s; while(p-next-next!=s) p=p-next; free(p-next); p-next=s;2.14已知由单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其他字符),试编写算法来构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。/L为待拆分链表/Lch为拆分后的字母链;Lnum为拆分后的数字链,Loth为拆分后的其他字符链/Lch,Lnum,Loth均已被初始化为带头结点的单循环链表,采用头插法void splitLinkList(LinkList L,LinkList Lch,LinkList Lnum,LinkList Loth) Node *p=L-next; while(p!=NULL) if( (p-data =a & p-datadata = A & p-datanext; p-next=Lch-next; Lch-next=p; p= temp; else if(p-data =0 & p-datanext; p-next=Lnum-next; Lnum-next=p; p= temp; elsetemp=p-next; p-next=Loth-next; Loth-next=p; p= temp; 2.15设线性表A=(a1, a2,am),B=(b1, b2,bn),试写一个按下列规则合并A、B为线性表C的算法,使得: C= (a1, b1,am, bm, bm+1, ,bn) 当mn时;或者 C= (a1, b1,an, bn, an+1, ,am) 当mn时。线性表A、B、C均以单链表作为存储结构,且C表利用A表和B表中的结点空间构成。注意:单链表的长度值m和n均未显式存储。/将A和B合并为C,C已经被初始化为空单链表mineral n. 矿物;矿石void MergeLinkList(LinkList A,LinkList B,LinkList C) Node *pa=A-next,*pb=B-next,*pc=C; int tag=1; while(pa & pb) if(tag)pc-next=pa-next; pc=pc-next; pa=pa-next; tag=1;else pc-next=pb-next; pc=pc-next; pb=pb-next; tag=0; if(pa) pc-next=pa-next; else pc-next=pb-next; s2.16将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式中各自仅含奇次项或偶次项,并要求利用原链表中的结点空间来构成这两个链表。/A为循环单链表,表示某多项式;将A拆分为B和C/其中B只含奇次项,C只含偶次项;奇偶按照幂次区分/B,C均已被初始化为带头结点的单链表void SplitPolyList(PolyList A,PolyList B,PolyList C) PolyNode *pa=A-next,*rb=B,*rc=C; while(pa) if(pa-exp%2=0) /偶次项rc-next=pa-next; rc=rc-next; pa=pa-next; else /奇次项rb-next=pa-next; rb=rb-next; pa=pa-next; rb-next=NULL; rc-next=NULL;2.17建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。void BinAdd(LinkList l) /*用带头结点的单链表L存储二进制数,实现加1运算*/ Node *q,*r, *s; q=l-next; r=l; while(q!=NULL) /*查找最后一个值域为0的结点*/ if(q-data = 0)r = q; q = q-next; if (r != l) r-data = 1; /*将最后一个值域为0的结点的值域赋为1*/ else /*未找到值域为0的结点*/ s=(Node*)malloc(sizeof(Node); /*申请新结点存放最高进位*/s-data=1; /*值域赋为1*/s-next=L-next; L-next = s; /*插入
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年外贸企业招聘面试英语模拟题集
- 2025年电力变压器知识考试题库及答案
- 猪场粪便处理与回收方案
- 生猪养殖场消毒管理方案
- 保障性租赁住房租户审核与分配方案
- 2025年大模型分布式训练框架试题(含答案与解析)
- 放射科三基三严定期培训考核计划
- 保障性租赁住房物业管理方案
- 深度解析:2025年基因检测在生物产业市场预测中的应用与市场潜力研究报告
- 课程改革下小学语文中的美育渗透研究
- 2024数据要素典型案例集
- 二甲药剂科培训材料
- 医院科室副主任竞聘
- 《路由与交换技术》教学大纲
- 博士后研究报告(出站)
- 新人教版七年级上册生物全册教案(2024年秋季新版教材)
- 高标准农田改造提升建设项目投标方案(技术标)
- 汽车产品使用说明书
- 关于天然气安全知识
- (高清版)DZT 0331-2020 地热资源评价方法及估算规程
- 体育消费及消费者行为
评论
0/150
提交评论