严蔚敏数据结构为主的笔记五

   /2005-05-08

闁诲孩顔栭崰鎺楀磻閹剧粯鈷戞い鎰剁悼椤e弶绻濋埀顒勫箥椤旀儳宕ュ┑顔筋殘椤︾硽闂備焦瀵х粙鎺楁儗椤斿墽鍗氶悗娑欋缚閳绘棃鏌涢妷銏℃珦婵炲吋宀搁弻銈夊级閸喗娈堕梺缁樼墱閸庛倗绮欐径鎰闁肩⒈鍓涢幊婵嬫煟閻樺弶澶勭€规洘锕㈤敐鐐碘偓锝庡亾缁憋綁鏌熸潏楣冩妞ゆ挾鎳撻妴鎺戭潩閾忣偆銆婂┑鐘亾闁告稑鐡ㄩ弲顒勬倶閻愭彃鈷旀俊灞傚姂閺岋繝宕奸銏犲箰缂備焦顨呴ˇ闈涚暦濮橆叏绱eù锝勮娴煎洭姊洪崨濠傜瑨婵☆偅绻堥獮鎰板醇閺囩喐娅栨繛杈剧秬濞咃綁宕″⿰鍫熷€甸柣銏犵仛閸も偓闂佹悶鍔嶇换鍕垝鐠囧弬鏃傗偓锝庡墰閿涳拷
547闂備礁婀遍。浠嬪磻閹剧粯鈷掗柛鏇楁櫅閻忣亪鏌eΔ鈧柊锝夊箠閹捐绀冩い蹇撴閻撴盯姊洪崗鍏肩凡闁哥噥鍋勯悾鐑芥晸閿燂拷1130缂傚倷绀侀ˇ顖滅矓閻㈢鍋撻崹顐g殤闁逞屽墲椤鍠婂澶婃辈闁逞屽墴閺屸剝寰勭€n亜顫庡┑鐐茬墛閸ㄥ灝鐣烽敓鐘茬鐟滃繒绮欓崶鈺冪<濠㈣泛锕︽晥闂佸憡菧閸婃牜缂撻挊澹╂棃宕担瑙勭槣闂佸湱鍘ч悺銊╁箰閸洖鐒垫い鎴炲缁佺増銇勯銏╁剱闁挎稒鍔欓獮瀣敍濠婂拋妲锋繝鐢靛仦閸ㄥ綊寮粙妫电儤绻濋崶銊ユ闁哄鐗滈崑鎺楀吹閺冨牊鐓忛柛鈩冩礉閸忓瞼绱掗鍏夊亾鐡掍浇顫夐幆鏂库槈閹烘垳澹曟繛杈剧悼閺咁偄危閸儲鐓曢柟鐑樻尰閸嬬娀鏌嶈閸忔稓娆㈠璺洪棷濡わ絽鍟幊姘扁偓骞垮劚閸熺娀宕戦幘瀛樺闁绘垶锚閳ь剛鍋熼埀顒冾潐閹爼宕曢鐐茬劦妞ゆ垼鍎婚崗灞俱亜閹惧瓨鍊愰柟顔肩埣瀹曢亶骞囬妸銉ゅ婵炶揪绲炬禍鑺ョ閿曗偓闇夐柛蹇曞帶閹兼悂鏌嶈閸忔稑霉閸ヮ剙纾奸柕濠忕畱椤曡鲸鎱ㄥΟ绋垮姉闁稿鎸婚幏鍛喆閸曨剛鏆氶梻浣哄帶瀵儼銇愰崘顏嗙处濡わ絽鍟崑鐘绘煕閳╁啫濮€闁稿鎸婚幏鍛存偪椤栨艾绠戦梻浣告惈閸婄ǹ煤閵忋倕鐒垫い鎴炲缁佹澘顭跨憴鍕磳鐎殿喚鏁婚、娑樜熷畡棰佸婵炶揪缍€椤鎮¢埀顒勬⒒閸屾艾鈧粙顢欐繝鍕潟闁割偅娲栫粻缁樸亜閹炬潙顥氶柛瀣尰閹峰懘宕烽婧惧亾婵犲洦鍊垫繛鎴濈枃缁€瀣煃瑜滈崗娑氱矆娴h桨鐒婇柟娈垮枓閸嬫挸鈽夌€圭姷顦伴梺閫炲苯鍘告繛鏉戞喘椤㈡﹢宕妷褌绗夊┑掳鍊撻悞锔捐姳濮樿埖鐓忛柛鈩冩礈椤︼妇鈧湱枪椤嘲鐣烽敐鍥︽勃闁稿本顨呮禍鎯归敐鍛暈闁告洟绠栭弻锝夋倷閸欏妫戦梺閫炲苯鍘搁柣鎺炵畵瀵剟宕掑锝嗙參濠殿喚鎳撳ú鐘诲磻閹惧瓨濯撮柛娑橈攻閸f悂鏌f惔銏犲枙閻犳劗鍠栭崺鈧い鎴炲椤﹂绱撳鍜佸剶闁硅櫕鐗犻幊鐘活敆閸愮偓钑夌紓鍌欑劍閸愬骞忛敓锟�28缂傚倷绶¢崑澶愵敋瑜旈、妤呮偄閾忓湱鐓嬮梺瑙勬儗閸ㄥ磭澹曢敓锟�
 

while( q  && q->data < max ) //找比max小的最后一个元素位置
{
q=q->next;

}
h=p->next;
p->next=q;//把断点链上
free(h);// 释放空间

}

 

--------------------------------------------------------------------------------

(答案及点评) 2.15 写一算法将单链表中值重复的结点删除,使所得的结果表中各结点值均不相同。

2.15 解:

本题 可以这样考虑,先取开始结点中的值,将它与其后的所有结点值一一比较,发现相同的就删除掉,然后再取第二结点的值,重复上述过程直到最后一个结点。

第二种算法是将单链表按值的大小排序,排好后的结点按相同的删除。

具体算法略。


--------------------------------------------------------------------------------

(答案及点评) 2.16 假设在长度大于1的单循环链表中,既无头结点也无头指针。s为指向链表中某个结点的指针,试编写算法删除结点*s的直接前趋结点。


2.16 解:
已知指向这个结点的指针是*s,那么要删除这个结点的直接前趋结点,就只要找到一个结点,它的指针域是指向*s的,把这个结点删除就可以了。

算法如下:
void DeleteNode( ListNode *s)
{
//删除单循环链表中指定结点的直接前趋结点
ListNode *p, *q;
p=s;
while( p->next->next!=s)
{
q=p; /
p=p->next;
}
q->next=s; //删除结点
free(p); //释放空间
}


--------------------------------------------------------------------------------

(答案及点评) 2.17 已知由单链表表示的线性表中,含有三类字符的数据元素(如:字母字符、数字字符和其它字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。


2.17  解:

要解决这样的问题,只要新建三个头结点,然后在原来的单链表中依次查询,找到一类字符结点时,就摘下此结点链接到相应头结点指明的新链表中就是了。

算法如下:
//设已建立三个带头结点的空循环链表A,B,C.
//以下是
void DivideList( LinkList L, LinkList A, LinkList B, LinkList C)
{
ListNode *p=L->next, *q;
ListNode *a=A,
ListNode  *b=B;
ListNode  *c=C;
while ( p )
{
if ( p->data>='a' &&p->data<='z'|| p->data>='A' &&p->data<='Z')
{
q=p;//保存字母结点位置
p=p->next;//指向下一结点
a->next=q;//将字母结点链到A表中
q->next=A;// 形成循环链表
a=a->next; // 指向下一结点
}

else if( p->data>='0' && p->data<='9')
{// 分出数字结点
q=p;
p=p->next;
b->next=q;
q->next=B;
b=b->next;
}
else
{//分出其他字符结点
q=p;
p=p->next;
c->next=q;
q->next=C;
c=c->next;
}
}
}//结束

 

--------------------------------------------------------------------------------

(答案及点评) 2.18 设有一个双链表,每个结点中除有prior、data和next三个域外,还有一个访问频度域freq,在链表被起用之前,其值均初始化为零。每当在链表进行一次LocateNode(L,s)运算时,令元素值为x的结点中freq域的值加1,并调整表中结点的次序,使其按访问频度的递减序排列,以便使频繁访问的结点总是靠近表头。试写一符合上述要求的LocateNode运算的算法。

2.18  解:

给freq域的值加1比较容易。就是每次加1后需进行排序比较麻烦。我们可以这样考虑,每次访问一个值为x的结点后,从表头开始找,根据结点中的freq值,如果找到比它小的结点,就把当前结点摘下,插入到freq值比它小的结点前面,就完成排序了。

算法如下:

void LocateNode(  LinkList  L,  DataType  x)
{
ListNode  *p, *q;
p=L->next;//带有头结点
q=L->next;
while( p )
{
if( p->data!=x) p=p->next;
else {
p->freq++;
break;
}
}
while ( q )
{
if( q->freq > p->freq) q=q->next;
else {
p->prior->next=p->next; //摘下当前结点
p->next=q;       //插入到freq不大于它的结点前
p->prior=q->p
}
}
}


--------------------------------------------------------------------------------

第二章 线性表 复习要点

本章复习要点是:

线性表的逻辑结构特征、常见的线性表的六种基本运算,并可以根据这些基本运算组合得到更复杂的运算。

顺序表的特征、顺序表中结点地址的计算。

顺序表上实现的基本运算(算法):主要是插入和删除的算法。顺序表的算法应该掌握。算法时间复杂度要记住。

单链表的特征、图形表示法。

单链表的各种算法实现,并能运用这些算法解决一些简单问题;

循环链表的特征、双链表的特征以及它们的主要算法实现。

可能出的题型有:填空题、简答题、应用题和算法题.

如:

在双链表中插入运算的时间复杂度为:(...)

A.O(1) B.O(n) C.O(lgn) D.O(nlgn)


请问头指针,开始结点和头结点的区别与联系。


关于单链表上进行排序的算法设计。 等等

闂備胶绮崝妤呭箠閹捐鍚规い鏂垮⒔閸楁岸鎮楅敐搴濈盎缂佷緡鍣i弻鐔煎礂閼测晝鐓傞梺绋跨焿閹凤拷2濠电偞鍨堕幐绋棵洪妸鈺嬬稏闁圭儤顨嗛崵鈧梺鍛婂姦娴滅偤宕洪敓鐘崇厽闁靛繈鍊栧☉褔鏌i埄鍐噰闁诡啫鍥ч唶闁挎繂娲㈤崑鎺楁⒑閸濆嫬鈧綊鎮锋潏鈺傤潟闁跨噦鎷�
濠电姰鍨归悥銏ゅ炊瑜嶆慨銈夋⒑閸涘﹤绗掓俊顐g洴椤㈡棃濮€閵堝棭妫勯柣搴秵閸犳牠宕㈤幘顔界厸闁告洟娼ч悘锝嗐亜閹存繃澶勭紒瀣樀閸┾偓妞ゆ巻鍋撻柍璇查叄濡鹃亶鏌嶈閸撴瑩宕导瀛樺亯婵炲樊浜濋弲顒勬倶閻愮數鎽傞柛銈囧Т闇夋繝濠傚暣椤庢銇勯埞顓炲婵挳鏌¢崶鈺佹灁闁告瑢鍋撻梻浣哥秺濞佳嗐亹閻愮數绠旈柟鎯ь嚟閳绘梹鎱ㄥΟ璇插闁搞倧绠撻弻鐔虹矙閹稿孩鎮欓梺浼欑秮缁犳牕顕i鈶╂瀻闁归偊鍘剧粙鍕⒑閹稿海鈽夐柡鍫墴瀹曞綊濡歌婵ジ鏌涘☉姗堟敾缂佺姵甯為埀顒€鐏氬姗€鎮ч崱娴板洭宕稿Δ浣镐痪闂佺鎻梽鍕晬閺嶎厽鐓忛柛鈩冩礀椤b暜ee濠电姰鍨圭紞濠囧焵椤掍胶鈯曢柕鍡楀暣閺屾盯骞掗幋鐑嗘濡炪倖甯為崰鎰矙婵犲洦鍋愰柣銏㈡暩鏁堥梻浣稿悑濠㈡﹢宕导瀛樺亯闁告繂濯辨惔銏$秶妞ゆ劗鍠庢禍楣冩煛閸ャ劍鐨戦柣鐔叉櫅閳藉骞樼紙鐘卞濡炪倖娲濆▍鏇炨缚韫囨稑宸濇い鎾楀啯顔�20婵°倗濮烽崑鐘诲箵椤忓棙顫曟繝闈涱儏缁犳垿鏌ゆ慨鎰偓妤€鈻旈姀鐘嗙懓饪伴崘鈺婃%缂備礁顦顓㈠焵椤掆偓濠€閬嶅磻閻旂厧鏋侀柕鍫濐槹閸庡秹鏌涢弴銊ュ闁伙箑缍婇幃妤冩喆閸曨収鏆¢梺鍝勬閸嬫捇姊洪崫鍕垫Ч闁告梹鐗犻幃锟犳晬閸曨剙鐝伴梺闈涚箚閸撴繈鎮″▎鎰濠㈣泛顑嗙粈鈧悗娈垮櫍閺€鍗烆嚗閸曨偒鍚嬮柛鏇ㄥ幘濡叉垿姊洪崫鍕偓浠嬶綖婢跺本鍏滈柛顐f礃閺咁剟鎮橀悙闈涗壕缂佺姵甯″濠氬炊閿濆懍澹曢梺鑽ゅ枑濞叉垿鎳楃捄琛℃灁闁硅揪闄勯崕鎴︽倵閿濆骸骞樼紒鐘崇墵閺屸剝寰勫☉娆忣伓

相关话题/

  • 领限时大额优惠券,享本站正版考研考试资料!
    大额优惠券
    优惠券领取后72小时内有效,10万种最新考研考试考证类电子打印资料任你选。涵盖全国500余所院校考研专业课、200多种职业资格考试、1100多种经典教材,产品类型包含电子书、题库、全套资料以及视频,无论您是考研复习、考证刷题,还是考前冲刺等,不同类型的产品可满足您学习上的不同需求。 ...
    本站小编 Free壹佰分学习网 2022-09-19