【正文】
} prelLink = s。 //指針 p 指向待比較的結(jié)點(diǎn) , pre 是 p 的前驅(qū)指針 while ( p != NULL amp。 //解決約瑟夫問(wèn)題,打印勝利者編號(hào) } 312 試設(shè)計(jì)一個(gè)算法,改造一個(gè)帶表頭結(jié)點(diǎn)的雙向鏈表,所有結(jié)點(diǎn) 的原有次序保持在各個(gè)結(jié)點(diǎn)的 rLink域中,并利用 lLink 域把所有結(jié)點(diǎn)按照其值從小到大的順序連接起來(lái)。 for ( int i = 1。 } void main ( ) { DblListint dlist。 temp = prlink。 j++ ) p = prLink。 for ( int i = 0。 prLink = current。 currentfreq pfreq ) p = plLink。 currentrLinklLink = currentlLink。 pdata != x ) p = prLink。 } } template class Type void DblListType :: Locate ( Type amp。 Type value。 【解答】 include //雙向循環(huán)鏈表結(jié)點(diǎn)的構(gòu)造函數(shù) DblNode (Type value, DblNodeType *left, DblNodeType *right ) : data ( value ), freq ( 0 ), lLink ( left ), rLink ( right ) { } DblNode (Type value ) : data ( value ), freq ( 0 ), lLink ( NULL ), rLink ( NULL ) { } 第 3 章 鏈表 23 template class Type DblListType :: DblList ( Type uniqueVal ) { first = new DblNodeType( uniqueVal )。 } 310 試設(shè)計(jì)一個(gè)實(shí)現(xiàn)下述要求的 Locate 運(yùn)算的函數(shù)。 } 這樣可得多項(xiàng)式的解法: double Polynomal :: Value ( int i, double x ) { //私有函數(shù):遞歸求子多項(xiàng)式的值 if ( i == n1 ) return coef[n1]。試編寫(xiě)一個(gè)遞歸函數(shù),計(jì)算這樣的多項(xiàng)式的值。 對(duì)于稀疏多項(xiàng)式的情形請(qǐng)自行考慮。 return *this。 pb = pblink。 //fc 是每固定一個(gè) ai 時(shí) ai 結(jié)點(diǎn)指針 , pc 是存放指針 while ( pa != NULL ) { //每一個(gè) ai 與 b 中所有項(xiàng)分別相乘 pb = link。 Polynomal :: operator * ( Polynomalamp。但若 a 和 b 是稠密的 , 即其很少有系數(shù)為零的項(xiàng) , 那么試說(shuō)明該乘積算法的時(shí)間代價(jià)為 O(nm)。 else cout Value ( pc, 0, x ) endl。 pow(x, y)是求 x 的 y 次冪的函數(shù) , 它的原型在“ ”中 if ( plink == first ) return pcoef。 if ( pc == first ) cout 0 endl。 }。 )。 //插入新結(jié)點(diǎn) void Remove ( )。 } //將當(dāng)前指針置于頭結(jié)點(diǎn) Boolean First ( )。 value )。 //構(gòu)造函數(shù) ~Polynomal ( )。 //系數(shù)與指數(shù) Term *link。作為私有數(shù)據(jù)成員,在鏈表的類定義中封裝了 3 個(gè)鏈接指針: first、 last 和 current,分別指示鏈表的表頭結(jié)點(diǎn)、鏈尾結(jié)點(diǎn)和最后處理到的結(jié)點(diǎn)。 else i 。 } int string1 :: Find ( string1amp。 第 3 章 鏈表 19 q = qlink。 //this 串的串尾 k = 0。 for ( int k = 0。 string1 :: operator += ( string1amp。\039。 )。 i++ ) { //取長(zhǎng)度為 len 的子串 p = plink。 ) p = plink。 pos + len 1 curLen ) { ListNodechar *q, *p = chList。 len = 0 amp。 } string1amp。 k++。 int k = 0。 } charamp。 i++ ) if ( pdata != qdata ) return 0。 ob ) { //判兩串相等 if ( curLen != ) return 0。 ) { p = plink。 ListNodechar *q = chList = new ListNodechar ( pdata )。 curLen++。 while ( *obstr != 39。 )。 private: ListNodechar*chList。 friend istreamamp。 //求子串在串中位置 (模式匹配 ) friend ostreamamp。 operator += ( string1amp。 operator [ ] ( int i )。 ob )。 //從字符數(shù)組建立字符串 ~string1 ( )。要求每個(gè)字符串結(jié)點(diǎn)中只存放一個(gè)字符。 endl。 //鏈指針 prlink 逆轉(zhuǎn)指向 p p = pr。 while ( pr != NULL amp。 endl。 p, ListNodeType *amp。 i++。 i k ) { //右移 k 個(gè)結(jié)點(diǎn) q = plink。 p = first。 } int i。amp。如果 p 移出鏈表,則將 p 置為 0,并讓 pr 停留在鏈表最左邊的結(jié)點(diǎn)上。此時(shí),指針 p 所指結(jié)點(diǎn)左側(cè)的所有結(jié)點(diǎn)的鏈接方向都已逆轉(zhuǎn)。 //插入 head 鏈前端 } first = headlink。 //創(chuàng)建表頭結(jié)點(diǎn) , 其 link 域默認(rèn)為 NULL while ( first != NULL ) { p = first。 first = p。 【解答 1】 templateclass Type void ListType :: Inverse ( ) { if ( first == NULL ) return。 firstlink = q。 //鏈入結(jié)果鏈的 鏈頭 } 第 3 章 鏈表 15 p = ( pa != NULL ) ? pa : pb。 } //從 pa 鏈中摘下 else { q = pb。 //結(jié)果鏈表初始化 while ( pa != NULL amp。 ListNodeType *pa, *pb, *q, *p。 else cout endl。 } } template class Type void ListType :: Browse ( ) { //瀏覽并輸出鏈表的內(nèi)容 cout\nThe List is : \n。 } //尋找新結(jié)點(diǎn)插入位置 qlink = s。 while ( p != NULL amp。 cin value。 template class Type ListType :: List ( const Type finishied ) { //創(chuàng)建一個(gè)帶表頭結(jié)點(diǎn)的有序單鏈表 , finished 是停止建表輸入標(biāo)志 , 是所有輸入值中不可能出現(xiàn)的數(shù)值。 }。 //建立鏈表 void Browse ( )。 //構(gòu)造函數(shù) private: Type data。 template class Type class ListNode { friend class ListType。 //指針 p 進(jìn)到鏈表下一個(gè)結(jié)點(diǎn) } 33 設(shè) ha和 hb分別是兩個(gè)帶表頭結(jié)點(diǎn)的非遞減有序單鏈表的表頭指針 , 試設(shè)計(jì)一個(gè)算法 , 將這兩個(gè)有序鏈表合并成一個(gè)非遞增有序的單鏈表。 plink != NULL ) //循環(huán)檢測(cè)鏈表 if ( pdata == plinkdata ) { //若相鄰結(jié)點(diǎn)所包含數(shù)據(jù)的值相等 temp = pfirst。 //建立表頭結(jié)點(diǎn) create ( A, n, 0, firstlink )。 p ) { //私有函數(shù):遞歸調(diào)用建立單鏈表 if ( i == n ) p = NULL。 //指針 p 總指向鏈中最后一個(gè)結(jié)點(diǎn) } plink = NULL。 //創(chuàng)建表頭結(jié)點(diǎn) for ( int i = 0。 //找到一個(gè) , 計(jì)數(shù)器加 1 p = plink。 } (3) 實(shí)現(xiàn)統(tǒng)計(jì)單鏈表中具有給定值 x 的所有元素的函數(shù)如下: template class Type int List Type :: Count ( Typeamp。 //空表 , 返回指針 NULL ListNode Type * pmax = firstlink, p = firstlinklink。 k i ) { p = plink。 //位置 i 在表中不存在 ListNode Type * p = first。 (3) 統(tǒng)計(jì)函數(shù) number:統(tǒng)計(jì)單鏈表中具有給定值 x 的所有元素。 32 針對(duì)帶表頭結(jié)點(diǎn)的單鏈