嚴蔚敏版數(shù)據(jù)結(jié)構(gòu)習(xí)題集答案.
《嚴蔚敏版數(shù)據(jù)結(jié)構(gòu)習(xí)題集答案.》由會員分享,可在線閱讀,更多相關(guān)《嚴蔚敏版數(shù)據(jù)結(jié)構(gòu)習(xí)題集答案.(55頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第1章緒論 1.1簡述下列術(shù)語:數(shù)據(jù),數(shù)據(jù)元素、數(shù)據(jù)對象、數(shù)據(jù)結(jié)構(gòu)、存儲結(jié)構(gòu)、數(shù)據(jù)類型和抽象數(shù)據(jù)類型。 解:數(shù)據(jù)是對客觀事物的符號表示。在計算機科學(xué)中是指所有能輸入到計算機中并被計算機程序處理的符 號的總稱。 數(shù)據(jù)元素是數(shù)據(jù)的基本單位,在計算機程序中通常作為一個整體進行考慮和處理。 數(shù)據(jù)對象是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個子集。 數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 存儲結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)在計算機中的表示。 數(shù)據(jù)類型是一個值的集合和定義在這個值集上的一組操作的總稱。 抽象數(shù)據(jù)類型是指一個數(shù)學(xué)模型以及定義在該模型上的一組操作。是對一般數(shù)據(jù)類型的擴展。
2、1.2試描述數(shù)據(jù)結(jié)構(gòu)和抽象數(shù)據(jù)類型的概念與程序設(shè)計語言中數(shù)據(jù)類型概念的區(qū)別。 解:抽象數(shù)據(jù)類型包含一般數(shù)據(jù)類型的概念,但含義比一般數(shù)據(jù)類型更廣、更抽象。一般數(shù)據(jù)類型由 具體語言系統(tǒng)內(nèi)部定義,直接提供給編程者定義用戶數(shù)據(jù),因此稱它們?yōu)轭A(yù)定義數(shù)據(jù)類型。抽象數(shù)據(jù)類型 通常由編程者定義,包括定義它所使用的數(shù)據(jù)和在這些數(shù)據(jù)上所進行的操作。在定義抽象數(shù)據(jù)類型中的數(shù) 據(jù)部分和操作部分時,要求只定義到數(shù)據(jù)的邏輯結(jié)構(gòu)和操作說明,不考慮數(shù)據(jù)的存儲結(jié)構(gòu)和操作的具體實 現(xiàn),這樣抽象層次更高,更能為其他用戶提供良好的使用接口。 1.3設(shè)有數(shù)據(jù)結(jié)構(gòu)(D,R),其中 D = ^d1,d2,d3,d4?,R —r r
3、— d1,d2 , d2,d3 , d3,d4 ?
試按圖論中圖的畫法慣例畫岀其邏輯結(jié)構(gòu)圖。
解:
1.4試仿照三元組的抽象數(shù)據(jù)類型分別寫岀抽象數(shù)據(jù)類型復(fù)數(shù)和有理數(shù)的定義(有理數(shù)是其分子、分母均 為自然數(shù)且分母不為零的分數(shù))。
解:
ADT Complex{
數(shù)據(jù)對象:D={r,i|r,i 為實數(shù)}
數(shù)據(jù)關(guān)系:R={
4、
Put (&C,k,e)
操作結(jié)果:改變復(fù)數(shù) C的第k元的值為e
IsAscending(C)
操作結(jié)果:如果復(fù)數(shù) C的兩個元素按升序排列,則返回 1,否則返回0
IsDescending(C)
操作結(jié)果:如果復(fù)數(shù) C的兩個元素按降序排列,則返回 1,否則返回0
Max(C, &e)
操作結(jié)果:用e返回復(fù)數(shù)C的兩個元素中值較大的一個
Min(C,&e)
操作結(jié)果:用e返回復(fù)數(shù)C的兩個元素中值較小的一個
}ADT Complex
ADT RationalNumber{
數(shù)據(jù)對象:D={s,m|s,m為自然數(shù),且 m不為0}
數(shù)據(jù)關(guān)系:R={}
基本操作:
5、 InitRationalNumber(&R,s,m) 操作結(jié)果:構(gòu)造一個有理數(shù) R,其分子和分母分別為 s和m DestroyRationalNumber(&R) 操作結(jié)果:銷毀有理數(shù) R Get(R,k, &e) 操作結(jié)果:用e返回有理數(shù)R的第k元的值 Put (&R,k,e) 操作結(jié)果:改變有理數(shù) R的第k元的值為e IsAscending(R) 操作結(jié)果:若有理數(shù) R的兩個元素按升序排列,則返回 1,否則返回0 IsDescending(R) 操作結(jié)果:若有理數(shù) R的兩個元素按降序排列,則返回 1,否則返回0 Max(R, &e) 操作結(jié)果:用e返回有理數(shù)R
6、的兩個元素中值較大的一個
Min(R,&e)
操作結(jié)果:用e返回有理數(shù)R的兩個元素中值較小的一個
}ADT RationalNumber
1.5試畫出與下列程序段等價的框圖。
(1) product=1; i=1;
while(i<=n){
product *= i;
i++;
}
⑵ i=0;
do {
i++;
} while((i!=n) && (a[i]!=x));
(3) switch {
case x 7、y);
1.6在程序設(shè)計中,常用下列三種不同的出錯處理方式:
(1) 用exit語句終止執(zhí)行并報告錯誤;
(2) 以函數(shù)的返回值區(qū)別正確返回或錯誤返回;
(3) 設(shè)置一個整型變量的函數(shù)參數(shù)以區(qū)別正確返回或某種錯誤返回。 試討論這三種方法各自的優(yōu)缺點。
解:(1)exit常用于異常錯誤處理,它可以強行中斷程序的執(zhí)行,返回操作系統(tǒng)。
(2) 以函數(shù)的返回值判斷正確與否常用于子程序的測試,便于實現(xiàn)程序的局部控制。
(3) 用整型函數(shù)進行錯誤處理的優(yōu)點是可以給出錯誤類型,便于迅速確定錯誤。
1.7在程序設(shè)計中,可采用下列三種方法實現(xiàn)輸出和輸入:
(1) 通過scanf和printf 8、語句;
(2) 通過函數(shù)的參數(shù)顯式傳遞;
(3) 通過全局變量隱式傳遞。 試討論這三種方法的優(yōu)缺點。
解:(1)用scanf和printf 直接進行輸入輸出的好處是形象、 直觀,但缺點是需要對其進行格式控制,
較為煩瑣,如果出現(xiàn)錯誤,則會引起整個系統(tǒng)的崩潰。
(2) 通過函數(shù)的參數(shù)傳遞進行輸入輸出,便于實現(xiàn)信息的隱蔽,減少出錯的可能。
(3) 通過全局變量的隱式傳遞進行輸入輸出最為方便, 只需修改變量的值即可,但過多的全局變量使程
序的維護較為困難。
1.8設(shè)n為正整數(shù)。試確定下列各程序段中前置以記號 @勺語句的頻度:
(1) i=1; k=0;
while(i<=n-1) 9、{
@ k += 10*i;
i++;
}
(2) i=1; k=0;
do {
@ k += 10*i;
i++;
} while(i<=n-1);
(3) i=1; k=0;
while (i<=n-1) {
i++;
@ k += 10*i;
}
(4) k=0;
for(i=1; i<=n; i++) {
for(j=i; j<=n; j++) @ k++;
}
(5) for(i=1; i<=n; i++) {
for(j=1; j<=i; j++) {
for(k=1; k<=j; k++) @ x += delta;
}
(6) i 10、=1; j=0; while(i+jv=n) { @ if(i>j) j++;
else i++;
(7) x=n; y=0; // n
是不小于1
的常數(shù)
while(x>=(y+1)*(y+1)) {
@ y++;
(8) x=91; y=100;
while(y>0) {
@ if(x>100) { x -= 10; y--; }
else x++;
}
解:
(1) n-1
(2) n-1
⑶n-1
(4) n+(n-1)+(n-2)+...+1 =
n(n 1)
(5) 1+(1+2)+(1+2+3)+...+(1+2+3+.. 11、.+n)=
i(i 1)
1 J i(i 1) (i2 i)
2 i 呂 2 i 1
Ci
2 iT
12
1
n(n 1)(2 n 1) n(n 1)=
4
12
n(n 1)(2 n 3)
(6) n
(7) 一 n 向下取整
(8) 1100
1.9假設(shè)n為2的乘冪,并且n>2,試求下列算法的時間復(fù)雜度及變量 count的值(以n的函數(shù)形式表示)
int Time(int n) {
count = 0; x=2;
while(x 12、
count= log2 n - 2
1.11已知有實現(xiàn)同一功能的兩個算法,其時間復(fù)雜度分別為
O2n 和 0 n10, 假設(shè)現(xiàn)實計算機可連續(xù)
一 7 5
運算的時間為10秒(100多天),又每秒可執(zhí)行基本操作(根據(jù)這些操作來估算算法時間復(fù)雜度) 10次。
試問在此條件下,這兩個算法可解問題的規(guī)模 (即n值的范圍)各為多少?哪個算法更適宜?請說明理由。
n 12
解:2 =10 n=40
10 12
n 10 n=16
則對于同樣的循環(huán)次數(shù) n,在這個規(guī)模下,第二種算法所花費的代價要大得多。故在這個規(guī)模下,第
一種算法更適宜。
1.12設(shè)有以下三個函數(shù):
f n 13、 = 21n4 n2 1000, g n = 15n4 500n3,h n = 500n3.5 nlog n
請判斷以下斷言正確與否:
(1) f(n)
是 O(g(n))
(2) h(n)
是 O(f(n))
(3) g(n)
是 O(h(n))
(4) h(n)
是 O(n3.5)
(5) h(n)
是 O(nlogn)
解:(1)對(2)錯(3)錯(4)對(5)錯
2 2
1.13試設(shè)定若干n值,比較兩函數(shù)n和50nlog2 n的增長趨勢,并確定 n在什么范圍內(nèi),函數(shù) n的值 大于50n log2 n的值。
2
解:n的增長趨勢快。但在n較小的時候,5 14、0nlog2 n的值較大。
當 n>438 時,n2 50n log2 n
1.14判斷下列各對函數(shù) f n和g n,當n「-■時,哪個函數(shù)增長更快?
(1) f n =10n2 In n! 10n ,g n = 2n4 n 7
(2) f(n )=(1 n(n!)+5f,g(n )=13n2.5
(3) f(n)=n2.1 + Jn4 +1, g(n) =(ln(n!)$ + n
⑷ f(n )=2(n)+(2n I, g(n)=n(n)+n5
解:(1)g(n)快(2)g(n) 快⑶f(n) 快(4) f(n) 快
1.15試用數(shù)學(xué)歸納法證明:
n
(1) i2
二 15、n n 1 2n 1 / 6
n 一0
i T n
⑵7 Xi
i =0
二 xn 1 -1 / x-1
x = 1, n 一 0
n
(3) 、、? 2iA ^2n _1 n _1
i 4
n
2
(4) 7 2i _1 二 n2 n _1
i 4
1.16試寫一算法,自大至小依次輸岀順序讀入的三個整數(shù) X, Y和Z的值
解:
int max3(int x,int y,int z)
{
if(x>y)
if(x>z) return x;
else return z;
else
if(y>z) return y; else return z; 16、
}
1.17已知k階斐波那契序列的定義為
fo =0,仏=0,…,fk_2 =0, fk 1 =1;
fn 二 fn」* fn「 fn 上,n =k,k 1,
試編寫求k階斐波那契序列的第 m項值的函數(shù)算法,k和m均以值調(diào)用的形式在函數(shù)參數(shù)表中岀現(xiàn)。
解:k>0為階數(shù),n為數(shù)列的第n項
int Fibonacci(int k,int n)
{
if(k<1) exit(OVERFLOW);
int *p,x;
p=new int[k+1];
if(!p) exit(OVERFLOW);
int i,j;
for(i=0;i 17、 p[i]=0;
else p[i]=1;
}
for(i=k+1;i 18、um{Female,Male} SexType;
typedef struct{
char event[3]; // 項目
SexType sex;
SchoolName school;
int score;
} Component;
typedef struct{
int MaleSum; // 男團總分
int FemaleSum; / / 女團總分
int TotalSum; // 團體總分
} Sum;
Sum SumScore(SchoolName sn,Component a[],int n)
{
Sum temp;
temp.MaleSum=O;
19、temp.FemaleSum=O;
temp.TotalSum=0;
int i;
for(i=0;i 20、=1,2,…,n)。假設(shè)計 算機中允許的整數(shù)最大值為 maxint,則當n>arrsize或?qū)δ硞€k 1 _ k _ n,使k!?2k - max int時, 應(yīng)按岀錯處理。注意選擇你認為較好的岀錯處理方法。
解:
#include 21、;
for(i=0;i<=k;i++){
if(i==0) a[i]=1;
else{
if(2*i*a[i-1]>MAXINT) exit(0);
else a[i]=2*i*a[i-1];
}
}
for(i=0;i<=k;i++){
if(a[i]>MAXINT) exit(0);
else cout 22、i=0,1,…,n ), x0
和n,輸出為Pn x0。
解:
#include 23、(i=0;iv=n;i++) cin>>a[i];
coutvv"The polynomail value is "vvpolynomail(a,n,x,n)vvendl;
return 0;
}
double polynomail(int a[],int i,double x,int n)
{
if(i>0) return a[n-i]+polynomail(a,i-1,x,n)*x; else return a[n];
}
本算法的時間復(fù)雜度為 o(n)。
第2章線性表
2.1描述以下三個概念的區(qū)別:頭指針,頭結(jié)點,首元結(jié)點(第一個元素結(jié)點) 。
解:頭指針是指向鏈 24、表中第一個結(jié)點的指針。首元結(jié)點是指鏈表中存儲第一個數(shù)據(jù)元素的結(jié)點。頭結(jié)
點是在首元結(jié)點之前附設(shè)的一個結(jié)點,該結(jié)點不存儲數(shù)據(jù)元素,其指針域指向首元結(jié)點,其作用主要是為 了方便對鏈表的操作。它可以對空表、非空表以及首元結(jié)點的操作進行統(tǒng)一處理。
2.2填空題。
解:(1)在順序表中插入或刪除一個元素,需要平均移動 表中一半元素,具體移動的元素個數(shù)與 元素
在表中的位置有關(guān)。
(2) 順序表中邏輯上相鄰的元素的物理位置 必定緊鄰。單鏈表中邏輯上相鄰的元素的物理位置 不一定
緊鄰。
(3) 在單鏈表中,除了首元結(jié)點外,任一結(jié)點的存儲位置由 其前驅(qū)結(jié)點的鏈域的值指示。
(4) 在單鏈表中設(shè) 25、置頭結(jié)點的作用是插入和刪除首元結(jié)點時不用進行特殊處理。
2.3在什么情況下用順序表比鏈表好?
解:當線性表的數(shù)據(jù)元素在物理位置上是連續(xù)存儲的時候,用順序表比用鏈表好,其特點是可以進行 隨機存取。
e
2.4對以下單鏈表分別執(zhí)行下列各程序段,并畫岀結(jié)果示意圖。
till
P Q R S
解:
(1)
P Q R S
E
U
XJ-
5 fl.
0
6)
(7)
2.5畫岀執(zhí)行下列各行語句后各指針及鏈表的示意圖。
L=(LinkList)malloc(sizeof(LNode)); P=L;
for( 26、i=1;i<=4;i++){
P->next=(LinkList)malloc(sizeof(LNode));
P=P->next; P->data=i*2-1;
}
P->next=NULL;
for(i=4;i>=1;i--) lns_LinkList(L,i+1,i*2);
for(i=1;i<=3;i++) Del_LinkList(L,i);
解:
7
A
7 TIP
L
2.6已知L是無表頭結(jié)點的單鏈表,且 P結(jié)點既不是首元結(jié)點,也不是尾元結(jié)點,試從下列提供的答案中
選擇合適的語句序列。
a. 27、在P結(jié)點后插入S結(jié)點的語句序列是 。
b. 在P結(jié)點前插入S結(jié)點的語句序列是 。
c. 在表首插入S結(jié)點的語句序列是 。
d. 在表尾插入S結(jié)點的語句序列是 。
⑴ 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->next!=NULL) P=P->next;
(10) P=Q;
28、(11) P=L;
(12) L=S;
(13) L=P;
解:a.⑷(1)
b. (7) (11) (8)⑷(1)
c. (5) (12)
d. (9) (1) (6)
2.7已知L是帶表頭結(jié)點的非空單鏈表,且 P結(jié)點既不是首元結(jié)點,也不是尾元結(jié)點,試從下列提供的答
案中選擇合適的語句序列。
a. 刪除P結(jié)點的直接后繼結(jié)點的語句序列是 。
b. 刪除P結(jié)點的直接前驅(qū)結(jié)點的語句序列是 。
c. 刪除P結(jié)點的語句序列是 。
d. 刪除首元結(jié)點的語句序列是 。
e. 刪除尾元結(jié)點的語句序列是 。
(1) P=P->next;
(2) P->next=P;
29、(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; 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;
30、(14) free(Q);
解:a. (11) (3) (14)
b. (10) (12) (8)⑶(14)
c. (10) (12) (7)⑶(14)
d. (12) (11) (3) (14)
e. (9) (11)⑶(14)
2.8已知P結(jié)點是某雙向鏈表的中間結(jié)點,試從下列提供的答案中選擇合適的語句序列
a. 在P結(jié)點后插入 S結(jié)點的語句序列是 。
b. 在P結(jié)點前插入 S結(jié)點的語句序列是 。
c. 刪除P結(jié)點的直接后繼結(jié)點的語句序列是 。
d. 刪除P結(jié)點的直接前驅(qū)結(jié)點的語句序列是 。
e. 刪除P結(jié)點的語句序列是 。
(1) P->next=P->ne 31、xt->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=P;
(11) P->next->priou=P;
(12) P->next->priou=S;
(13) P->priou->next=S;
(14) P->next->priou=P 32、->priou;
(15) Q=P->next;
(16) Q=P->priou;
(17) free(P);
(18) free(Q);
解:a. (7)⑶⑹(12)
b. (8)⑷(5) (13)
c. (15) (1) (11) (18)
d. (16)⑵(10) (18)
e. (14) (9) (17)
2.9簡述以下算法的功能。
(1) Status A(LinkedList L) { 〃L 是無表頭結(jié)點的單鏈表
if(L && L->next) {
Q=L; L=L->next; P=L;
while(P->next) P=P->next;
P->n 33、ext=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)鏈表中的兩個結(jié)點
BB(pa,pb);
BB(pb,pa);
}
解:(1)如果L的長度不小于2,將L的首元結(jié)點變成尾元結(jié)點。
(2) 將單循環(huán)鏈表拆成兩個單循環(huán)鏈表。
2.10指出以下算法中的錯誤和低效之處,并將它改寫為一個既正確又高效的 34、算法。
Status DeleteK(SqList & a,int i,int k)
{
//本過程從順序存儲結(jié)構(gòu)的線性表 a中刪除第i個元素起的k個元素
if(i<1||k 35、,int i,int k)
{
//從順序存儲結(jié)構(gòu)的線性表 a中刪除第i個元素起的k個元素
//注意i的編號從0開始
int j;
if(i 36、(SqList &va,ElemType x)
{
//在非遞減的順序表va中插入元素x并使其仍成為順序表的算法
int i;
if(va.length==va.listsize)return(OVERFLOW);
for(i=va .l ength;i>0,x 37、B ;若A =空表,而B ■-空表,或者兩者均不為空表,且 A
的首元小于B ■的首元,則A .. B ;否則A B。試寫一個比較 A, B大小的算法。
解:
Status CompareOrderList(SqList &A,SqList &B)
{
int i,k,j;
k=A.length>B.length?A.length:B.length;
for(i=0;i 38、k) j=-1;
if(A.length==B.length) j=0;
return j;
}
2.13試寫一算法在帶頭結(jié)點的單鏈表結(jié)構(gòu)上實現(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;
else return i;
}
2.14試寫一算法在帶頭結(jié)點的單鏈表結(jié)構(gòu)上實現(xiàn)線性表操作 Length(L)。
解:
//返 39、回單鏈表的長度
int ListLength_L(LinkList &L)
{
int i=0;
LinkList p=L;
if(p) p=p-next;
while(p){
p=p->next;
}
return i;
}
2.15已知指針ha和hb分別指向兩個單鏈表的頭結(jié)點,并且已知兩個鏈表的長度分別為 m和n。試寫一算
法將這兩個鏈表連接在一起,假設(shè)指針he指向連接后的鏈表的頭結(jié)點,并要求算法以盡可能短的時間完成 連接運算。請分析你的算法的時間復(fù)雜度。
解:
void MergeList_L(LinkList &ha, LinkList & hb, 40、LinkList & he)
{
LinkList pa,pb;
pa=ha;
pb=hb;
while(pa->next&&pb->next){
pa=pa_>next;
pb=pb->next;
}
if(!pa->next){
he=hb;
while(pb->next) pb=pb->next;
pb->next=ha->next;
}
else{
he=ha;
while(pa->next) pa=pa->next;
pa->next=hb->next;
}
}
2.16已知指針la和lb分別指向兩個無頭結(jié)點單鏈表中的首元結(jié)點。下列算法是從表 41、la中刪除自第i個
元素起共len個元素后,將它們插入到表lb中第i個元素之前。試問此算法是否正確?若有錯, 請改正之。
Status DeleteAndlnsertSub(LinkedList la,LinkedList lb,int i,int j,int len)
if(i 42、k++; }
s=s->next; k++; }
q->next=s->next;
}
解:
Status DeleteAndInsertSub(LinkList &la, LinkList & lb,int i,int j,int len)
LinkList p,q,s,prev=NULL;
int k=1;
if(i<0||jv0||len<0) return INFEASIBLE;
//在la表中查找第i個結(jié)點
p=la;
while(p&&knext;
k++;
}
if(!p)return INFEASIBLE;
43、//在la表中查找第i+len-1 個結(jié)點
q=p; k=1;
while(q&&k 44、ASIBLE;
q->next=s->next;
s->next=p; // 完成插入
}
return OK;
}
2.17試寫一算法,在無頭結(jié)點的動態(tài)單鏈表上實現(xiàn)線性表操作 Insert(L,i,b) ,并和在帶頭結(jié)點的動態(tài)單
鏈表上實現(xiàn)相同操作的算法進行比較。
2.18試寫一算法,實現(xiàn)線性表操作 Delete(L,i),并和在帶頭結(jié)點的動態(tài)單鏈表上實現(xiàn)相同操作的算法進
行比較。
2.19已知線性表中的元素以值遞增有序排列,并以單鏈表作存儲結(jié)構(gòu)。試寫一高效的算法,刪除表中所有
值大于mink且小于maxk的元素(若表中存在這樣的元素),同時釋放被刪結(jié)點空間, 45、并分析你的算法的時
間復(fù)雜度(注意,mink和maxk是給定的兩個參變量,它們的值可以和表中的元素相同,也可以不同) 。
解:
Status ListDelete_L(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 46、p->next;
q=p;
p=p->next;
free(q);
}
}
return OK;
}
2.20同2.19題條件,試寫一高效的算法,刪除表中所有值相同的多余元素(使得操作后的線性表中所有 元素的值均不相同),同時釋放被刪結(jié)點空間,并分析你的算法的時間復(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){
47、
prev->next=p->next;
q=p;
p=p->next;
free(q);
}
an,…,ai。
解:
//順序表的逆置
Status ListOppose_Sq(SqList &L)
{
int i;
ElemType x;
for(i=0;i 48、s ListOppose_L(LinkList &L)
{
LinkList p,q;
p=L;
p=p->next;
L->next=NULL;
while(p){
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
return OK;
}
A,B為線性表
單鏈表的長度
2.23設(shè)線性表A二d,a2,…,am,B二b^,b2/ ,bn,試寫一個按下列規(guī)則合并
c的算法,即使得
C = a1,b, ,am,bm,bm1, ,bn 當 m"時;
C =印,^, ,an,bn,an 1, ,am 當 m n時。
線性 49、表A,B和C均以單鏈表作存儲結(jié)構(gòu),且 C表利用A表和B表中的結(jié)點空間構(gòu)成。注意:
值m和n均未顯式存儲。
解:
//將合并后的結(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 50、)qb_>next=pb;
pb=B;
free(pb);
return OK;
}
A表和B
C,并要求
2.24假設(shè)有兩個按元素值遞增有序排列的線性表 A和B,均以單鏈表作存儲結(jié)構(gòu),請編寫算法將
表歸并成一個按元素值遞減有序(即非遞增有序,允許表中含有值相同的元素)排列的線性表 利用原表(即A表和B表)的結(jié)點空間構(gòu)造 C表。
解:
//將合并逆置后的結(jié)果放在 C表中,并刪除B表
Status ListMergeOppose_L(LinkList &A,LinkList &B, LinkList &C)
{
LinkList pa,pb,qa,qb;
pa=A;
51、
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->data 52、le(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è)以兩個元素依值遞增有序排列的線性表 A和B分別表示兩個集合(即同一表中的元素值各不相
同),現(xiàn)要求另辟空間構(gòu)成一個線性表 C,其元素為A和B中元素的交集,且表 C中的元素有依值遞增有序
排列。試對順序表編寫求 C的算法。
解:
//將A B求交 53、后的結(jié)果放在 C表中
Status ListCross_Sq(SqList &A,SqList & B,SqList &C)
{
int i=O,j=O,k=O;
while(i 54、結(jié)果放在 C表中,并刪除B表
Status 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->data 55、ta){ pt=pb; pb=pb->next; qb->next=pb; free(pt);
}
else{
qa=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.27對2.25題的條件作以下兩點修改,對順序表重新編寫求得表 C的算法。
C中的元素值各不相同;
(1) 假設(shè)在同 56、一表(A或B)中可能存在值相同的元素,但要求新生成的表
(2) 利用A表空間存放表Co
解:
⑴
// A、B求交,然后刪除相同元素,將結(jié)果放在 C表中
Status ListCrossDelSame_Sq(SqList &A,SqList & B,SqList &C)
{
int i=O,j=O,k=O;
while(i 57、q(C,k,A.elem[i]);
k++;
}
else
if(C.elem[C.length-1]!=A.elem[i]){ ListInsert_Sq(C,k,A.elem[i]); k++;
}
i++;
}
}
return OK;
}
(2)
// A、B求交,然后刪除相同元素,將結(jié)果放在 A表中
Status ListCrossDelSame_Sq(SqList &A,SqList &B)
{
int i=0,j=0,k=0;
while(i 58、;
else
if(A.elem[i]>B.elem[j]) j++;
else{
if(k==0){
A.elem[k]=A.elem[i];
k++;
}
else
if(A.elem[k]!=A.elem[i]){
A.elem[k]=A.elem[i];
k++;
}
i++;
}
}
A」ength=k;
return OK;
}
2.28對2.25題的條件作以下兩點修改,對單鏈表重新編寫求得表 C的算法。
(1) 假設(shè)在同一表(A或B)中可能存在值相同的元素,但要求新生成的表 C中的元素值各不相同;
(2) 利用原表(A表或B表)中的結(jié)點構(gòu) 59、成表 C,并釋放A表中的無用結(jié)點空間。
解:
⑴
// A、B求交,結(jié)果放在 C表中,并刪除相同元素
Status ListCrossDelSame_L(LinkList &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->data 60、a->next=pa;
free(pt);
}
else
if(pa->data>pb->data){
pt=pb;
pb=pb->next;
qb->next=pb;
free(pt);
}
else{
if(pa->data==qa->data){
pt=pa;
pa=pa->next;
qa->next=pa;
free(pt);
}
else{
qa=pa;
pa=pa_>next;
}
}
}
while(pa){
pt=pa;
pa=pa->next;
qa_>next=pa;
free(pt);
}
while(pb){
61、
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=pa->next;
pb=pb->next;
while(pa&&pb){
if(pa->d 62、ata 63、->next=pa;
free(pt);
}
while(pb){
pt=pb;
pb=pb->next;
qb->next=pb;
free(pt);
}
pb=B;
free(pb);
return OK;
B表中出現(xiàn)又在 題中沒
}
2.29已知A, B和C為三個遞增有序的線性表,現(xiàn)要求對 A表作如下操作:刪去那些既在
C表中出現(xiàn)的元素。試對順序表編寫實現(xiàn)上述操作的算法,并分析你的算法的時間復(fù)雜度(注意: 有特別指明同一表中的元素值各不相同) 。
解:
//在A中刪除既在B中出現(xiàn)又在C中出現(xiàn)的元素,結(jié)果放在 D中
Status ListUnion_Sq 64、(SqList & D,SqList &A,SqList & B,SqList &C)
{
SqList Temp;
InitList_S q( Temp);
ListCross_L(B,C,Temp);
ListMinus_L(A,Temp,D);
}
2.30要求同2.29題。試對單鏈表編寫算法,請釋放 A表中的無用結(jié)點空間
解:
//在A中刪除既在B中出現(xiàn)又在C中出現(xiàn)的元素,并釋放 B、C
Status ListUnion_L(LinkList &A,L inkList &B,L inkList &C)
{
ListCross_L(B,C);
ListM 65、inus_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=pb; //保存pb的前驅(qū)指針
pa=pa_>next;
pb=pb_>next;
while(pa&&pb){
if(pb->data 66、>data>pa->data){
qa=pa;
pa=pa->next;
}
else{
pt=pa;
pa=pa->next;
qa->next=pa;
free(pt);
}
}
while(pb){
pt=pb;
pb=pb->next;
free(pt);
qb->next=pb;
}
pb=B;
free(pb);
return OK;
}
2.31假設(shè)某個單向循環(huán)鏈表的長度大于 1,且表中既無頭結(jié)點也無頭指針。已知 s為指向鏈表中某個結(jié)點
的指針,試編寫算法在鏈表中刪除指針 s所指結(jié)點的前驅(qū)結(jié)點。
解:
//在單循環(huán)鏈表S中刪除S的前驅(qū)結(jié)點
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;
}
2.32已知有
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點美食推薦
- XX國有企業(yè)黨委書記個人述責述廉報告及2025年重點工作計劃
- 世界濕地日濕地的含義及價值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點節(jié)后常見的八大危險
- 廈門城市旅游介紹廈門景點介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個個會應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案