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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

所有章節答案合集——>傳送門


第 4 章串、數組和廣義表

1.選擇題

( 1)串是一種特殊的線性表,其特殊性體現在() 。
A .可以順序存儲 B .數據元素是一個字符
C.可以鏈式存儲 D .數據元素可以是多個字符若
答案: B

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

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

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

( 6)假設以行序為主序存儲二維數組 A=array[1…100,1…100] ,設每個數據元素占 2 個存
儲單元,基地址為 10,則 LOC[5,5]= ()。
A. 808 B. 818 C. 1010 D . 1020
答案: B
解釋:以行序為主,則 LOC[5,5]=[ (5-1 ) *100+ ( 5-1 ) ]*2+10=818 。

( 7)設有數組 A[i,j] ,數組的每個元素長度為 3 字節, i 的值為 1 到 8,j 的值為 1 到 10,數組從內存首地址 BA 開始順序存放, 當用以列為主存放時, 元素 A[5,8] 的存儲首地址為 ()。
A. BA+141
B . BA+180
C. BA+222
D. BA+225
答案: B
解釋:以列序為主,則 LOC[5,8]=[ ( 8-1 ) *8+ ( 5-1 ) ]*3+BA=BA+180 。

( 8)設有一個 10 階的對稱矩陣 A ,采用壓縮存儲方式,以行序為主存儲, a11 為第一元
素,其存儲地址為 1,每個元素占一個地址空間,則 a85 的地址為() 。
A. 13
B. 32
C. 33
D. 40
答案: C

( 9)若對 n 階對稱矩陣 A 以行序為主序方式將其下三角形的元素 (包括主對角線上所有元素 ) 依次存放于一維數組 B[1…(n(n+1))/2] 中,則在 B 中確定 aij( i<j )的位置 k 的關系為 ()。
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)二維數組 A 的每個元素是由 10 個字符組成的串,其行下標 i=0,1, , ,8, 列下標j=1,2, , ,10 。若 A 按行先存儲,元素 A[8,5] 的起始地址與當 A 按列先存儲時的元素()的起始地址相同。設每個字符占一個字節。
A. A[8,5]
B. A[3,10]
C. A[5,8]
D. A[0,9]
答案: B
解釋:設數組從內存首地址 M 開始順序存放,若數組按行先存儲,元素 A[8,5] 的起始地址為: M+[( 8-0 )*10+ (5-1)]*1=M+84 ;若數組按列先存儲,易計算出元素 A[3,10] 的起始地址為: M+[ (10-1) *9+ ( 3-0 ) ]*1=M+84 。故選 B。

( 11)設二維數組 A[1… m ,1… n] (即 m 行 n 列)按行存儲在數組 B[1… m*n] 中,則二維
數組元素 A[i,j] 在一維數組 B 中的下標為() 。
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] 的的下標為 1,四個選項中僅有 A 選項能確定的值為 1,故選 A 。

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

( 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
解釋:表頭為非空廣義表的第一個元素,可以是一個單原子,也可以是一個子表,
((a,b,c,d)) 的表頭為一個子表 (a,b,c,d) ;表尾為除去表頭之外,由其余元素構成的表,表為一定
是個廣義表, ((a,b,c,d)) 的表尾為空表 ( ) 。

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


2.應用題

( 1)已知模式串 t=‘ abcaabbabcab ’寫出用 KMP法求得的每個字符對應的 next 和 nextval
函數值。
答案:
模式串 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)設目標為 t= “ abcaabbabcabaacbacba ” , 模式為 p=“ abcabaa ”
①計算模式 p 的 naxtval 函數值;
②不寫出算法 , 只畫出利用 KMP算法進行模式匹配時每一趟的匹配過程。
答案:
① p 的 nextval 函數值為 0110132 。( p 的 next 函數值為 0111232 )。
②利用 KMP(改進的 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)數組 A 中,每個元素 A[i,j] 的長度均為 32 個二進位 , 行下標從 -1 到 9,列下標從 1 到 11 ,從首地址 S 開始連續存放主存儲器中,主存儲器字長為 16 位。求:
①存放該數組所需多少單元?
②存放數組第 4 列所有元素至少需多少單元?
③數組按行存放時,元素 A[7,4] 的起始地址是多少?
④數組按列存放時,元素 A[4,7] 的起始地址是多少?
答案:
每個元素 32 個二進制位,主存字長 16 位,故每個元素占 2 個字長,行下標可平移至 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.算法設計題

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

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

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

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

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

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

[ 算法討論 ] 串 s 的結束標記 (’\0’) 也后移了,而串 t 的結尾標記不應插入到 s 中。
( 4)已知字符串 S1 中存放一段英文,寫出算法 format(s1,s2,s3,n), 將其按給定的長
度 n 格式化成兩端對齊的字符串 S2, 其多余的字符送 S3。 [ 題目分析 ] 本題要求字符串 s1 拆分成字符串 s2 和字符串 s3,要求字符串 s2“按給定長
度 n 格式化成兩端對齊的字符串” ,即長度為 n 且首尾字符不得為空格字符。 算法從左到右掃
描字符串 s1,找到第一個非空格字符,計數到 n,第 n 個拷入字符串 s2 的字符不得為空格,
然后將余下字符復制到字符串 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 中復制if(*p =='\0') {cout<<" 字符串 s1 沒有 "<<n<<" 個有效字符 "<<endl; exit(0);} if(*(--q)==' ' ) // 若最后一個字符為空格,則需向后找到第一個非空格字符{p-- ; //p 指針也后退while(*p==' '&&*p!='\0') p++;// 往后查找一個非空格字符作串 s2 的尾字符if(*p=='\0') {cout<<"s1 串沒有 "<<n<<" 個兩端對齊的字符串 "<<endl; exit(0);} *q=*p; // 字符串 s2 最后一個非空字符*(++q)='\0'; // 置 s2 字符串結束標記} *q=s3;p++; // 將 s1 串其余部分送字符串 s3 。while (*p!= '\0') {*q=*p; q++; p++;} *q='\0'; // 置串 s3 結束標記 }

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

int JudgEqual(ing a[m][n],int m,n) // 判斷二維數組中所有元素是否互不相同,如是,返回 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); }// 只要有一個相同的,就結論不是互不相同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 結束

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

void Arrange(int A[],int n) //n 個整數存于數組 A 中,本算法將數組中所有正數排在所有負數的前面 {int i=0,j=n-1,x; // 用類 C 編寫,數組下標從 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 結束 .

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


排版和格式真的很費勁啊啊啊啊, 求贊~

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。