大數(shù)據(jù)的結(jié)構(gòu)線性的表答案詳解_第1頁
大數(shù)據(jù)的結(jié)構(gòu)線性的表答案詳解_第2頁
大數(shù)據(jù)的結(jié)構(gòu)線性的表答案詳解_第3頁
大數(shù)據(jù)的結(jié)構(gòu)線性的表答案詳解_第4頁
大數(shù)據(jù)的結(jié)構(gòu)線性的表答案詳解_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、實(shí)用標(biāo)準(zhǔn)文檔第一章線性表2.1描述以下三個(gè)概念的區(qū)別:頭指針,頭結(jié)點(diǎn),首元結(jié)點(diǎn)(第一個(gè)元素結(jié)點(diǎn))。解:頭指針是指向鏈表中第一個(gè)結(jié)點(diǎn)的指針。首元結(jié)點(diǎn)是指鏈表中存儲(chǔ)第一個(gè)數(shù)據(jù)元素的結(jié)點(diǎn)。頭結(jié) 點(diǎn)是在首元結(jié)點(diǎn)之前附設(shè)的一個(gè)結(jié)點(diǎn),該結(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù)元素,其指針域指向首元結(jié)點(diǎn),其作用主要是為 了方便對(duì)鏈表的操作。它可以對(duì)空表、非空表以及首元結(jié)點(diǎn)的操作進(jìn)行統(tǒng)一處理。2.2填空題。解:(1)在順序表中插入或刪除一個(gè)元素,需要平均移動(dòng)表中一半元素,具體移動(dòng)的元素個(gè)數(shù)與 元素在表中的位置有關(guān)。(2) 順序表中邏輯上相鄰的元素的物理位置必定緊鄰。單鏈表中邏輯上相鄰的元素的物理位置不一定緊鄰。(3) 在單鏈表中,除了

2、首元結(jié)點(diǎn)外,任一結(jié)點(diǎn)的存儲(chǔ)位置由其前驅(qū)結(jié)點(diǎn)的鏈域的值指示。(4) 在單鏈表中設(shè)置頭結(jié)點(diǎn)的作用是插入和刪除首元結(jié)點(diǎn)時(shí)不用進(jìn)行特殊處理。 2.3在什么情況下用順序表比鏈表好?解:當(dāng)線性表的數(shù)據(jù)元素在物理位置上是連續(xù)存儲(chǔ)的時(shí)候,用順序表比用鏈表好,其特點(diǎn)是可以進(jìn)行 隨機(jī)存取。2.4對(duì)以下單鏈表分別執(zhí)行下列各程序段,并畫岀結(jié)果示意圖解:(1)TT1TPQRS精彩文案PQ2.5畫岀執(zhí)行下列各行語句后各指針及鏈表的示意圖。L=(LinkList)malloc(sizeof(LNode); P=L; for(i=1;inext=(LinkList)malloc(sizeof(LNode);P=P-next;

3、 P-data=i*2-1;P-next=NULL;for(i=4;i=1;i-) lns_LinkList(L,i+1,i*2);for(i=1;inext=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; Q=P;(8) while(P-next!=Q) P=P-next;(9) while(P-next!=NULL) P=P-next;(10) P=Q;(11) P=L;(12) L=S;(13) L=P;解:a.(1)b. (7) (11) (8)(1)c

4、. (5) (12)d. (9) (1) (6)2.7已知L是帶表頭結(jié)點(diǎn)的非空單鏈表,且P結(jié)點(diǎn)既不是首元結(jié)點(diǎn),也不是尾元結(jié)點(diǎn),試從下列提供的答案中選擇合適的語句序列。a. 刪除P結(jié)點(diǎn)的直接后繼結(jié)點(diǎn)的語句序列是 。b. 刪除P結(jié)點(diǎn)的直接前驅(qū)結(jié)點(diǎn)的語句序列是 。c. 刪除P結(jié)點(diǎn)的語句序列是。d. 刪除首元結(jié)點(diǎn)的語句序列是 。e. 刪除尾元結(jié)點(diǎn)的語句序列是 。(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;(6) while(Q-next!=NULL) P=Q

5、; Q=Q-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);解:a. (11) (3) (14)b. (10) (12) (8) (3) (14)c. (10) (12)(14)d. (12) (11) (3) (14)e. (9) (11) (3) (14)2.8已知P結(jié)點(diǎn)是某雙向鏈表的中間結(jié)點(diǎn),試從下列提供

6、的答案中選擇合適的語句序列。a. 在P結(jié)點(diǎn)后插入 S結(jié)點(diǎn)的語句序列是 。b. 在P結(jié)點(diǎn)前插入 S結(jié)點(diǎn)的語句序列是 。c. 刪除P結(jié)點(diǎn)的直接后繼結(jié)點(diǎn)的語句序列是 。d. 刪除P結(jié)點(diǎn)的直接前驅(qū)結(jié)點(diǎn)的語句序列是 。e. 刪除P結(jié)點(diǎn)的語句序列是 。 P-next=P-next-next;(2) P_priou=P_priou_priou;(3) P-next=S;(4) P-priou=S;(5) S-next=P;(6) S-priou=P;(7) S-next=P-next;(8) S_priou=P_priou;(9) P-priou-next=P-next;(10) P-priou-next=

7、P;(11) P-next-priou=P;(12) P-next-priou=S;(13) P-priou-next=S;(14) P-next-priou=P-priou;(15) Q=P-next;(16) Q=P-priou;(17) free(P);(18) free(Q);解:a. (7) (3) (6) (12)b. (8)(5) (13)c. (15) (1) (11) (18)d. (16) (2) (10) (18)e. (14) (9) (17)2.9簡(jiǎn)述以下算法的功能。(1) Status A(LinkedList L) L是無表頭結(jié)點(diǎn)的單鏈表if(L & L-next

8、) Q=L; L=L-next; P=L;while(P-next) P=P-next;P-next=Q; Q-next=NULL;return OK;(2) void BB(LNode *s, LNode *q) p=s;while(p-next!=q) p=p-next;p-next =s;void AA(LNode *pa, LNode *pb) /pa和pb分別指向單循環(huán)鏈表中的兩個(gè)結(jié)點(diǎn)BB(pa,pb);BB(pb,pa);解:(1)如果L的長度不小于2,將L的首元結(jié)點(diǎn)變成尾元結(jié)點(diǎn)(2)將單循環(huán)鏈表拆成兩個(gè)單循環(huán)鏈表。2.10指岀以下算法中的錯(cuò)誤和低效之處,并將它改寫為一個(gè)既正確又高

9、效的算法。Status DeleteK(SqList &a,int i,int k)/本過程從順序存儲(chǔ)結(jié)構(gòu)的線性表a中刪除第i個(gè)元素起的k個(gè)元素if(iv1|ka.length) return INFEASIBLE;/參數(shù)不合法else for(count=1;count=i+1;j-) a.elemj-i=a.elemj;a.length-;return OK;解:Status DeleteK(SqList & a,int i,int k)/從順序存儲(chǔ)結(jié)構(gòu)的線性表a中刪除第i個(gè)元素起的k個(gè)元素/ 注意i的編號(hào)從0開始int j;if(ivO|ia.length-1|ka.length-i)

10、return INFEASIBLE;for(j=0;j0,xB.length?A.length:B.length;for(i=0;iB.elemi) j=1;if(A.elemik) j=1;if(B.lengthk) j=-1;if(A.length=B.length) j=0;return j;2.13試寫一算法在帶頭結(jié)點(diǎn)的單鏈表結(jié)構(gòu)上實(shí)現(xiàn)線性表操作Locate(L,x);解:int LocateElem_L(LinkList & L,ElemType x)int i=0;LinkList p=L;while(p&p-data!=x)p=p-next;i+;if(!p) return 0;

11、else return i;2.14試寫一算法在帶頭結(jié)點(diǎn)的單鏈表結(jié)構(gòu)上實(shí)現(xiàn)線性表操作Length(L)。解:/返回單鏈表的長度int ListLength_L(LinkList &L)int i=0;LinkList p=L;if(p) p=p-next;while(p)p=p-next;i+;return i;2.15已知指針ha和hb分別指向兩個(gè)單鏈表的頭結(jié)點(diǎn),并且已知兩個(gè)鏈表的長度分別為m和n。試寫一算法將這兩個(gè)鏈表連接在一起,假設(shè)指針hc指向連接后的鏈表的頭結(jié)點(diǎn),并要求算法以盡可能短的時(shí)間完成連接運(yùn)算。請(qǐng)分析你的算法的時(shí)間復(fù)雜度。解:void MergeList_L(LinkList

12、&ha, LinkList & hb, LinkList & he)LinkList pa,pb;pa=ha;pb=hb;while(pa-next&pb-next)pa=pa_next;pb=pb-next;if(!pa-next)hc=hb;while(pb-next) pb=pb-next;pb-next=ha-next;elsehc=ha;while(pa-next) pa=pa-next;pa-next=hb-next;2.16已知指針la和lb分別指向兩個(gè)無頭結(jié)點(diǎn)單鏈表中的首元結(jié)點(diǎn)。下列算法是從表la中刪除自第i個(gè)元素起共len個(gè)元素后,將它們插入到表lb中第i個(gè)元素之前。試問此算

13、法是否正確?若有錯(cuò),請(qǐng)改正之。Status DeleteAndlnsertSub(LinkedList la,LinkedList lb,int i,int j,int len)if(iO|jvO|lenO) return INFEASIBLE;p=la; k=1;while(knext; k+;q=p;while(knext; k+;s=lb; k=1;while(knext; k+;s-next=p; q-next=s-next;return OK;解:Status DeleteAndInsertSub(LinkList &la,LinkList &lb,int i,int j,int l

14、en)LinkList p,q,s,prev=NULL;int k=1;if(i0|j0|len0) return INFEASIBLE;/ 在la表中查找第i個(gè)結(jié)點(diǎn)p=la;while(p&knext;k+;if仲)return INFEASIBLE;/ 在la表中查找第i+len-1 個(gè)結(jié)點(diǎn)q=p; k=1;while(q&knext;k+;if(!q)return INFEASIBLE;/完成刪除,注意,i=1的情況需要特殊處理if(!prev) la=q-next;else prev-next=q-next;/ 將從la中刪除的結(jié)點(diǎn)插入到lb中if(j=1)q-next=lb;lb=p

15、;elses=lb; k=1;while(s&knext;k+;if(!s)return INFEASIBLE;q-next=s-next;s-next=p; /完成插入return OK;2.17試寫一算法,在無頭結(jié)點(diǎn)的動(dòng)態(tài)單鏈表上實(shí)現(xiàn)線性表操作lnsert(L,i,b) ,并和在帶頭結(jié)點(diǎn)的動(dòng)態(tài)單鏈表上實(shí)現(xiàn)相同操作的算法進(jìn)行比較。解:Status Insert(LinkList & L,int i,int b) /在無頭結(jié)點(diǎn)鏈表 L的第i個(gè)元素之前插入元素bp=L;q=(LinkList*)malloc(sizeof(LNode);q.data=b;if(i=1)q.next=p;L=q;

16、/插入在鏈表頭部elsewhile(-i1)p=p_next;q_next=p_next;p-next=q; /插入在第i個(gè)元素的位置/Insert2.18試寫一算法,實(shí)現(xiàn)線性表操作Delete(L,i),并和在帶頭結(jié)點(diǎn)的動(dòng)態(tài)單鏈表上實(shí)現(xiàn)相同操作的算法進(jìn)行比較。解:Status Delete(LinkList &L,int i) /在無頭結(jié)點(diǎn)鏈表 L中刪除第i個(gè)元素if(i=1)L=L-next; / 刪除第一個(gè)元素elsep=L;while(-i1)p=p-next;p-next=p-next-next; / 刪除第 i 個(gè)元素/ Delete2.19已知線性表中的元素以值遞增有序排列,并以

17、單鏈表作存儲(chǔ)結(jié)構(gòu)。試寫一高效的算法,刪除表中所有值大于mink且小于maxk的元素(若表中存在這樣的元素),同時(shí)釋放被刪結(jié)點(diǎn)空間,并分析你的算法 的時(shí)間復(fù)雜度(注意,mink和maxk是給定的兩個(gè)參變量,它們的值可以和表中的元素相同,也可以不同)解:Status ListDelete_L(LinkList & L,ElemType mink,ElemType maxk)LinkList p,q,prev=NULL;if(minkmaxk)return ERROR;p=L;prev=p;p=p-next;while(p&p-datadatanext;elseprev-next=p-next;q=

18、p;p=p-next;free(q);return OK;2.20同2.19題條件,試寫一高效的算法,刪除表中所有值相同的多余元素(使得操作后的線性表中所有 元素的值均不相同),同時(shí)釋放被刪結(jié)點(diǎn)空間,并分析你的算法的時(shí)間復(fù)雜度。解:void ListDelete_LSameNode(LinkList &L)LinkList p,q,prev;P=L;prev=p;p=p_next;while(p)prev=p;p=p-next;if(p&p-data=prev-data)prev-next=p-next;q=p;p=p-next;free(q);2.21試寫一算法,實(shí)現(xiàn)順序表的就地逆置,即利用

19、原表的存儲(chǔ)空間將線性表Jr,,an )逆置為an,ai。解:/順序表的逆置Status ListOppose_Sq(SqList &L)int i;ElemType x;for(i=0;inext;L-next=NULL;while(p)q=p;p=p-next;q-next=L-next;L-next=q;return OK;2.23設(shè)線性表A=3(82,am, 8 =t1,b2,bn,試寫一個(gè)按下列規(guī)則合并a,b為線性表C的算法,即使得C= 6,3,am,bm,bm 1,bn當(dāng) m空 n時(shí);C= 64,an,bn,an 1,am當(dāng) m n時(shí)。線性表A, B和C均以單鏈表作存儲(chǔ)結(jié)構(gòu),且C表利

20、用A表和B表中的結(jié)點(diǎn)空間構(gòu)成。注意:?jiǎn)捂湵淼拈L度值m和n均未顯式存儲(chǔ)。解:/將合并后的結(jié)果放在 C表中,并刪除B表Status ListMerge_L(LinkList &A,L inkList &B,L inkList &C)LinkList pa,pb,qa,qb;pa=A-next;pb=B-next;C=A;while(pa&pb)qa=pa; qb=pb;pa=pa-next; pb=pb-next;qb-next=qa-next;qa_next=qb;if(!pa)qb_next=pb;pb=B;free(pb);return OK;2.24假設(shè)有兩個(gè)按元素值遞增有序排列的線性表A

21、和B,均以單鏈表作存儲(chǔ)結(jié)構(gòu),請(qǐng)編寫算法將A表和B表歸并成一個(gè)按元素值遞減有序(即非遞增有序,允許表中含有值相同的元素)排列的線性表C,并要求利用原表(即A表和B表)的結(jié)點(diǎn)空間構(gòu)造 C表。解:/將合并逆置后的結(jié)果放在C表中,并刪除B表Status ListMergeOppose_L(LinkList &A, LinkList &B, LinkList &C)LinkList pa,pb,qa,qb;pa=A;pb=B;qa=pa; /保存pa的前驅(qū)指針qb=pb; /保存pb的前驅(qū)指針pa=pa_next;pb=pb_next;A-next=NULL;C=A;while(pa&pb)if(pa-

22、datadata)qa=pa;pa=pa-next;qa-next=A-next; /將當(dāng)前最小結(jié)點(diǎn)插入 A表表頭A-next=qa;elseqb=pb;pb=pb-next;qb-next=A-next; /將當(dāng)前最小結(jié)點(diǎn)插入 A表表頭A-next=qb;while(pa)qa=pa;pa=pa-next;qa-next=A-next;A-next=qa;while(pb)qb=pb;pb=pb-next;qb-next=A-next;A-next=qb;pb=B;free(pb);return OK;2.25假設(shè)以兩個(gè)元素依值遞增有序排列的線性表A和B分別表示兩個(gè)集合(即同一表中的元素值各

23、不相同),現(xiàn)要求另辟空間構(gòu)成一個(gè)線性表C,其元素為A和B中元素的交集,且表 C中的元素有依值遞增有序排列。試對(duì)順序表編寫求C的算法。解:/將A B求交后的結(jié)果放在 C表中Status ListCross_Sq(SqList &A,SqList &B,SqList &C)int i=O,j=O,k=O;while(iA.length & jB.length)if(A.elemiB.elemj) j+;elseListInsert_Sq(C,k,A.elemi);i+;k+;return OK;2.26要求同2.25題。試對(duì)單鏈表編寫求C的算法。解:/將A B求交后的結(jié)果放在 C表中,并刪除B表S

24、tatus ListCross_L(LinkList &A,L inkList &B,L inkList &C)LinkList pa,pb,qa,qb,pt;pa=A;pb=B;qa=pa; /保存pa的前驅(qū)指針qb=pb; /保存pb的前驅(qū)指針pa=pa_next;pb=pb_next;C=A;while(pa&pb)if(pa-datadata)pt=pa;pa=pa-next;qa-next=pa;free(pt);elseif(pa-datapb-data)pt=pb;pb=pb-next;qb-next=pb;free(pt);elseqa=pa;pa=pa_next;while(

25、pa)pt=pa;pa=pa-next;qa-next=pa;free(pt);while(pb)pt=pb;pb=pb_next;qb_next=pb;free(pt);pb=B;free(pb);return OK;C中的元素值各不相同;2.27對(duì)2.25題的條件作以下兩點(diǎn)修改,對(duì)順序表重新編寫求得表C的算法。(1) 假設(shè)在同一表(A或B)中可能存在值相同的元素,但要求新生成的表(2) 利用A表空間存放表Co解:(1)/ A、B求交,然后刪除相同元素,將結(jié)果放在C表中Status ListCrossDelSame_Sq(SqList &A,SqList &B,SqList &C)int i

26、=O,j=O,k=O;while(iA.length & jB.length)if(A.elemiB.elemj) j+;elseif(C.length=0)ListInsert_Sq(C,k,A.elemi);k+;elseif(C.elemC.length-1!=A.elemi)ListInsert_Sq(C,k,A.elemi);k+;i+;return OK;/ A、B求交,然后刪除相同元素,將結(jié)果放在A表中Status ListCrossDelSame_Sq(SqList &A,SqList &B)int i=O,j=O,k=O;while(iA.length & jB.length

27、)if(A.elemiB.elemj) j+;elseif(k=0)A.elemk=A.elemi;k+;elseif(A.elemk!=A.elemi)A.elemk=A.elemi;k+;i+;A.l ength=k;return OK;2.28對(duì)2.25題的條件作以下兩點(diǎn)修改,對(duì)單鏈表重新編寫求得表C的算法。(1) 假設(shè)在同一表(A或B)中可能存在值相同的元素,但要求新生成的表C中的元素值各不相同;(2) 利用原表(A表或B表)中的結(jié)點(diǎn)構(gòu)成表 C,并釋放A表中的無用結(jié)點(diǎn)空間。解:(1)/ A、B求交,結(jié)果放在 C表中,并刪除相同元素Status ListCrossDelSame_L(Li

28、nkList &A,LinkList &B,L inkList &C)LinkList pa,pb,qa,qb,pt;pa=A;pb=B;qa=pa; /保存pa的前驅(qū)指針qb=pb; /保存pb的前驅(qū)指針pa=pa_next;pb=pb_next;C=A;while(pa&pb)if(pa-datadata) pt=pa;pa=pa-next;qa_next=pa;free(pt);elseif(pa-datapb-data) pt=pb;pb=pb-next;qb-next=pb;free(pt);elseif(pa-data=qa-data) pt=pa;pa=pa-next; qa-n

29、ext=pa; free(pt);elseqa=pa; pa=pa-next;while(pa)pt=pa;pa=pa-next;qa-next=pa;free(pt);while(pb)pt=pb;pb=pb-next;qb-next=pb;free(pt);pb=B;free(pb);return OK;/ A、B求交,結(jié)果放在 A表中,并刪除相同元素Status ListCrossDelSame_L(LinkList &A,LinkList &B) LinkList pa,pb,qa,qb,pt;pa=A;pb=B;qa=pa; /保存pa的前驅(qū)指針qb=pb; /保存pb的前驅(qū)指針pa

30、=pa_next;pb=pb_next;while(pa&pb)if(pa-datadata)pt=pa;pa=pa-next;qa-next=pa;free(pt);elseif(pa-datapb-data)pt=pb;pb=pb-next;qb-next=pb;free(pt);elseif(pa-data=qa-data)pt=pa;pa=pa-next;qa-next=pa;free(pt);elseqa=pa;pa=pa-next;while(pa)pt=pa;pa=pa-next;qa-next=pa;free(pt);while(pb)pt=pb;pb=pb_next;qb_n

31、ext=pb;free(pt);pb=B;free(pb);return OK;B表中出現(xiàn)又在題中沒2.29已知A, B和C為三個(gè)遞增有序的線性表,現(xiàn)要求對(duì) A表作如下操作:刪去那些既在 C表中岀現(xiàn)的元素。試對(duì)順序表編寫實(shí)現(xiàn)上述操作的算法,并分析你的算法的時(shí)間復(fù)雜度(注意: 有特別指明同一表中的元素值各不相同)。解:/在A中刪除既在B中出現(xiàn)又在C中出現(xiàn)的元素,結(jié)果放在D中Status ListUnion_Sq(SqList &D,SqList &A,SqList &B,SqList &C)SqList Temp;InitList_Sq (T emp);ListCross_L(B,C,Temp)

32、;ListMinus_L(A,Temp,D);2.30要求同2.29題。試對(duì)單鏈表編寫算法,請(qǐng)釋放A表中的無用結(jié)點(diǎn)空間。解:/在A中刪除既在B中出現(xiàn)又在C中出現(xiàn)的元素,并釋放B、CStatus ListUnion_L(LinkList &A,L inkList &B,L inkList &C)ListCross_L(B,C);ListMinus_L(A,B);/求集合A-B,結(jié)果放在A表中,并刪除B表Status ListMinus_L(LinkList &A,L inkList &B)LinkList pa,pb,qa,qb,pt;pa=A;pb=B;qa=pa; /保存pa的前驅(qū)指針qb=

33、pb; /保存pb的前驅(qū)指針pa=pa-next;pb=pb-next;while(pa&pb)if(pb-datadata)pt=pb;pb=pb_next;qb_next=pb;free(pt);elseif(pb-datapa-data)qa=pa;pa=pa-next;elsept=pa;pa=pa-next;qa-next=pa;free(pt);while(pb)pt=pb;pb=pb-next;qb-next=pb;free(pt);pb=B;free(pb);return OK;2.31假設(shè)某個(gè)單向循環(huán)鏈表的長度大于1,且表中既無頭結(jié)點(diǎn)也無頭指針。已知s為指向鏈表中某個(gè)結(jié)點(diǎn)的指

34、針,試編寫算法在鏈表中刪除指針s所指結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)。解:/在單循環(huán)鏈表S中刪除S的前驅(qū)結(jié)點(diǎn)Status ListDelete_CL(LinkList &S)LinkList p,q;if(S=S-next)return ERROR;q=S;p=S-next;while(p-next!=S)q=p;p=p-next;q-next=p-next;free(p);return OK;next2.32已知有一個(gè)單向循環(huán)鏈表,其每個(gè)結(jié)點(diǎn)中含三個(gè)域:pre , data和next,其中data為數(shù)據(jù)域,為指向后繼結(jié)點(diǎn)的指針域,pre也為指針域,但它的值為空,試編寫算法將此單向循環(huán)鏈表改為雙向循環(huán) 鏈表,即

35、使pre成為指向前驅(qū)結(jié)點(diǎn)的指針域。解:/建立一個(gè)空的循環(huán)鏈表Status lnitList_DL(DuLinkList &L)L=(DuLinkList)malloc(sizeof(DuLNode);if(!L) exit(OVERFLOW);L-pre=NULL;L-next=L;return OK;/ 向循環(huán)鏈表中插入一個(gè)結(jié)點(diǎn)Status ListInsert_DL(DuLinkList &L,ElemType e)DuLinkList p;p=(DuLinkList)malloc(sizeof(DuLNode);if(!p) return ERROR;p-data=e;p-next=L-

36、next;L-next=p;return OK;/ 將單循環(huán)鏈表改成雙向鏈表Status ListCirToDu(DuLinkList &L)DuLinkList p,q;q=L;p=L-next;while(p!=L)p-pre=q;q=p;p=p-next;if(p=L) p_pre=q;return OK;2.33已知由一個(gè)線性鏈表表示的線性表中含有三類字符的數(shù)據(jù)元素(如:字母字符、數(shù)字字符和其他字 符),試編寫算法將該線性表分割為三個(gè)循環(huán)鏈表,其中每個(gè)循環(huán)鏈表表示的線性表中均只含一類字符。解:/將單鏈表L劃分成3個(gè)單循環(huán)鏈表Status ListDivideInto3CL(LinkLi

37、st & L,LinkList &s1, LinkList & s2 ,L inkList & s3)LinkList p,q,pt1,pt2,pt3;p=L_next;pt1=s1;pt2=s2;pt3=s3;while(p)if(p-data=0 & p-datanext;q-next=pt1-next;pt1-next=q;pt1=pt1-next;elseif(p-data=A & p-datadata=a & p-datanext;q-next=pt2-next;pt2-next=q;pt2=pt2-next;elseq=p;p=p-next;q-next=pt3-next;pt3-

38、next=q;pt3=pt3-next;q=L;free(q);return OK;在2.34至2.36題中,“異或指針雙向鏈表”類型XorLinkedList和指針異或函數(shù) XorP定義為:typedef struct XorNode char data;struct XorNode *LRPtr; XorNode, *XorPointer;typede struct /無頭結(jié)點(diǎn)的異或指針雙向鏈表XorPointer Left, Right; /分別指向鏈表的左側(cè)和右端 XorLinkedList;XorPointer XorP(XorPointer p, XorPointer q);II指

39、針異或函數(shù)XorP返回指針p和q的異或值2.34假設(shè)在算法描述語言中引入指針的二元運(yùn)算“異或”,若a和b為指針,則a b的運(yùn)算結(jié)果仍為原指針類型,且a (a b)=(a a) b=b(a b) b=a (b b)=a則可利用一個(gè)指針域來實(shí)現(xiàn)雙向鏈表L。鏈表L中的每個(gè)結(jié)點(diǎn)只含兩個(gè)域:data域和LRPtr 域,其中LRPtr域存放該結(jié)點(diǎn)的左鄰與右鄰結(jié)點(diǎn)指針(不存在時(shí)為NULL的異或。若設(shè)指針L.Left指向鏈表中的最左結(jié)點(diǎn),L.Right指向鏈表中的最右結(jié)點(diǎn),則可實(shí)現(xiàn)從左向右或從右向左遍歷此雙向鏈表的操作。試寫一算法 按任一方向依次輸岀鏈表中各元素的值。解:Status TraversingLi

40、nkList(XorLinkedList &L,char d)XorPointer p,left,right;if(d=T|d=L)p=L.Left;left=NULL;while(p!=NULL)VisitingData(p-data);left=p;p=XorP(left,p-LRPtr);elseif(d=r|d=R)p=L.Right;right=NULL;while(p!=NULL)VisitingData(p-data);right=p;p=XorP(p-LRPtr,right);else return ERROR;return OK;2.35采用2.34題所述的存儲(chǔ)結(jié)構(gòu),寫出在第

41、i個(gè)結(jié)點(diǎn)之前插入一個(gè)結(jié)點(diǎn)的算法。Status Insert_XorLinkedList(XorLinkedList & L,int x,int i)/在異或鏈表L的第i個(gè)元素前插入元素xp=L.left;pre=NULL;r=(XorNode*)malloc(sizeof(XorNode);r-data=x;if(i=1) /當(dāng)插入點(diǎn)在最左邊的情況p-LRPtr=XorP(p. LRPtr,r);r-LRPtr=p;L.left=r;return OK;j=1;q=p-LRPtr; /當(dāng)插入點(diǎn)在中間的情況while (+jLRPtr,pre);pre=p;p=q;/ while / 在p,q兩

42、結(jié)點(diǎn)之間插入if(!q)return INFEASIBLE; i不可以超過表長p-LRPtr=XorP(XorP(p-LRPtr,q),r); q-LRPtr=XorP(XorP(q-LRPtr,p),r);r-LRPtr=XorP(p,q); / 修改指針return OK;/ lnsert_XorLinkedList2.36采用2.34題所述的存儲(chǔ)結(jié)構(gòu),寫出刪除第i個(gè)結(jié)點(diǎn)的算法。Status Delete_XorLinkedList(XorlinkedList &L,int i)/刪除異或鏈表L的第i個(gè)元素p=L .l eft;pre=NULL;if(i=1) /刪除最左結(jié)點(diǎn)的情況q=p-

43、LRPtr;q-LRPtr=XorP(q-LRPtr,p);L.l eft=q;free(p);return OK;j=1;q=p-LRPtr;while (+jLRPtr,pre);pre=p;p=q;/ while /找到待刪結(jié)點(diǎn)qif(!q) return INFEASIBLE; /i不可以超過表長if(L.right=q) /q 為最右結(jié)點(diǎn)的情況p-LRPtr=XorP(p-LRPtr,q);L.right=p;free(q);return OK;r=XorP(q-LRPtr,p); q為中間結(jié)點(diǎn)的情況,此時(shí)p,r分別為其左右結(jié)點(diǎn)p-LRPtr=XorP(XorP(p-LRPtr,q)

44、,r);r-LRPtr=XorP(XorP(r-LRPtr,q),p); /修改指針free(q);return OK;/ Delete_XorLinkedList2.37設(shè)以帶頭結(jié)點(diǎn)的雙向循環(huán)鏈表表示的線性表L二a,a2,,an。試寫一時(shí)間復(fù)雜度0(n)的算法,將L改造為L = 63,,an,a4,a2。解:/ 將雙向鏈表 L=(a1,a2,.,an) 改造為(a1,a3,.,an,.,a2)Status ListChange_DuL(DuLinkList &L)int i;DuLinkList p,q,r;p=L-next;r=L-pre;i=1;while(p!=r)if(i%2=0)q

45、=p;p=p-next;/刪除結(jié)點(diǎn)q_pre_next=q_next; q_next_pre=q_pre;/插入到頭結(jié)點(diǎn)的左面q-pre=r-next-pre;r-next-pre=q;q-next=r-next;r-next=q;else p=p-next;i+;return OK;2.38設(shè)有一個(gè)雙向循環(huán)鏈表,每個(gè)結(jié)點(diǎn)中除有pre ,data和next三個(gè)域外,還增設(shè)了一個(gè)訪問頻度域freq在鏈表被起用之前,頻度域 freq的值均初始化為零,而每當(dāng)對(duì)鏈表進(jìn)行一次Locate(L,x)的操作后,被訪問的結(jié)點(diǎn)(即元素值等于x的結(jié)點(diǎn))中的頻度域freq的值便增1,同時(shí)調(diào)整鏈表中結(jié)點(diǎn)之間的次序,使其按訪問頻度非遞增的次序順序排列,以便始終保持被頻繁訪問的結(jié)點(diǎn)總是靠近表頭結(jié)點(diǎn)。試編寫符合上述 要求的Locate操作的算法。解:DuLinkList ListLocate_DuL(DuLinkList &L,ElemType e)DuLinkList p,q;p=L_next;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論