日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【最详细】数据结构(C语言版 第2版)第四章课后习题答案 严蔚敏 等 编著

發(fā)布時(shí)間:2024/2/28 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【最详细】数据结构(C语言版 第2版)第四章课后习题答案 严蔚敏 等 编著 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

所有章節(jié)答案合集——>傳送門


第 4 章串、數(shù)組和廣義表

1.選擇題

( 1)串是一種特殊的線性表,其特殊性體現(xiàn)在() 。
A .可以順序存儲 B .數(shù)據(jù)元素是一個(gè)字符
C.可以鏈?zhǔn)酱鎯?D .數(shù)據(jù)元素可以是多個(gè)字符若
答案: B

( 2)串下面關(guān)于串的的敘述中, ()是不正確的?
A.串是字符的有限序列 B.空串是由空格構(gòu)成的串
C.模式匹配是串的一種重要運(yùn)算 D .串既可以采用順序存儲,也可以采用鏈?zhǔn)酱鎯?br /> 答案: B
解釋:空格常常是串的字符集合中的一個(gè)元素,有一個(gè)或多個(gè)空格組成的串成為空格
串,零個(gè)字符的串成為空串,其長度為零。

( 3)串“ ababaaababaa ”的 next 數(shù)組為() 。
A . 012345678999 B. 012121111212 C. 011234223456 D. 0123012322345
答案: C

( 4)串“ ababaabab ”的 nextval 為()。
A . 010104101 B. 010102101C . 010100011 D . 010101011
答案: A
( 5)串的長度是指() 。
A .串中所含不同字母的個(gè)數(shù) B .串中所含字符的個(gè)數(shù)
C.串中所含不同字符的個(gè)數(shù) D .串中所含非空格字符的個(gè)數(shù)
答案: B
解釋:串中字符的數(shù)目稱為串的長度。

( 6)假設(shè)以行序?yàn)橹餍虼鎯ΧS數(shù)組 A=array[1…100,1…100] ,設(shè)每個(gè)數(shù)據(jù)元素占 2 個(gè)存
儲單元,基地址為 10,則 LOC[5,5]= ()。
A. 808 B. 818 C. 1010 D . 1020
答案: B
解釋:以行序?yàn)橹?#xff0c;則 LOC[5,5]=[ (5-1 ) *100+ ( 5-1 ) ]*2+10=818 。

( 7)設(shè)有數(shù)組 A[i,j] ,數(shù)組的每個(gè)元素長度為 3 字節(jié), i 的值為 1 到 8,j 的值為 1 到 10,數(shù)組從內(nèi)存首地址 BA 開始順序存放, 當(dāng)用以列為主存放時(shí), 元素 A[5,8] 的存儲首地址為 ()。
A. BA+141
B . BA+180
C. BA+222
D. BA+225
答案: B
解釋:以列序?yàn)橹?#xff0c;則 LOC[5,8]=[ ( 8-1 ) *8+ ( 5-1 ) ]*3+BA=BA+180 。

( 8)設(shè)有一個(gè) 10 階的對稱矩陣 A ,采用壓縮存儲方式,以行序?yàn)橹鞔鎯?#xff0c; a11 為第一元
素,其存儲地址為 1,每個(gè)元素占一個(gè)地址空間,則 a85 的地址為() 。
A. 13
B. 32
C. 33
D. 40
答案: C

( 9)若對 n 階對稱矩陣 A 以行序?yàn)橹餍蚍绞綄⑵湎氯切蔚脑?(包括主對角線上所有元素 ) 依次存放于一維數(shù)組 B[1…(n(n+1))/2] 中,則在 B 中確定 aij( i<j )的位置 k 的關(guān)系為 ()。
A. i*(i-1)/2+j
B. j*(j-1)/2+i
C. i*(i+1)/2+j
D. j*(j+1)/2+i
答案: B

( 10)二維數(shù)組 A 的每個(gè)元素是由 10 個(gè)字符組成的串,其行下標(biāo) i=0,1, , ,8, 列下標(biāo)j=1,2, , ,10 。若 A 按行先存儲,元素 A[8,5] 的起始地址與當(dāng) A 按列先存儲時(shí)的元素()的起始地址相同。設(shè)每個(gè)字符占一個(gè)字節(jié)。
A. A[8,5]
B. A[3,10]
C. A[5,8]
D. A[0,9]
答案: B
解釋:設(shè)數(shù)組從內(nèi)存首地址 M 開始順序存放,若數(shù)組按行先存儲,元素 A[8,5] 的起始地址為: M+[( 8-0 )*10+ (5-1)]*1=M+84 ;若數(shù)組按列先存儲,易計(jì)算出元素 A[3,10] 的起始地址為: M+[ (10-1) *9+ ( 3-0 ) ]*1=M+84 。故選 B。

( 11)設(shè)二維數(shù)組 A[1… m ,1… n] (即 m 行 n 列)按行存儲在數(shù)組 B[1… m*n] 中,則二維
數(shù)組元素 A[i,j] 在一維數(shù)組 B 中的下標(biāo)為() 。
A . (i-1)n+j B. (i-1)n+j-1 C. i(j-1) D . jm+i-1
答案: A
解釋:特殊值法。取 i=j=1 ,易知 A[1,1] 的的下標(biāo)為 1,四個(gè)選項(xiàng)中僅有 A 選項(xiàng)能確定的值為 1,故選 A 。

( 12)數(shù)組 A[0…4,-1…-3,5…7] 中含有元素的個(gè)數(shù)() 。 A. 55 B . 45 C. 36 D. 16
答案: B
解釋:共有 533=45 個(gè)元素。

( 13)廣義表 A=(a,b,(c,d),(e,(f,g))) ,則 Head(Tail(Head(Tail(Tail(A))))) 的值為() 。 A. (g) B . (d) C. c D. d
答案: D
解釋: Tail(A)=(b,(c,d),(e,(f,g))) ; Tail(Tail(A))=( (c,d),(e,(f,g))) ; Head(Tail(Tail(A)))=
(c,d) ; Tail(Head(Tail(Tail(A))))=(d) ; Head(Tail(Head(Tail(Tail(A)))))=d 。

( 14)廣義表 ((a,b,c,d)) 的表頭是() ,表尾是() 。
A. a B . ( )C . (a,b,c,d)D . (b,c,d)
答案: C、 B
解釋:表頭為非空廣義表的第一個(gè)元素,可以是一個(gè)單原子,也可以是一個(gè)子表,
((a,b,c,d)) 的表頭為一個(gè)子表 (a,b,c,d) ;表尾為除去表頭之外,由其余元素構(gòu)成的表,表為一定
是個(gè)廣義表, ((a,b,c,d)) 的表尾為空表 ( ) 。

( 15)設(shè)廣義表 L=((a,b,c)) ,則 L 的長度和深度分別為() 。 A. 1 和 1 B. 1 和 3 C. 1 和 2 D. 2 和 3
答案: C
解釋:廣義表的深度是指廣義表中展開后所含括號的層數(shù),廣義表的長度是指廣義表
中所含元素的個(gè)數(shù)。根據(jù)定義易知 L 的長度為 1,深度為 2。


2.應(yīng)用題

( 1)已知模式串 t=‘ abcaabbabcab ’寫出用 KMP法求得的每個(gè)字符對應(yīng)的 next 和 nextval
函數(shù)值。
答案:
模式串 t 的 next 和 nextval 值如下:
j 1 2 3 4 5 6 7 8 9 10 11 12
t 串 a b c a a b b a b c a b
next[j] 0 1 1 1 2 2 3 1 2 3 4 5
nextval[j] 0 1 1 0 2 1 3 0 1 1 0 5

( 2)設(shè)目標(biāo)為 t= “ abcaabbabcabaacbacba ” , 模式為 p=“ abcabaa ”
①計(jì)算模式 p 的 naxtval 函數(shù)值;
②不寫出算法 , 只畫出利用 KMP算法進(jìn)行模式匹配時(shí)每一趟的匹配過程。
答案:
① p 的 nextval 函數(shù)值為 0110132 。( p 的 next 函數(shù)值為 0111232 )。
②利用 KMP(改進(jìn)的 nextval) 算法,每趟匹配過程如下:
第一趟匹配: abcaabbabcabaacbacba
abcab(i=5,j=5)
第二趟匹配: abcaabbabcabaacbacba
abc(i=7,j=3)
第三趟匹配: abcaabbabcabaacbacba
a(i=7,j=1)
第四趟匹配: abcaabbabcabaac bacba
( 成功 ) abcabaa(i=15,j=8)

( 3)數(shù)組 A 中,每個(gè)元素 A[i,j] 的長度均為 32 個(gè)二進(jìn)位 , 行下標(biāo)從 -1 到 9,列下標(biāo)從 1 到 11 ,從首地址 S 開始連續(xù)存放主存儲器中,主存儲器字長為 16 位。求:
①存放該數(shù)組所需多少單元?
②存放數(shù)組第 4 列所有元素至少需多少單元?
③數(shù)組按行存放時(shí),元素 A[7,4] 的起始地址是多少?
④數(shù)組按列存放時(shí),元素 A[4,7] 的起始地址是多少?
答案:
每個(gè)元素 32 個(gè)二進(jìn)制位,主存字長 16 位,故每個(gè)元素占 2 個(gè)字長,行下標(biāo)可平移至 1 到 11 。( 1) 242 ( 2) 22 ( 3) s+182 ( 4) s+142

(4) 請將香蕉 banana 用工具 H( ) — Head( ) , T( ) — Tail( ) 從 L 中取出。L=(apple,(orange,(strawberry,(banana)),peach),pear)
答案: H( H( T( H( T( H( T( L)))))))


3.算法設(shè)計(jì)題

( 1)寫一個(gè)算法統(tǒng)計(jì)在輸入字符串中各個(gè)不同字符出現(xiàn)的頻度并將結(jié)果存入文件 (字符串中的合法字符為 A-Z 這 26 個(gè)字母和 0-9 這 10 個(gè)數(shù)字)。
[ 題目分析 ] 由于字母共 26 個(gè),加上數(shù)字符號 10 個(gè)共 36 個(gè),所以設(shè)一長 36 的整型數(shù)組,
前 10 個(gè)分量存放數(shù)字字符出現(xiàn)的次數(shù), 余下存放字母出現(xiàn)的次數(shù)。 從字符串中讀出數(shù)字字符
時(shí),字符的 ASCII 代碼值減去數(shù)字字符 ‘0’的 ASCII 代碼值,得出其數(shù)值 (0…9) ,字母的
ASCII 代碼值減去字符‘ A’的 ASCII 代碼值加上 10 ,存入其數(shù)組的對應(yīng)下標(biāo)分量中。遇其它
符號不作處理,直至輸入字符串結(jié)束。
[ 算法描述 ]

void Count () // 統(tǒng)計(jì)輸入字符串中數(shù)字字符和字母字符的個(gè)數(shù)。int i , num[36]char ch ;for ( i = 0; i<36 ; i++ ) num[i] =0; // 初始化while (( ch = getchar ()) != ‘ #’) // ‘ #’表示輸入字符串結(jié)束。if (‘ 0<=ch<=9’){ i=ch - 48;num[i]++ ;} // 數(shù)字字符else if (‘ A’ <=ch<= ‘ Z’){ i=ch-65+10;num[i]++ ;} // 字母字符for ( i=0 ; i<10 ; i++// 輸出數(shù)字字符的個(gè)數(shù)cout<< “數(shù)字” <<i<< “的個(gè)數(shù) =<<num[i]<<endl; for ( i = 10 ; i<36 ; i++// 求出字母字符的個(gè)數(shù)cout<< “字母字符” <<i+55<< “的個(gè)數(shù) =<<num[i]<<endl;

( 2)寫一個(gè)遞歸算法來實(shí)現(xiàn)字符串逆序存儲,要求不另設(shè)串存儲空間。
[ 題目分析 ] 實(shí)現(xiàn)字符串的逆置并不難,但本題“要求不另設(shè)串存儲空間”來實(shí)現(xiàn)字符串
逆序存儲,即第一個(gè)輸入的字符最后存儲,最后輸入的字符先存儲,使用遞歸可容易做到。
[ 算法描述 ]

void InvertStore( char A[]) // 字符串逆序存儲的遞歸算法。 { char ch; static int i = 0;// 需要使用靜態(tài)變量cin>>ch; if (ch!= '.') // 規(guī)定 '.' 是字符串輸入結(jié)束標(biāo)志{InvertStore(A); A[i++] = ch;// 字符串逆序存儲} A[i] = '\0'; // 字符串結(jié)尾標(biāo)記 }

( 3)編寫算法,實(shí)現(xiàn)下面函數(shù)的功能。函數(shù) void insert(chars,chart,int pos) 將
字符串 t 插入到字符串 s 中,插入位置為 pos 。假設(shè)分配給字符串 s 的空間足夠讓字符串 t插入。(說明:不得使用任何庫函數(shù))
[ 題目分析 ] 本題是字符串的插入問題,要求在字符串 s 的 pos 位置,插入字符串 t 。首
先應(yīng)查找字符串 s 的 pos 位置,將第 pos 個(gè)字符到字符串 s 尾的子串向后移動字符串 t 的長
度,然后將字符串 t 復(fù)制到字符串 s 的第 pos 位置后。
對插入位置 pos 要驗(yàn)證其合法性,小于 1 或大于串 s 的長度均為非法,因題目假設(shè)給字符串 s 的空間足夠大,故對插入不必判溢出。
[ 算法描述 ]

void insert(char *s,char *t,int pos) // 將字符串 t 插入字符串 s 的第 pos 個(gè)位置。 {int i=1,x=0; char *p=s,*q=t; //p , q 分別為字符串 s 和 t 的工作指針if(pos<1) {cout<< “pos 參數(shù)位置非法” <<endl;exit(0);} while(*p!=0&&i<pos) {p++;i++;} // 查 pos 位置// 若 pos 小于串 s 長度,則查到 pos 位置時(shí), i=pos 。if(*p == '/0') {cout<<pos<<" 位置大于字符串 s 的長度 ";exit(0);} else // 查找字符串的尾while(*p!= '/0') {p++; i++;} // 查到尾時(shí), i 為字符 ‘ \0 ’的下標(biāo), p 也指向 ‘ \0 ’。while(*q!= '\0') {q++; x++; } // 查找字符串 t 的長度 x,循環(huán)結(jié)束時(shí) q 指向 '\0' 。for(j=i;j>=pos ;j--){*(p+x)=*p; p--;}// 串 s 的 pos 后的子串右移,空出串 t 的位置。q--; // 指針 q 回退到串 t 的最后一個(gè)字符for(j=1;j<=x;j++) *p--=*q--; // 將 t 串插入到 s 的 pos 位置上 }

[ 算法討論 ] 串 s 的結(jié)束標(biāo)記 (’\0’) 也后移了,而串 t 的結(jié)尾標(biāo)記不應(yīng)插入到 s 中。
( 4)已知字符串 S1 中存放一段英文,寫出算法 format(s1,s2,s3,n), 將其按給定的長
度 n 格式化成兩端對齊的字符串 S2, 其多余的字符送 S3。 [ 題目分析 ] 本題要求字符串 s1 拆分成字符串 s2 和字符串 s3,要求字符串 s2“按給定長
度 n 格式化成兩端對齊的字符串” ,即長度為 n 且首尾字符不得為空格字符。 算法從左到右掃
描字符串 s1,找到第一個(gè)非空格字符,計(jì)數(shù)到 n,第 n 個(gè)拷入字符串 s2 的字符不得為空格,
然后將余下字符復(fù)制到字符串 s3 中。
[ 算法描述 ]

void format (char *s1,*s2,*s3) // 將字符串 s1 拆分成字符串 s2 和字符串 s3 ,要求字符串 s2 是長 n 且兩端對齊 {char *p=s1, *q=s2; int i=0; while(*p!= '\0' && *p== ' ') p++;// 濾掉 s1 左端空格if(*p== '\0') {cout<<" 字符串 s1 為空串或空格串 "<<endl;exit(0); } while( *p!='\0' && i<n) {*q=*p; q++; p++; i++;} // 字符串 s1 向字符串 s2 中復(fù)制if(*p =='\0') {cout<<" 字符串 s1 沒有 "<<n<<" 個(gè)有效字符 "<<endl; exit(0);} if(*(--q)==' ' ) // 若最后一個(gè)字符為空格,則需向后找到第一個(gè)非空格字符{p-- ; //p 指針也后退while(*p==' '&&*p!='\0') p++;// 往后查找一個(gè)非空格字符作串 s2 的尾字符if(*p=='\0') {cout<<"s1 串沒有 "<<n<<" 個(gè)兩端對齊的字符串 "<<endl; exit(0);} *q=*p; // 字符串 s2 最后一個(gè)非空字符*(++q)='\0'; // 置 s2 字符串結(jié)束標(biāo)記} *q=s3;p++; // 將 s1 串其余部分送字符串 s3 。while (*p!= '\0') {*q=*p; q++; p++;} *q='\0'; // 置串 s3 結(jié)束標(biāo)記 }

( 5)設(shè)二維數(shù)組 a[1…m, 1…n] 含有 m*n 個(gè)整數(shù)。
①寫一個(gè)算法判斷 a 中所有元素是否互不相同 ?輸出相關(guān)信息 (yes/no) ;
②試分析算法的時(shí)間復(fù)雜度。
①[ 題目分析 ] 判斷二維數(shù)組中元素是否互不相同, 只有逐個(gè)比較 , 找到一對相等的元素, 就
可結(jié)論為不是互不相同。如何達(dá)到每個(gè)元素同其它元素比較一次且只一次?在當(dāng)前行,每個(gè)
元素要同本行后面的元素比較一次(下面第一個(gè)循環(huán)控制變量 p 的 for 循環(huán)),然后同第 i+1
行及以后各行元素比較一次,這就是循環(huán)控制變量 k 和 p 的二層 for 循環(huán)。
[ 算法描述 ]

int JudgEqual(ing a[m][n],int m,n) // 判斷二維數(shù)組中所有元素是否互不相同,如是,返回 1;否則,返回 0。 {for(i=0;i<m;i++) for(j=0;j<n-1;j++) {for(p=j+1;p<n;p++) // 和同行其它元素比較if(a[i][j]==a[i][p]) {cout<< “no”; return(0); }// 只要有一個(gè)相同的,就結(jié)論不是互不相同for(k=i+1;k<m;k++) // 和第 i+1 行及以后元素比較for(p=0;p<n;p++) if(a[i][j]==a[k][p]) {cout<< “no”; return(0); } }// for(j=0;j<n-1;j++) cout<< “ yes ”; return(1); // 元素互不相同 }// 算法 JudgEqual 結(jié)束

②二維數(shù)組中的每一個(gè)元素同其它元素都比較一次,數(shù)組中共 mn 個(gè)元素,第 1 個(gè)元素同
其它 mn-1 個(gè)元素比較,第 2 個(gè)元素同其它 mn-2 個(gè)元素比較, , ,第 mn-1 個(gè)元素同最
后 一 個(gè) 元 素 (mn) 比 較 一 次 , 所 以 在 元 素 互 不 相 等 時(shí) 總 的 比 較 次 數(shù) 為 (mn-1)+(mn-2)+ ,
+2+1=( mn)(mn-1)/2 。在有相同元素時(shí) , 可能第一次比較就相同 , 也可能最后一次比較時(shí)相
同 , 設(shè)在 (mn-1) 個(gè)位置上均可能相同 , 這時(shí)的平均比較次數(shù)約為( mn)(mn-1)/4 ,總的時(shí)間
復(fù)雜度是 O(n 4 ) 。
(6) 設(shè)任意 n 個(gè)整數(shù)存放于數(shù)組 A(1:n) 中,試編寫算法,將所有正數(shù)排在所有負(fù)數(shù)前面
(要求算法復(fù)雜度為 0(n) )。 [ 題目分析 ] 本題屬于排序問題,只是排出正負(fù),不排出大小??稍跀?shù)組首尾設(shè)兩個(gè)指針
i 和 j ,i 自小至大搜索到負(fù)數(shù)停止, j 自大至小搜索到正數(shù)停止。 然后 i 和 j 所指數(shù)據(jù)交換,
繼續(xù)以上過程,直到 i=j 為止。
[ 算法描述 ]

void Arrange(int A[],int n) //n 個(gè)整數(shù)存于數(shù)組 A 中,本算法將數(shù)組中所有正數(shù)排在所有負(fù)數(shù)的前面 {int i=0,j=n-1,x; // 用類 C 編寫,數(shù)組下標(biāo)從 0 開始while(i<j) {while(i<j && A[i]>0) i++; while(i<j && A[j]<0) j--; if(i<j) {x=A[i]; A[i++]=A[j]; A[j--]=x; }// 交換 A[i] 與 A[j] }// while(i<j) }// 算法 Arrange 結(jié)束 .

[ 算法討論 ] 對數(shù)組中元素各比較一次,比較次數(shù)為 n。最佳情況 ( 已排好 , 正數(shù)在前 , 負(fù)數(shù)
在后 ) 不發(fā)生交換,最差情況 ( 負(fù)數(shù)均在正數(shù)前面 ) 發(fā)生 n/2 次交換。用類 c 編寫,數(shù)組界偶是
0…n-1 ??臻g復(fù)雜度為 O(1)


排版和格式真的很費(fèi)勁啊啊啊啊, 求贊~

總結(jié)

以上是生活随笔為你收集整理的【最详细】数据结构(C语言版 第2版)第四章课后习题答案 严蔚敏 等 编著的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。