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

下載本文檔

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

文檔簡(jiǎn)介

1、線性表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)在單鏈表中,除了首元結(jié)點(diǎn)外,任一結(jié)點(diǎn)的存儲(chǔ)

2、位置由其前驅(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í)行下列各程序段,并畫(huà)出結(jié)果示意圖。解:2.5畫(huà)出執(zhí)行下列各行語(yǔ)句后各指針及鏈表的示意圖。L=(LinkList)malloc(sizeof(LNode);P=L;for(i=1;i<=4;i+)P->next=(LinkList)malloc(sizeof(LNode);P=P->next;P->data

3、=i*2-1;P->next=NULL;for(i=4;i>=1;i-) Ins_LinkList(L,i+1,i*2);for(i=1;i<=3;i+) Del_LinkList(L,i);解:2.6已知 L 是無(wú)表頭結(jié)點(diǎn)的單鏈表,且P 結(jié)點(diǎn)既不是首元結(jié)點(diǎn),也不是尾元結(jié)點(diǎn),試從下列提供的答案中選擇合適的語(yǔ)句序列。a. 在 P 結(jié)點(diǎn)后插入 S 結(jié)點(diǎn)的語(yǔ)句序列是 _ 。b. 在 P 結(jié)點(diǎn)前插入 S 結(jié)點(diǎn)的語(yǔ)句序列是 _ 。c. 在表首插入 S 結(jié)點(diǎn)的語(yǔ)句序列是 _ 。d. 在表尾插入 S 結(jié)點(diǎn)的語(yǔ)句序列是 _ 。(1) P->next=S;(2) P->next=P

4、->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->next!=NULL) P=P->next;(10) P=Q;(11) P=L;(12) L=S;(13) L=P;解: a. (4) (1)b. (7) (11) (8) (4) (1)c. (5) (12)d. (9) (1) (6)2.7已知 L

5、是帶表頭結(jié)點(diǎn)的非空單鏈表,且P 結(jié)點(diǎn)既不是首元結(jié)點(diǎn),也不是尾元結(jié)點(diǎn),試從下列提供的答案中選擇合適的語(yǔ)句序列。a. 刪除 P 結(jié)點(diǎn)的直接后繼結(jié)點(diǎn)的語(yǔ)句序列是 _。b. 刪除 P 結(jié)點(diǎn)的直接前驅(qū)結(jié)點(diǎn)的語(yǔ)句序列是 _。c. 刪除 P 結(jié)點(diǎn)的語(yǔ)句序列是 _。d. 刪除首元結(jié)點(diǎn)的語(yǔ)句序列是 _ 。e. 刪除尾元結(jié)點(diǎn)的語(yǔ)句序列是 _ 。(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(

6、Q->next!=NULL) P=Q; 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) (7)

7、(3) (14)d. (12) (11) (3) (14)e. (9) (11) (3) (14)2.8已知 P 結(jié)點(diǎn)是某雙向鏈表的中間結(jié)點(diǎn),試從下列提供的答案中選擇合適的語(yǔ)句序列。a. 在 P 結(jié)點(diǎn)后插入 S 結(jié)點(diǎn)的語(yǔ)句序列是 _ 。b. 在 P 結(jié)點(diǎn)前插入 S 結(jié)點(diǎn)的語(yǔ)句序列是 _ 。c. 刪除 P 結(jié)點(diǎn)的直接后繼結(jié)點(diǎn)的語(yǔ)句序列是 _ 。d. 刪除 P 結(jié)點(diǎn)的直接前驅(qū)結(jié)點(diǎn)的語(yǔ)句序列是 _ 。e. 刪除 P 結(jié)點(diǎn)的語(yǔ)句序列是 _。(1) P->next=P->next->next;(2) P->priou=P->priou->priou;(3) P->

8、;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=P;(11) P->next->priou=P;(12) P->next->priou=S;(13) P->priou->next=S;(14) P->next->priou=P->priou

9、;(15) Q=P->next;(16) Q=P->priou;(17) free(P);(18) free(Q);解: a. (7) (3) (6) (12)b. (8) (4) (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是無(wú)表頭結(jié)點(diǎn)的單鏈表if(L && L->next) Q=L;L=L->next;P=L;while(P->next) P=P->next;P->ne

10、xt=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 的長(zhǎng)度不小于2,將 L 的首元結(jié)點(diǎn)變成尾元結(jié)點(diǎn)。(2) 將單循環(huán)鏈表拆成兩個(gè)單循環(huán)鏈表。2.10指出以下算法中的錯(cuò)誤和低效之處,并將它改寫(xiě)為一個(gè)既正確又高效的算法。Status DeleteK(SqL

11、ist &a,int i,int k)/ 本過(guò)程從順序存儲(chǔ)結(jié)構(gòu)的線性表a 中刪除第 i 個(gè)元素起的 k 個(gè)元素if(i<1|k<0|i+k>a.length) return INFEASIBLE;/參數(shù)不合法else for(count=1;count<k;count+)/刪除第一個(gè)元素for(j=a.length;j>=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

12、 個(gè)元素/ 注意 i 的編號(hào)從 0 開(kāi)始int j;if(i<0|i>a.length-1|k<0|k>a.length-i) return INFEASIBLE;for(j=0;j<=k;j+)a.elemj+i=a.elemj+i+k;a.length=a.length-k;return OK;2.11設(shè)順序表 va 中的數(shù)據(jù)元素遞增有序。試寫(xiě)一算法,將x 插入到順序表的適當(dāng)位置上,以保持該表的有序性。解:Status InsertOrderList(SqList &va,ElemType x)/ 在非遞減的順序表 va 中插入元素 x 并使其仍成為順

13、序表的算法int i;if(va.length=va.listsize)return(OVERFLOW);for(i=va.length;i>0,x<va.elemi-1;i-)va.elemi=va.elemi-1;va.elemi=x;va.length+;return OK;2.12設(shè) Aa1 , am和 Bb1 ,bn均為順序表,A 和 B分別為A 和B 中除去最大共同前綴后的子表。若AB空表,則AB;若A=空表,而B(niǎo)空表,或者兩者均不為空表,且A的首元小于B的首元,則AB ;否則AB 。試寫(xiě)一個(gè)比較A , B 大小的算法。解:Status CompareOrderList

14、(SqList &A,SqList &B)int i,k,j;k=A.length>B.length?A.length:B.length;for(i=0;i<k;i+)if(A.elemi>B.elemi) j=1;if(A.elemi<B.elemi) j=-1;if(A.length>k) j=1;if(B.length>k) j=-1;if(A.length=B.length) j=0;return j;2.13試寫(xiě)一算法在帶頭結(jié)點(diǎn)的單鏈表結(jié)構(gòu)上實(shí)現(xiàn)線性表操作Locate(L,x);解:int LocateElem_L(LinkList

15、 &L,ElemType x)int i=0;LinkList p=L;while(p&&p->data!=x)p=p->next;i+;if(!p) return 0;else return i;2.14試寫(xiě)一算法在帶頭結(jié)點(diǎn)的單鏈表結(jié)構(gòu)上實(shí)現(xiàn)線性表操作Length(L)。解:/ 返回單鏈表的長(zhǎng)度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),

16、并且已知兩個(gè)鏈表的長(zhǎng)度分別為m和 n。試寫(xiě)一算法將這兩個(gè)鏈表連接在一起,假設(shè)指針hc 指向連接后的鏈表的頭結(jié)點(diǎn),并要求算法以盡可能短的時(shí)間完成連接運(yùn)算。請(qǐng)分析你的算法的時(shí)間復(fù)雜度。解:void MergeList_L(LinkList &ha,LinkList &hb,LinkList &hc)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=

17、pb->next;pb->next=ha->next;elsehc=ha;while(pa->next) pa=pa->next;pa->next=hb->next;2.16已知指針la和lb分別指向兩個(gè)無(wú)頭結(jié)點(diǎn)單鏈表中的首元結(jié)點(diǎn)。下列算法是從表la中刪除自第i 個(gè)元素起共len 個(gè)元素后,將它們插入到表lb 中第i個(gè)元素之前。試問(wèn)此算法是否正確?若有錯(cuò),請(qǐng)改正之。Status DeleteAndInsertSub(LinkedList la,LinkedList lb,int i,int j,int len)if(i<0|j<0|len&

18、lt;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;解:Status DeleteAndInsertSub(LinkList &la,LinkList &lb,int i,int j,int len)LinkList p,q,s,prev=NULL;int k=1;if(

19、i<0|j<0|len<0) return INFEASIBLE;/ 在 la 表中查找第 i 個(gè)結(jié)點(diǎn)p=la;while(p&&k<i)prev=p;p=p->next;k+;if(!p)return INFEASIBLE;/ 在 la 表中查找第 i+len-1 個(gè)結(jié)點(diǎn)q=p;k=1;while(q&&k<len)q=p->next;k+;if(!q)return INFEASIBLE;/ 完成刪除,注意, i=1 的情況需要特殊處理if(!prev) la=q->next;else prev->next

20、=q->next;/ 將從 la 中刪除的結(jié)點(diǎn)插入到 lb 中if(j=1)q->next=lb;lb=p;elses=lb;k=1;while(s&&k<j-1)s=s->next;k+;if(!s)return INFEASIBLE;q->next=s->next;s->next=p; /完成插入return OK;2.17試寫(xiě)一算法, 在無(wú)頭結(jié)點(diǎn)的動(dòng)態(tài)單鏈表上實(shí)現(xiàn)線性表操作Insert(L,i,b),并和在帶頭結(jié)點(diǎn)的動(dòng)態(tài)單鏈表上實(shí)現(xiàn)相同操作的算法進(jìn)行比較。解:Status Insert(LinkList & L,int i

21、,int b) /在無(wú)頭結(jié)點(diǎn)鏈表L 的第i個(gè)元素之前插入元素bp=L;q=(LinkList*)malloc(sizeof(LNode);q.data=b;if(i=1)q.next=p;L=q; /插入在鏈表頭部elsewhile(-i>1)p=p->next;q->next=p->next;p->next=q; /插入在第 i 個(gè)元素的位置/ Insert2.18 試寫(xiě)一算法,實(shí)現(xiàn)線性表操作Delete(L,i),并和在帶頭結(jié)點(diǎn)的動(dòng)態(tài)單鏈表上實(shí)現(xiàn)相同操作的算法進(jìn)行比較。解:Status Delete(LinkList &L,int i) /在無(wú)頭結(jié)點(diǎn)鏈

22、表L 中刪除第i 個(gè)元素if(i=1)L=L->next; /刪除第一個(gè)元素elsep=L;while(-i>1)p=p->next;p->next=p->next->next; /刪除第i個(gè)元素/ Delete2.19已知線性表中的元素以值遞增有序排列,并以單鏈表作存儲(chǔ)結(jié)構(gòu)。試寫(xiě)一高效的算法,刪除表中所有值大于mink 且小于 maxk 的元素(若表中存在這樣的元素),同時(shí)釋放被刪結(jié)點(diǎn)空間,并分析你的算法的時(shí)間復(fù)雜度 (注意, mink 和 maxk 是給定的兩個(gè)參變量,它們的值可以和表中的元素相同,也可以不同)。解:Status ListDelete_L

23、(LinkList &L,ElemType mink,ElemType maxk)LinkList p,q,prev=NULL;if(mink>maxk)return ERROR;p=L;prev=p;p=p->next;while(p&&p->data<maxk)if(p->data<=mink)prev=p;p=p->next;elseprev->next=p->next;q=p;p=p->next;free(q);return OK;2.20同 2.19 題條件,試寫(xiě)一高效的算法,刪除表中所有值相同的多余

24、元素(使得操作后的線性表中所有元素的值均不相同) ,同時(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試寫(xiě)一算法,實(shí)現(xiàn)順序表的就地逆置,即利用原表的存儲(chǔ)空間將線性表a1 , an逆置為a

25、n , a1。解:/順序表的逆置Status ListOppose_Sq(SqList &L)int i;ElemType x;for(i=0;i<L.length/2;i+)x=L.elemi;L.elemi=L.elemL.length-1-i;L.elemL.length-1-i=x;return OK;2.22試寫(xiě)一算法,對(duì)單鏈表實(shí)現(xiàn)就地逆置。解:/ 帶頭結(jié)點(diǎn)的單鏈表的逆置Status ListOppose_L(LinkList &L)LinkList p,q;p=L;p=p->next;L->next=NULL;while(p)q=p;p=p->

26、;next;q->next=L->next;L->next=q;return OK;2.23 設(shè)線性表 Aa1 , a2 , , am , B b1 ,b2 ,bn ,試寫(xiě)一個(gè)按下列規(guī)則合并A,B 為線性表C 的算法,即使得Ca1 , b1 , am , bm , bm 1 , ,bn當(dāng) mn 時(shí);Ca1 , b1 , an , bn ,an 1 , , am當(dāng) mn 時(shí)。線性表 A, B 和 C 均以單鏈表作存儲(chǔ)結(jié)構(gòu),且 C 表利用 A 表和 B 表中的結(jié)點(diǎn)空間構(gòu)成。注意:?jiǎn)捂湵淼拈L(zhǎng)度值 m和 n 均未顯式存儲(chǔ)。解:/ 將合并后的結(jié)果放在 C 表中,并刪除 B 表Statu

27、s ListMerge_L(LinkList &A,LinkList &B,LinkList &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 和 B,均以單鏈表作

28、存儲(chǔ)結(jié)構(gòu),請(qǐng)編寫(xiě)算法將表歸并成一個(gè)按元素值遞減有序(即非遞增有序,允許表中含有值相同的元素)排列的線性表利用原表(即 A 表和 B 表)的結(jié)點(diǎn)空間構(gòu)造 C 表。A表和 BC,并要求解:/將合并逆置后的結(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

29、;C=A;while(pa&&pb)if(pa->data<pb->data)qa=pa;pa=pa->next;qa->next=A->next;/A->next=qa;將當(dāng)前最小結(jié)點(diǎn)插入A 表表頭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->ne

30、xt;qb->next=A->next;A->next=qb;pb=B;free(pb);return OK;2.25假設(shè)以兩個(gè)元素依值遞增有序排列的線性表同),現(xiàn)要求另辟空間構(gòu)成一個(gè)線性表C,其元素為A 和 B 分別表示兩個(gè)集合(即同一表中的元素值各不相A 和 B 中元素的交集,且表C 中的元素有依值遞增有序排列。試對(duì)順序表編寫(xiě)求C 的算法。解:/ 將 A、 B 求交后的結(jié)果放在 C 表中Status ListCross_Sq(SqList &A,SqList &B,SqList &C)int i=0,j=0,k=0;while(i<A.len

31、gth && j<B.length)if(A.elemi<B.elemj)i+;elseif(A.elemi>B.elemj)j+;elseListInsert_Sq(C,k,A.elemi);i+;k+;return OK;2.26要求同 2.25 題。試對(duì)單鏈表編寫(xiě)求C 的算法。解:/ 將 A、 B 求交后的結(jié)果放在 C 表中,并刪除 B 表Status ListCross_L(LinkList &A,LinkList &B,LinkList &C)LinkList pa,pb,qa,qb,pt;pa=A;pb=B;qa=pa;/保

32、存pa 的前驅(qū)指針qb=pb;/保存pb 的前驅(qū)指針pa=pa->next;pb=pb->next;C=A;while(pa&&pb)if(pa->data<pb->data)pt=pa;pa=pa->next;qa->next=pa;free(pt);elseif(pa->data>pb->data)pt=pb;pb=pb->next;qb->next=pb;free(pt);elseqa=pa;pa=pa->next;while(pa)pt=pa;pa=pa->next;qa->nex

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

34、i=0,j=0,k=0;while(i<A.length && j<B.length)if(A.elemi<B.elemj)i+;elseif(A.elemi>B.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;(2)/ A 、B 求交,然后刪除相同元素,將結(jié)果放在A 表中Status ListCrossDelSame_Sq(SqList

35、&A,SqList &B)int i=0,j=0,k=0;while(i<A.length && j<B.length)if(A.elemi<B.elemj)i+;elseif(A.elemi>B.elemj)j+;elseif(k=0)A.elemk=A.elemi;k+;elseif(A.elemk!=A.elemi)A.elemk=A.elemi;k+;i+;A.length=k;return OK;2.28對(duì) 2.25題的條件作以下兩點(diǎn)修改,對(duì)單鏈表重新編寫(xiě)求得表C 的算法。(1)假設(shè)在同一表(A 或 B)中可能存在值相同的元素,

36、但要求新生成的表C 中的元素值各不相同;(2) 利用原表( A 表或 B 表)中的結(jié)點(diǎn)構(gòu)成表 C,并釋放 A 表中的無(wú)用結(jié)點(diǎn)空間。解:(1)/ A 、B 求交,結(jié)果放在 C 表中,并刪除相同元素Status ListCrossDelSame_L(LinkList &A,LinkList &B,LinkList &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-

37、>data<pb->data)pt=pa;pa=pa->next;qa->next=pa;free(pt);elseif(pa->data>pb->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(p

38、t);while(pb)pt=pb;pb=pb->next;qb->next=pb;free(pt);pb=B;free(pb);return OK;(2)/ A 、B 求交,結(jié)果放在 A 表中,并刪除相同元素pa=A;pb=B;qa=pa;/保存 pa 的前驅(qū)指針qb=pb;/保存 pb 的前驅(qū)指針pa=pa->next;pb=pb->next;while(pa&&pb)if(pa->data<pb->data)pt=pa;pa=pa->next;qa->next=pa;free(pt);elseif(pa->dat

39、a>pb->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->next=pb;free(pt);pb=B;free(pb);return OK;2.29已

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

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

42、=pa;/保存pa 的前驅(qū)指針qb=pb;/保存pb 的前驅(qū)指針pa=pa->next;pb=pb->next;while(pa&&pb)if(pb->data<pa->data)pt=pb;pb=pb->next;qb->next=pb;free(pt);elseif(pb->data>pa->data)qa=pa;pa=pa->next;elsept=pa;pa=pa->next;qa->next=pa;free(pt);while(pb)pt=pb;pb=pb->next;qb->n

43、ext=pb;free(pt);pb=B;free(pb);return OK;2.31假設(shè)某個(gè)單向循環(huán)鏈表的長(zhǎng)度大于1,且表中既無(wú)頭結(jié)點(diǎn)也無(wú)頭指針。已知s 為指向鏈表中某個(gè)結(jié)點(diǎn)的指針,試編寫(xiě)算法在鏈表中刪除指針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;fre

44、e(p);return OK;2.32已知有一個(gè)單向循環(huán)鏈表,其每個(gè)結(jié)點(diǎn)中含三個(gè)域:pre , data 和 next ,其中 data 為數(shù)據(jù)域, next為指向后繼結(jié)點(diǎn)的指針域,pre也為指針域,但它的值為空,試編寫(xiě)算法將此單向循環(huán)鏈表改為雙向循環(huán)鏈表,即使pre 成為指向前驅(qū)結(jié)點(diǎn)的指針域。解:/ 建立一個(gè)空的循環(huán)鏈表Status InitList_DL(DuLinkList &L)L=(DuLinkList)malloc(sizeof(DuLNode);if(!L) exit(OVERFLOW);L->pre=NULL;L->next=L;return OK;/ 向循

45、環(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->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=

46、p->next;if(p=L) p->pre=q;return OK;2.33已知由一個(gè)線性鏈表表示的線性表中含有三類字符的數(shù)據(jù)元素(如:字母字符、數(shù)字字符和其他字符),試編寫(xiě)算法將該線性表分割為三個(gè)循環(huán)鏈表,其中每個(gè)循環(huán)鏈表表示的線性表中均只含一類字符。解:/ 將單鏈表 L 劃分成 3 個(gè)單循環(huán)鏈表Status ListDivideInto3CL(LinkList &L,LinkList &s1,LinkList &s2,LinkList &s3)LinkList p,q,pt1,pt2,pt3;p=L->next;pt1=s1;pt2=s2;pt3=s3;while(p)if(p->data>='0' && p->data<='9')q=p;p=p->next;q

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論