《数据结构试卷1线性表(共12页).doc》由会员分享,可在线阅读,更多相关《数据结构试卷1线性表(共12页).doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上题目部分,(卷面共有38题,240.0分,各大题标有题量和总分)一、算法设计题(5小题,共53.0分)(12分)1设A和B是两个单链表,其表中元素递增有序。试写一算法将A和B归并成一个按元素值递减有序的单链表C,并要求辅助空间为O(1),请分析算法的时间复杂度。(9分)2写一算法在单链表上实现线性表的ListLength(L)运算。(10分)3试编写算法,将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式中各自仅含奇次项或者偶次项,并要求利用原链表中的结点空间构成这两个链表。(12分)4稀疏多项式采用的循环链表存储结构LinkedPoly定义为Typed
2、ef struct PolyNode PolyTerm data;Struct PolyNode *next;PolyNode, *PolyLink;Typedef PolyLink LinkedPoly;编写稀疏多项式求导函数的算法,要求利用原多项式中的结点空间存放其导函数,同时释放所有无用(被删)结点。(10分)5已知A,B和C为三个递增有序的线性表,现要求对A表作如下操作:删除那些既在B表中出现又在C表中出现的元素。试对顺序表编写实现上述操作的算法,并分析你的算法的时间复杂度。二、填空题(33小题,共187.0分)(12分)1下面函数的功能是在一个按访问频度不增有序的,带头结点的双向链环
3、上检索关键值为x的结点,对该结点访问频度计数,并维护该链环有序。若未找到,则插入该结点。所有结点的频度域初值在建表时都为零。请将程序中四处空缺补写完整。 TYPE link=nodenode=RECORDkey:char; freq:integer; pre,next:link;END;VAR l:link;FUNCTION loc(l:link;x:char):link;VAR p,q:link;BEGIN p:=l.next; (1)_;WHILE p.keyx DO p:=p.next; IF p=l THEN new(q); q.key:=x; q.freq:=0 ELSE 找到 p.
4、freq:=p.freq+1; q:=p; (2)_;WHILE q.freqp.pre.freq DO p:=p.pre;IF pq THEN (3)_ ;IF (4)_ THEN q.next:=p, q.pre;=p.pre; p.pre.next:=q; p.pre:=qreturn(q);END; (10分)2下面是删除单链表L中最大元素所在结点的类PASCAL语言算法,请在横线填上内容,完成其功能。 TYPE pointer =node; node=RECORD data:integer; next: pointer END;PROCEDURE delmax (L:pointer)
5、; VAR p,q,r:pointer; m:integer; BEGIN r:=L; p:=L.next; IF pNIL THEN m:=p.data; (1)_; p:=p.next;WHILE pNIL DO IF (2)_THEN (3)_ ; m:=p.data; (4)_; p:=p.next;q:=r.next; (5)_; dispose(q); END;(11分)3一个无头结点的线性链表(不循环)有两个域。数据域data,指针域 next,链首head,下面算法用read(num)读入数据,当num小于0时,输入结束。建立一个数据以递增序组成的链表。 PROC insert
6、( head, x);在链首为head的表中按递增序插入xnew(r);r.data:=x; IF head=NILTHEN head:=(1)_; r.next:= (2)_ ELSE IF (3)_ THEN r .next:=head; head:=rELSE p:=head;WHILE (4)_ AND (p.nextNIL ) DOq:=p; (5)_ ; IF (6)_ THEN q .next:=(7)_; r.next:= (8)_; ELSE p.next:=(9)_; r.next:= (10)_; ENDP;PROC creat(head); head:= (11)_;
7、read(num); WHILE num0 DO insert(head,num); read(num) ENDP; (10分)4下面程序段是逆转单向循环链表的方法,p0 是原链表头指针,逆转后链表头指针仍为p0。(可以根据需要增加标识符) p:= p0; q0:=NIL; WHILE (1)_ DO BEGIN (2)_; (3)_;(4)_;(5)_ END; p.next:= q0; p0 .next:=p; p0:=p;(6分)5下面是用c语言编写的对不带头结点的单链表进行就地逆置的算法,该算法用L返回逆置后的链表的头指针,试在空缺处填入适当的语句。void reverse(linkl
8、ist &L)p=null;q=L;while(q!=null) (1)_; q-next=p;p=q;(2)_ ; (3)_;(12分)6在本题的程序中,函数过程Create_link_list(n)建立一个具有n个结点的环形链表;程序过程 josephus(n,i,m)对由Create_link_list(n)所建立的具有n个结点的环形链表按一定的次序逐个输出并删除链表中的所有结点,参数 n(n0)指明环形链表的结点个数,参数 i(1=i0)是步长,指明从起始结点或前次被删除并输出的结点之后的第m个结点作为本次被输出并删除的结点。例如,对于下图中具有6个结点的环形链表,在调用 joseph
9、us(6,3,2)后,将输出 5,1,3,6,4,2 请在横线处填上适当内容,每空只填一个语句。 TYPE nodeptr=nodetype; nodetype=RECORDdata: intrger; link: nodeptr END; VAR n,i,m: integer; FUNCTION Create_link_list(n: integer): nodeptr; VAR head,p,q: nodeptr; i:integer; BEGIN head := NIL; IF n0 THEN BEGIN new(head); p: =head; FOR i:=1 TO n-1 DO B
10、EGIN p.data:=i; new(q); (A)_; (B)_ END; p.data:=n; (C)_; END; Creat_link_list:=headEND;PROCEDURE josephus(n,i,m:integer); VAR p,q:nodeptr; j:integer;BEGIN p:=Creat_link_list(n); WHILE i1 DO BEGIN p:=p.link; i:=i-1 END; (D)_ ; WHILE jn DO BEGIN FOR i:=1 TO m-1 DO p:=p.link; (E)_; write(q.data:8); (F)
11、_ ; dispose(q); j:=j+1 ENDEND;(10分)7阅读以下算法,填充空格,使其成为完整的算法。其功能是在一个非递减的顺序存储线性表中,删除所有值相等的多余元素。 CONST maxlen=30TYPE sqlisttp=RECORD elem:ARRAY1.maxlen OF integer; last:0.maxlen END;PROC exam21(VAR L:sqlisttp); j:=1; i:=2; WHILE (1)_ DO IF L.elemiL.elemj THEN (2)_; (3)_; i:=i+1 (4)_;ENDP; (15分)8PROC ins_
12、linklist(la:linkisttp; i:integer; b:elemtp);la为指向带头结点的单链表的头指针,本算法在表中第i个元素之前插入元素bp:=(1)_; j:=(2)_;指针初始化,j为计数器WHILE (pNIL) AND (3)_) DO p:=(4)_; j:=j+1; 寻找第 i-1 个结点IF (p=NIL) OR (5)_) THEN error (No this position) ELSE new(s) ; s.data:=b; s.next:=p.next; p.next:=s;ENDP;ins-linklist(18分)9假设链表p和链表q中的结点值
13、都是整数,且按结点值的递增次序链接起来的带表头结点的环形链表。各链表的表头结点的值为max,且链表中其他结点的值都小于max,在程序中取max为9999。在各个链表中,每个结点的值各不相同,但链表p和链表q可能有值相同的结点(表头结点除外)。下面的程序将链表q合并到链表p中,使得合并后的链表是按结点值递增次序链接起来的带表头结点的环形链表,且链表中各个结点的值各不相同。请在划线处填上适当内容,每个框只填一个语句或一个表达式,链表的结点类型如下TYPE nodeptr=nodetype; nodetype=RECORD data:integer; link:nodeptr;END;CONST m
14、ax=9999;PROCEDURE merge(VAR p:nodeptr;q:nodeptr); VAR r,s: nodeptr; BEGIN r:=p; WHILE _(A)_ DO BEGIN WHILE r.link.dataq.link.data THEN BEGIN s:=(C)_; (D)_:=s.link; s.link:=(E)_; (F)_:=s; (G)_; END ELSE BEGIN (H)_; s:=q.link; (I)_; dispose(s) END END; dispose(q)END; (6分)10以下程序的功能是实现带附加头结点的单链表数据结点逆序连接
15、,请填空完善之。void reverse(pointer h) pointer p,q; p=h-next; h-next=NULL;while(1)_) q=p; p=p-next; q-next=h-next; h-next=(2)_; (2分)11带头结点的双循环链表L中只有一个元素结点的条件是:_(3分)12对于双向链表,在两个结点之间插入一个新结点需修改的指针共 _个,单链表为_个。(1分)13链接存储的特点是利用_来表示数据元素之间的逻辑关系。 (2分)14在双向链表结构中,若要求在p 指针所指的结点之前插入指针为s 所指的结点,则需执行下列语句:s .next:=p; s .pr
16、ior:= _;p .prior:=s;_:=s;(3分)15在双向循环链表中,向p所指的结点之后插入指针f所指的结点,其操作是_、_、_、_。(2分)16对于一个具有n个结点的单链表,在已知的结点*p后插入一个新结点的时间复杂度为_,在给定值为x的结点后插入一个新结点的时间复杂度为_。(4分)17在一个长度为n的顺序表中第i个元素(1=inext=_和p-next=_的操作。(2分)29顺序存储结构是通过_表示元素之间的关系的;链式存储结构是通过_表示元素之间的关系的。(2分)30在单链表种,除了首元结点外,任一结点的存储位置由 指示。(4分)31在顺序表中插入或删除一个元素,需要平均移动
17、元素,具体移动的元素个数与_有关。(12分)32已知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-ne
18、xt!=NULL) P=P-next;(10)P=Q;(11)P=L;(12)L=S;(13)L=P;(15分)33已知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
19、;(6) while (Q-next!=NULL) PQ;QQ-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);答案部分,(卷面共有38题,240.0分,各大题标有题量和总分)一、算法设计题(5小题,共53.0分)(12分)1答案根据已知条件,A和B是两个递增有序表,所以可以先取A表的表头建立空的C表。然
20、后同时扫描A表和B表,将两表中最小的结点从对应表中摘下,并作为开始结点插入C表中。如此反复,直到A表或B表为空。最后将不为空的A表或B表中的结点依次摘下并作为开始结点插入C表中。这时,得到的C表就是由A表和B表归并成的一个按元素值递减有序的单链表C。并且辅助空间为O(1)。算法如下:LinkList MergeSort ( LinkList &A , LinkList &B, LinkList &C )/ 归并两个带头结点的递增有序表为一个带头结点递减有序表ListNode *pa , *pb , *q , *C ;pa=A-next;/pa指向A表开始结点C=A;C-next=NULL;/取
21、A表的表头建立空的C表pb=B-next;/pb指向B表开始结点free(B);/回收B表的头结点空间while ( pa & pb)if ( pb-data = pa-data ) / 当B中的元素大于等于A中当前元素时,将pa表的开始结点摘下q=pa;pa=pa-next;else/ 当B中的元素小于A中当前元素时,将pb表的开始结点摘下q=pb;pb=pb-next;q-next=C-next;C-next=q;/将摘下的结点q作为开始结点插入C表/若pa表非空,则处理pa表while(pa)q=pa;pa=pa-next;q-next=C-next;C-next=q;/若pb表非空,则
22、处理pb表while(pb)q=pb;pa=pb-next;q-next=C-next;C-next=q;return(C);(9分)2答案由于在单链表中只给出一个头指针,所以只能用遍历的方法来数单链表中的结点个数了。算法如下:int ListLength ( LinkList L ) int len=0 ;ListNode *p;p=L; /设该表有头结点while ( p-next ) p=p-next; len+;return len;(10分)3答案void Divide_LinkedPoly(LinkedPoly &L,&A,&B)/把循环链表存储的稀疏多项式L拆成只含奇次项的A和只
23、含偶次项的Bp=L-next;A=(PolyNode*)malloc(sizeof(PolyNode);B=(PolyNode*)malloc(sizeof(PolyNode);pa=A;pb=B;while(p!=L)if(p-data.exp!=2*(p-data.exp/2)pa-next=p;pa=p;elsepb-next=p;pb=p;p=p-next;/whilepa-next=A;pb-next=B;/Divide_LinkedPoly(12分)4答案void QiuDao_LinkedPoly(LinkedPoly &L)/对有头结点循环链表结构存储的稀疏多项式L求导p=L-
24、next;if(!p-data.exp)L-next=p-next; q=p; p=p-next; free(q);/跳过常数项while(p!=L)p-data.coef*=p-data.exp-;/对每一项求导p=p-next;/QiuDao_LinkedPoly(10分)5答案void SqList_Intersect_Delete(SqList &A,SqList B,SqList C)i=0;j=0;k=0;m=0; /i指示A中元素原来的位置,m为移动后的位置while(iA.length&jB.length& kC.length)if(B.elemjC.elemk) k+;els
25、esame=B.elemj; /找到了相同元素samewhile(B.elemj=same) j+;while(C.elemk=same) k+; /j,k后移到新的元素while(iA.length&A.elemisame)A.elemm+=A.elemi+; /需保留的元素移动到新位置while(iA.length&A.elemi=same) i+; /跳过相同的元素/whilewhile(ipre-next=q-next; q-next-pre=q-pre; 先将q结点从链表上摘下q.next:=p; q.pre:=p.pre; p.pre-next:=q; p.pre:=q; 结点q插
26、入结点p前(4) q.freq=0 链表中无值为x的结点,将新建结点插入到链表最后(头结点前)。(10分)2答案(1)q:=p; q是工作指针p的前驱(2)p.datam p是工作指针(3)r:=q; r 记最大值的前驱,(4)q:=p; 或q:=q.next;(5)r.next:=q.next; 或r.next:=r.next.next 删最大值结点(11分)3答案(1)r (2)NIL (3)xhead.data (4)p.data=x; (7)r (8)p (9)r (10)NIL (11)NIL(10分)4答案(1) p.nextp0 (2)r:= p.next (3) p.next:
27、= q0; (4) q0:= p; (5) p:=r(6分)5答案(1)L=L-next; 暂存后继 (2)q=L; 待逆置结点 (3)L=p; 头指针仍为L(12分)6答案(A)p.link:=q;拉上链,前驱指向后继 (B)p:=q;新的前驱 (C)p.link:=head;形成循环链表 (D)j:=0; 计数器,记被删结点 (E)q:=p.link记下被删结点 (F)p.link=q.link 删除结点(10分)7答案(1)i=L.last L.last 为元素个数 (2)j:=j+1 有值不相等的元素(3)L.elemj:=L.elemi 元素前移(4)L.last:=j 元素个数(1
28、5分)8答案(1)la (2)0 (3)ji-1 (4)p.next (5)i1(18分)9答案 A: r.link.datamax AND q.link.datamaxB: r:=r.link C: q.link D: q.link E: r.link F: r.linkG: r:=s(或r:= r.link) H: r:=r.link I: q.link:=s.link(6分)10答案 C 部分:(1)p!=null 链表未到尾就一直作(2)q 将当前结点作为头结点后的第一元素结点插入(2分)11答案 L-next-next=L(3分)12答案4 2(1分)13答案指针 (2分)14答案
29、p.prior s.prior.next(3分)15答案 f-next=p-next; f-prior=p; p-next-prior=f; p-next=f;(2分)16答案 O(1),O(n)(4分)17答案 n-i+1(2分)18答案(n-1)/2 (1分)19答案顺序(4分)20答案 py-next=px-next;px-next=py:(4分)21答案不管单链表是否为空表,头指针均不空,并使得对单链表的操作在各种情况下统一。 (1分)22答案相同(2分)23答案随机,随机存取(2分)24答案 p-next!=null(1分)25答案不同(2分)26答案 O(1);O(n)(2分)27答案前驱结点 、 后续结点(4分)28答案p-next、 s (2分)29答案 物理上相邻 指针(2分)30答案其直接前驱结点的链域的值。(4分)31答案表中一半,表长和该元素在表中的位置。(12分)32答案A、(4) (1)B、(7)(11)(8)(4)(1)C、(5) (12) D、(11) (9) (1) (6)(15分)33答案A、(11) (3) (14)B、(10) (12) (8) (11) (3) (14) C、(10) (12) (7) (3) (14)D、(12) (11) (3) (14)E、(12) (9) (11) (3) (14)专心-专注-专业
限制150内