1、1第二章 线性表一名词解释1. 线性结构 2.数据结构的顺序实现 3.顺序表 4.链表 5.数据结构的链接实现6. 建表 7.字符串 8.串 9.顺序串 10.链串二、填空题1.为了便于讨论,有时将含 n(n=0)个结点的线性结构表示成(a 1,a 2,an),其中每个 ai代表一个_。a 1称为_结点,a n称为_结点,i 称为 ai在线性表中的_或_。对任意一对相邻结点 ai、a i1 (1=1)个内存单元,其中,b 是顺序表的第一个存储结点的第一个单元的内存地址,那么,第 i个结点 ai的存储地址为_。10.以下为顺序表的插入运算,分析算法,请在_处填上正确的语句。Void insert
2、_sqlist(sqlist L,datatype x,int i)/*将 X插入到顺序表 L的第 i-1个位置*/ if( L.last = maxsize) error(“表满”);if(iL.last+1)error(“非法位置”);for(j=L.last;j=i;j-)_;L.datai-1=x;L.last=L.last+1;11.对于顺序表的插入算法 insert_sqlist来说,若以结点移动为标准操作,则插入算法的最坏时间复杂性为_,量级是_。插入算法的平均时间复杂性为_,平均时间复杂性量级是_。12.以下为顺序表的删除运算,分析算法,请在_处填上正确的语句。void del
3、ete_sqlist(sqlist L,int i) /*删除顺序表 L中的第 i-1个位置上的结点*/if(iL.last)error(“非法位置”);for(j=i+1;j=L.last;j+)_;L.last=L.last-1;13.对于顺序表的删除算法 delete_sqlist来说,若以结点移动为标准操作,最坏情况时间复杂性及其量级分别是_和_,其平均时间复杂性及其量级分别为2_和_。14.以下为顺序表的定位运算,分析算法,请在_处填上正确的语句。int locate_sqlist(sqlist L,datatype X) /*在顺序表 L中查找第一值等于 X的结点。若找到回传该结点
4、序号;否则回传 0*/_;while(iL.last)if(_)return(i);else return(0);15.对于顺序表的定位算法,若以取结点值与参数 X的比较为标准操作,平均时间复杂性量级为_。求表长和读表元算法的时间复杂性为_。16.在顺序表上,求表长运算 LENGTH(L)可通过输出_实现,读表元运算GET(L,i)可通过输出_实现。17.线性表的常见链式存储结构有_、_和_。18.单链表表示法的基本思想是用_表示结点间的逻辑关系。19.所有结点通过指针的链接而组织成_。20.为了便于实现各种运算,通常在单链表的第一个结点之前增设一个类型相同的结点,称为_,其它结点称为_。21
5、.在单链表中,表结点中的第一个和最后一个分别称为_和_。头结点的数据域可以不存储_,也可以存放一个_或_。22.单链表 INITIATE(L)的功能是建立一个空表。空表由一个_和一个_组成。23.INITIATE()的功能是建立一个空表。请在_处填上正确的语句。lklist initiate_lklist() /*建立一个空表*/_;_;return(t);24.以下为求单链表表长的运算,分析算法,请在 _处填上正确的语句。int length_lklist(lklist head) /*求表 head的长度*/_;j=0;while(p-next!=NULL)_;j+;return(j);
6、/*回传表长*/25.以下为单链表按序号查找的运算,分析算法,请在_处填上正确的语句。pointer find_lklist(lklist head,int i) p=head;j=0;while(_) p=p-next; j+; if(i=j) return(p);3else return(NULL);26.以下为单链表的定位运算,分析算法,请在_处填上正确的语句。int locate_lklist(lklist head,datatype x)/*求表 head中第一个值等于 x的结点的序号。不存在这种结点时结果为 0*/ p=head;j=0;while(_)p=p-next;j+;if
7、 (p-data=x) return(j);else return(0);27.以下为单链表的删除运算,分析算法,请在_处填上正确的语句。void delete_lklist(lklist head,int i) p=find_lklist(head,i-1);if(_) q=_;p-next=p-next;free(q);else error(“不存在第 i个结点” )28.以下为单链表的插入运算,分析算法,请在_处填上正确的语句。void insert_lklist(lklist head,datatype x,int i)/*在表 head的第 i个位置上插入一个以 x为值的新结点*/
8、p=find_lklist(head,i-1);if(p=NULL)error(“不存在第 i个位置” );else s=_;s-data=x;s-next=_;p-next=s;29.以下为单链表的建表算法,分析算法,请在_处填上正确的语句。lklist create_lklist1()/*通过调用 initiate_lklist和 insert_lklist算法实现的建表算法。假定$是结束标志*/ ininiate_lklist(head);i=1;scanf(“%f”,while(x!=$)_;_;scanf(“%f”,return(head);4该建表算法的时间复杂性约等于_,其量级为
9、_。30.以下为单链表的建表算法,分析算法,请在_处填上正确的语句。lklist create_lklist2() /*直接实现的建表算法。*/ head=malloc(size);p=head;scanf(“%f”,while(x!=$) q=malloc(size);q-data=x;p-next=q;_;scanf(“%f”,_;return(head);此算法的量级为_。31除单链表之外,线性表的链式存储结构还有_和_等。32循环链表与单链表的区别仅仅在于其尾结点的链域值不是_,而是一个指向_的指针。33在单链表中若在每个结点中增加一个指针域,所含指针指向前驱结点,这样构成的链表中有两
10、个方向不同的链,称为_。34C 语言规定,字符串常量按_处理,它的值在程序的执行过程中是不能改变的。而串变量与其他变量不一样,不能由_语句对其赋值。35含零个字符的串称为_串,用_表示。其他串称为_串。任何串中所含_的个数称为该串的长度。36当且仅当两个串的_相等并且各个对应位置上的字符都_时,这两个串相等。一个串中任意个连续字符组成的序列称为该串的_串,该串称为它所有子串的_串。37串的顺序存储有两种方法:一种是每个单元只存一个字符,称为_格式,另一种是每个单元存放多个字符,称为_格式。38通常将链串中每个存储结点所存储的字符个数称为_。当结点大小大于 1时,链串的最后一个结点的各个数据域不
11、一定总能全被字符占满,此时,应在这些未用的数据域里补上_。三、单向选择题1对于线性表基本运算,以下结果是正确的是 ( )初始化 INITIATE(L),引用型运算,其作用是建立一个空表 L=. 求表长 LENGTH(L),引用型运算,其结果是线性表 L的长度读表元 GET(L,i), 引用型运算。若 1data 是一个数据元素,p-next 的值是一个指针11.单链表的一个存储结点包含 ( )数据域或指针域指针域或链域指针域和链域数据域和链域12.对于单链表表示法,以下说法错误的是 ( )数据域用于存储线性表的一个数据元素指针域或链域用于存放一个指向本结点所含数据元素的直接后继所在结点的指针所
12、有数据通过指针的链接而组织成单链表6NULL 称为空指针,它不指向任何结点,只起标志作用13.对于单链表表示法,以下说法错误的是 ( )指向链表的第一个结点的指针,称为头指针单链表的每一个结点都被一个指针所指任何结点只能通过指向它的指针才能引用终端结点的指针域就为 NULL尾指针变量具标识单链表的作用,故常用尾指针变量来命名单链表14有时为了叙述方便,可以对一些概念进行简称,以下说法错误的是 ( )将“指针型变量”简称为“指针”将“头指针变量”称为“头指针”将“修改某指针型变量的值”称为“修改某指针”将“p 中指针所指结点”称为“P 值”15设指针 P指向双链表的某一结点,则双链表结构的对称性
13、可用( )式来刻画 p-prior-next-=p-next-next p-prior-prior-=p-next-prior p-prior-next-=p-next-prior p-next-next=p-prior-prior16.以下说法错误的是 ( ) 对循环链表来说,从表中任一结点出发都能通过前后操作而扫描整个循环链表对单链表来说,只有从头结点开始才能扫描表中全部结点双链表的特点是找结点的前趋和后继都很容易对双链表来说,结点*P 的存储位置既存放在其前趋结点的后继指针域中,也存放在它的后继结点的前趋指针域中。17在循环链表中,将头指针改设为尾指针(rear)后,其头结点和尾结点的存
14、储位置分别是 ( )real 和 rear-next-nextrear-next 和 realrear-next-next 和 rearrear 和 rear-next18.以下说错误的是 ( ) 对于线性表来说,定位运算在顺序表和单链表上的量级均为 O(n)读表元运算在顺序表上只需常数时间 O(1)便可实现,因此顺序表是一种随机存取结构在链表上实现读表元运算的平均时间复杂性为 O(1)链入、摘除操作在链表上的实现可在 O(1)时间内完成链入、摘除操作在顺序表上的实现,平均时间复杂性为 O(n)19在串的基本运算中,属于加工型运算的有 ( )EQAL(S,T) LENGTH(S)CONCAT(
15、S,T) REPLACE(S,T,R) INDEX(S,T)20. 在串的基本运算中,属于引用型运算的有 ( )ASSIGN(S,T) INSERT(S1,i,S2)DELETE(S,i,j) SUBSTR(S,i,j) REPLACE(S,T,R)21循环链表主要优点是 ( )不再需要头指针了7已知某个结点的位置后,能够容易找到它的直接前趋在进行插入、删除运算时,能更好地保证链表不断开从表中任一结点出发都能扫描到整个链表22,每种数据结构都具备三个基本操作:插入、删除和查找,这种说法 ( )正确 错误23以下说法错误的是 ( )数据的物理结构是指数据在计算机内实际的存储形式算法和程序没有区别
16、,所以在数据结构中二者是通用的对链表进行插人和删除操作时,不必移动结点双链表中至多只有一个结点的后继指针为空24以下说法正确的是线性结构的基本特征是:每个结点有且仅有一个直接前趋和一个直接后继线性表的各种基本运算在顺序存储结构上的实现均比在链式存储结构上的实现效率要低在线性表的顺序存储结构中,插人和删除元素时,移动元素的个数与该元素位置有关顺序存储的线性表的插人和删除操作不需要付出很大的代价,因为平均每次操只有近一半的元素需要移动25以下说法错误的是 ( )求表长、定位这二种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低顺序存储的线性表可以随机存取由于顺序存储要求连续的存
17、储区域,所以在存储管理上不够灵活线性表的链式存储结构优于顺序存储结构26以下说法错误的是 ( )线性表的元素可以是各种各样的,逻辑上相邻的元素在物理位置上不一定相邻在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上不一定相邻在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素27以下说法正确的是( )在单链表中,任何两个元素的存储位置之间都有固定的联系,因为可以从头结点进行查找任何一个元素在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构顺序存储结构属于静态结构,链式结构
18、属于动态结构顺序存储方式只能用于存储线性结构28.以下说法正确的是( )顺序存储方式的优点是存储密度大、且插入、删除运算效率高链表的每个结点中都恰好包含一个指针线性表的顺序存储结构优于链式存储结构顺序存储结构属于静态结构,链式结构属于动态结构29.下面关于线性表的叙述正确的是( )线性表采用顺序存储,必须占用一片连续的存储单元线性表采用顺序存储,便于进行插人和删除操作线性表采用链接存储,不必占用一片连续的存储单元8线性表采用链接存储,不便于插人和删除操作30.线性表 L=(a1,a2,.,ai,.,an),下列说法正确的是( )每个元素都有一个直接前驱和直接后继线性表中至少要有一个元素表中诸元
19、素的排列顺序必须是由小到大或由大到小的除第一个元素和最后一个元素外其余每个元素都有一个且仅有一个直接前驱和直接后继31.线性表的逻辑顺序与存储顺序总是一致的,这种说法( )正确 不正确32.设 p,q是指针,若 p=q,则*p=*q ,这种说法( ) 正确 不正确33.线性表若采用链表存储结构时,要求内存中可用存储单元的地址( )必需是联系的 部分地址必须是连续的一定是不连续的 连续不连续都可以34.设 REAR是指向非空带头结点的循环单链表的尾指针,则删除表首结点的操作可表示为( )p=rear; rear=rear-next;rear=rear-next; free(rear);free(
20、p)rear=rear-next-next; p=rear-next-next;free(rear); rear-next-next=p-next;free(p); 35. 单链表中,增加头结点的目的是为了 ( )使单链表至少有一个结点 标示表结点中首结点的位置方便运算的实现 说明单链表是线性表的链式存储实现36线性结构中的一个结点代表一个数据元素,通常要求同一线性结构的所有结点所代表的数据元素具有相同的特性,这意味着 每个结点所代表的数据元素都一样。 每个结点所代表的数据元素包含的数据项的个数要相等 不仅数据元素包含的数据项的个数要相同,而且对应数据项的类型要一致 结点所代表的数据元素有同一
21、特点37带头结点的单链表 Head为空的判定条件是Head=Null Head-next=NULL Head-next=Head38.非空的单循环链表 L的尾结点*P,满足P-next=NULL P=NULL P-next=L P=L.39.双向链表结点结构如下:LLink data RLink其中:LLink 是指向前驱结点的指针域:data是存放数据元素的数据域;Rlink是指向后继结点的指针域。下面给出的算法段是要把一个新结点*Q 作为非空双向链表中的结点*p 的前驱,插入到此双向链表中。不能正确完成要求的算法段是Q-LLink=P-LLink; P-LLink=Q;Q-Rlink=P;
22、 Q-Rlink=P;P-LLink=Q; P-LLink-Rlink=Q;9P-LLink-Rlink=Q; Q-LLink=P-LLink;Q-LLink=P-LLink;Q-Rlink=P;P-LLink-Rlink=Q;P-LLink=Q;40.若某线性表中最常用的操作是取第 i个元素和找第 i个元素的前趋元素,则采用( )存储方式最节省时间。顺序表 单链表 双链表 单循环链表41串是任意有限个符号构成的集合 符号构成的序列字符构成的集合 字符构成的序列四、简答及应用1 请用类 C语言描述顺序表,并予以解释说明。2 请用类 C语言描述单链表的类型定义,并予以解释说明。3 请用类 C语言
23、描述双链表的类型定义,并予以解释说明。4 请用类 C语言描述顺序串的类型定义。5 请用类 C语言描述链串的类型定义。6.叙述以下概念的区别:头指针变量、头指针、头结点、首结点,并说明头指针变量和头结点的作用。7有哪些链表可仅由一个尾指针来惟一确定,即从尾指针出发能访问到链表上任何一个结点。8简述下列每对术语的区别:空串和空格串;串变量和串常量;主串和子串;串变量的名字与串变量的值。9设有 A=” ”,B=“mule“,C=“old“,D=“my“,试计算下列运算的结果(注:A+B 是CONCAT(A,B)的简写,A=“ “的 “ “含有两个空格)。(a) A+B(b) B+A(c) D+C+B
24、(d) SUBSTR(B,3,2)(e) SUBSTR(C,1,0)(f) LENGTH(A)(g) LENGTH(D)(h) INDEX(B,D)(i) INDEX(C,“d“)(j) INSERT(D,2,C)(k) INSERT(B,1,A)(l) DELETE(B,2,2)(m) DELETE(B,2,0)10.已知:S=“(xyz)*“,T=“(x+z)*y“。试利用连接、求子串和置换等基本运算,将 S转换为T。五、算法设计1 设 A=(a 1,a2,a3,an)和 B=(b1,b2, .,bm)是两个线性表(假定所含数据元素均为整数) 。若 n=m且 ai=bi(i=1, .,n)
25、,则称 A=B;若 ai=bi(i=1, .,j)且aj+1B。是编写一个比较 A和 B的算法,当10AB是分别输出-1,0 或者 1。2,试编写在无头结点的单链表上实现线性表基本运算 LOCATE(L,X)、INSERT(L,X,i)和DELETE(L,i)的算法,并和在带头结点的单链表上实现相的算法进行比较。3试编写在不带头结点的单链表上实现线性表基本运算 LENGTH(L)的算法。4假设有两个按数据元素值递增有序排列的线性表 A和 B,均以单链表作存储结构。编写算法将 A表和 B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表 C,并要求利用原表(即 A表和 B表的)
26、结点空间存放表 C。5设有线性表 A=(a1,a2, .,am)和 B=(b1,b2, .,bn).试写合并 A、B 为线性表 C的算法,使得:C=;)a,.nb,a.,1( 当当假设 A、B 均以单链表为存储结构(并且 m、n 显示保存)。要求 C也以单链表为存储结构并利用单链表 A、B 的结点空间。6,设线性表存放在向量 Aarrsize的前 elenum分量中,且递增有序。试写一算法,将 X插入到线性表的适当位置上,以保持线性表的有序性,并且分析算法的时间复杂性。7已知单链表 L中的结点是按值非递减有序排列的,试写一算法将值为 x的结点插入表 L中,使得 L仍然有序。8,试分别以顺序表和
27、单链表作存储结构,各写一个实现线性表的就地(即使用尽可能少的附加空间)逆置的算法,在原表的存储空间内将线性表(a 1,a 2, .,an)逆置为(a n, .,a2,a1)。9假设分别以两个元素值递增有序的线性表 A、B 表示两个集合(即同一线性表中的元素各不相同),现要求构成一个新的线性表 C,C 表示集合 A与 B的交,且 C中元素也递增有序。试分别以顺序表和单链表为存储结构,填写实现上述运算的算法。10,已知 A、B 和 C为三个元素值递增有序的线性表,现要求对表 A作如下运算: 删去那些既在表 B中出现又在表 C中出现的元素。试分别以两种存储结构(一处种顺序结构,一种链式的)编写实现上
28、述运算的算法。11假设在长度大于 1的循环链表中,既无头结点也无头指针。s 为指向链表中某个结点的指针,试编写算法删除结点*s 的前趋结点。12已知一单链表中的数据元素含有三个字符(即:字母字符、数字字符和其它字符)。试编写算法,构造三个循环链表,使每个循环链表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间(头结点可另辟空间)。13.(Josephus环)任给正整数 n、k,按下述方法可得排列 1,2,,n 的一个置换:将数字1,2, .,n环形排列(如图算法设计题 13.所示),按顺时针方向从 1开始 计数;计满 K时输出该为之上的数字(并从环中删去该数字),然后从下一个数
29、字开始继续计数,直到环中所有数字均被输出为止。例如,n=10,k=3 时,输出的置换是3,6,9,2,7,1,8,5,10,4。试编写一算法,对输人的任意正整数 n、k,输出相应的置换1114在双链表上实现线性表的下列基本运算(a)初始化; (b)定位(c)插入(d)删除。15设有一双链表,每个结点中除有 prior、data 和 next三个域外,还有一个访问频度域freq,在链表被起用之前,其值均初始化为零。每当在双链表上进行一次 LOCATEL,X)运算时,令元素值为 X的结点中 freq域的值增 1,并使此链表中结点保持按访问频度递减的顺序排列,以便使频繁访问的结点总是靠近表头。试编写
30、实现符合上述要求的 LOCATE运算的算法。16若 X和 Y是用结点大小为 1单链表表示的串,设计一个算法找出 X中第一个不在 y中出现的字符。17在顺序串上实现串的判等运算 EQUAL(S,T)。18在链串上实现判等运算 EQUAL(S,T)。19若 S和 T是用结点大小为 1的单链表存储的两个串(S、T 为头指针) ,设计一个算法将串 S中首次与串 T匹配的子串逆值。20用串的其他运算构造串的子串定位运算 index。第二章 参考答案一、名词解释 (略)二、填空题1、结点 起始 终端 序号 位置 前趋 后趋2、() 3、前趋 前趋 后趋 后趋4、线性 5、线性 长度 表长 6、空表7、初始
31、化 INITLATE(L) 求表长 LENGTH(L) 读表长 GET(L,i) 定位 LOCATE(L,X) 插入 INSERT(L,X,i) 删除 DELETE(L,i)8、逻辑结构中相邻的结点在存储结构中仍相邻9、b+(i-1)x k10、Ldataj=Ldataj-111、n O(n) n/2 O(n)12、L.dataj-2=l.dataj-113、n-1 o(n) (n-1)/2 O(n)14、i=1 iL.last15、O(n) O(1)16、L.last L.datai-117、单链表 循环链表 双链表18、指针 19,单链表20、头结点 表结点21、首结点 尾结点 任何信息、
32、特殊标志 表长22、头结点 头结点23、t=malloc(size) t-next=NULL24、p=haed p=p-next1225、(p-next!=NULL)sqlist;sqlist L;数据域 data是一个一维数组,线性表的第 1,2,n 个元素分别存放在此数组的第 0,1,last-1 个分量中,数据域 last表示线性表当前的长度,而 last-1是线性表的终端结点在顺序表中的位置。常数 maxsize称为顺序表的容量,从 last到 maxsize-1为顺序表当前的空闲区(或称备用区)。Sqlist类型完整地描述了顺序表的组织。L 被说明为 sqlist类型的变量,即为一顺
33、序表,其表长应写为 L.last,而它的终端结点则必须写为 L.dataL.last-1。2、假设数据元素的类型为 datatype。单链表的类型定义如下:typedef struct node *pointerstruct nodedatatype data;13pointer next;typedef pointer lklist;其中,ponter 是指向 struct node类型变量的指针类型;struct node 是结构体类型规定一个结点是由两个域 data和 next组成的记录,其中 data的结点的数据域,next是结点的链域;lklist 与 pointer相同类型,用来说
34、明头指针变量的类型,因而 lklist也就被用来作为单链表的类型。3、typedef struct dnode *dpointer;struct dnodedatatype data;dpointer prior,next;typedaf dpinter dlklist;链域 prior和 next分别指向本结点数据域 data所含数据元素的直接前趋和直接后继所在的结点。所有结点通过前趋和后继指针链接在一起,再加上起标识作用的头指针,就得到双向循环链表。4、顺序串的类型定义与顺序表类似,可描述如下:const maxlen=串的最大长度typedef struct char chmaxleni
35、nt curlen;string5、链串的类型定义为:const nodesize=用户定义的结点大小;typedef struct node *pointer;struct nodechar chnodesizepoinernext;typedef pointer strlist;当结点大小为 1时,可将 ch域简单地定义为:char ch6、head 称为头指针变量,该变量的值是指向链表的第一个结点的指针,称为头指针。头指针变量是用于存放头指针的变量。为了便于实现各种运算,通常在单链表的第一个结点之前增设一个类型相同的结点,称为头结点。其它结点称为表结点。表结点中和第一个和最后一个分别称为
36、首结点和尾结点。 头指针变量的作用:对单链表中任一结点的访问,必须首先根据头指针变量中存放的头指针找到第一个结点,再依次按各结点链域存放的指针顺序往下找,直到找到或找不到。头指针变量具有标识单链表的作用,故常用头指针变量为命名单链表。14头结点的作用:头结点的数据域可以不存储任何信息,也可以存放一个特殊标志或表长。其作用是为了对链表进行操作时,将对第一个结点煌处理和对其它结点的处理统一起来。7、循环单链表、循环双链表。;五、算法设计1、 分析:(1)当 A、B 表都不为空时,比较 A,B 表中各元素对应位置的内容的大小,进而判断 A,B 的大小。(2)当 A,B 表都不为空时,且 A,B 表中
37、各各元素对应位置的内容相同时,比较 A,B 的长度,进而判断 A,B 的大小或是否相等。const maxsize=顺序表的容量;typedef structint datamaxsizeint last;sqlist;int CMP_sqlist(sqlist A ,sqlist B) for (i=0;(iB.datai)return(1);if(A.last= =B.last) return(0);else if(A.lastB.last) return(1);else return(-1);2、(1)定位 LOCATE(L,X)在带头结点类单链表上实现的算法为:int locate_l
38、klist(lklist head,datatype x)/*求表 head中第一个值等于 x的的序号,不存在这种结点时结果为 0*/p=head-next;j=1; /*置初值*/while(p!=NULL)j+/*未达表结点又未找到值等于 X的结点时经,继续扫描*/if (p-data = =x) return(j);else return(0);在无头结点的单链表上实现的算法为:int Wlocate(lklist head,datatype X)/*求表 head中第一个值等于 x的结点的序号。不存在这种结点时结果为 0*/15p=head; j=1; /*置初值*/while(p!=
39、NULL)j+/*未达表结点又未找到值等于 X的结点时经,继续扫描*/if( p-data = =X) return(j);else return(0);(2)按序号查找 find(L,i)在带头结点的单链表上实现的算法为:pointer find_lklist(lklist head , int i); j=1; p=head-next;while(jnext; j+if(i= = j) return(p);else return(NULL);在无头结点的单链表上实现的算法为:pointer find_lklist(lklist head , int i); j=1; p=head;whil
40、e(jnext; j+if(i= = j) return(p);else return(NULL);(3)、插入 INSERT(L,X,i)在带头结点单链表上实现的算法为:void insert_lklist(lklist head,datatype x,int I)/*在表 haed的第 i个位置上插入一人以 x为值的新结点*/p=find_lklist(head,i-1); /*先找第 i-1个结点*/if(p= =NULL)reeor(“不存在第 i个位置”)/*若第 i-1个结点不存在,退出*/elses=malloc(size);s-data=x /*否则生成新结点*/s-next=
41、p-next /*结点*p 在链域值传给结点*s 的链域*/p-next=s; /*修改*p 的链域*/在无头结点的单链表上实现的算法为:void Winsert(lklist head,dataytpe X,int i)/*在表 haed的第 i个位置上插入一人以 x为值的新结点*/if(idata=X; /*否则生成新结点*/if(i= =1)s-next=head;head=s;16else p=wfind_lklist(lklist head,i-1);if(p= =NULL) error(“in+1”);elses-next=p-next;p-next=s;(4)删除 DELDTE(
42、L,i)在带头结点的单链表上实现的算法为:void delete_lklist(lklist head,int i) /*删除表 head的第 i个结点*/p=find_lklist(head,i-1) /*先找待删结点的直接前驱*/if(p!=NULL) /*q指向待删结点*/p-next=q-next/*摘除待结点*/;free(q);/*释放已摘除结点 q*/else error(“不存在第 i个结点”)/*否则给出相关信息*/在无头结点的单链表上实现的算法为:void Wdelete(lklist head,int i)/* 删除表 head的第 i个结点,若该链表仅有一个结点时,赋该
43、结点指针 NULL*/if(inext;free(q);elsep=wfind_lklist(head,i-1);/*找链表 head中第 i-1结点指针*/if(p!=NULL) p-next=q-next; free(q);else error(“不存在第 I个结点”);3、 分析:从第一个结点开始访问,只要是非空计数一次。Int wlength_lklist(lklist head) /*求表 head的长度*/p=head;j=0;while(p!=NULL)p=p-next;j+;return(j); /*回传表长*/ 4、 设 A,B,C均为无头结点单链表分析:(1)当有序表 A,
44、B 均非空时,找出两表中元素最小的一个元素,然后将此结点插入到 C表中,重复上述步骤。(2)当 A,B 两表有一个为空表时,将另一表中元素顺序地插入到 C表中。17(3)由于 C按递减排序,因此在 C表中插入元素时,应始终插入到 C表表头。Lklist Wlink_lklist(lklist A,lklist B) while(A!=NULL)A=A-next;elsep-next=C;C=p;if(A= =NULL) A=B;while(A!=NULL)p=A;A=A-next;p-next=C;C=p;return(C);5、 分析:(1)当有序表 A、B 均非空时,依次分别从 A、B 表
45、头部取下结点,插入 C表中。(2)当 A、B 两表有一个为空表时,将非空表插入到 C表尾部。设 A,B,C 均为带头结点的单链表lklist HB_lklist(lklist A,lklist B) C=A;A=A-next;B=B-next; /去除头结点While(A!=NULL)p=p-next;A=A-next;p-next=B;p=p-next;B=B-next;if(B= =NULL)else if(A= =NULL)Return(c);6、 分析:从有序表的尾部开始依次取元素与插入元素比较,若大于插入元素,此元素后移一位,再取它前面一个元素重复上述步骤;则将待插入元素插入。Void CR(datatype A,datatype X,int elenum) i=elenum-1;while(i=0)while(p!=NULL)/*查 X插入位置 q*/s=malloc(size);s-data=s;8、 (1)顺序表分析:将顺序表的第一个元素与最后一个元素互换,第二个元素与倒数第二个元素互