操作最後n個數據元素 類問題的解題思想

題目的提出是這樣的:

  在Unix操作系統中有一條命令,該命令的功能是依次打印文本文件的最後n行。命令格式爲:

                                       tail [-n] filename

  其中,tail爲命令名;參數filename爲文本文件名;參數[-n]表示要打印的行數,該參數是可選的,缺省值爲10。

要求是寫一個程序實現這個命令:

 

這個題目可以有以下兩種思路:

   1)設置兩個指針p,q,初始時兩個指針都指向文件的第一行。算法開始,第一個指針p開始走,走到第n個位置時,第二個位置的指針q開始走,每次p和q都向前走一步.....當p指向文件最後一行的下一個位置時,q恰好指向倒數第n行的行首,這個時候打印q所指的一行數據,q向下走一行,打印,走一行,打印......p和q相遇時,完成任務!

      PS:這個算法也是2009年全國碩士入學考試計算機綜合的算法題的解題方法,只不過題目跟上面的題目有些出入。

   下面是這個算法的C語言實現

   

  上面文件的文件名爲tail2,下圖爲在控制檯輸入後的輸出結果,這裏我選擇了電影The Social Network的英文字幕文件(已命名爲out.txt)爲輸入

  

 

   2)第二個方法用單鏈表解決。建立一個具有n個鏈接點,且不帶頭結點的單向循環鏈表,每個鏈接點的數據域需要清空,然後從文本文件的第一行開始,依次讀取文件的每一行,每讀取一行就將其存入相應鏈接點的數據域。。。。。當文件讀入結束後,循環鏈表中保留的正好是需要打印的n行,於是,從最後存入信息的那一個鏈接點的後繼結點開始,依次打印鏈接點數據域中的內容,直到所有鏈接點均被打印。

  下面是這個算法的C語言實現:

這裏我選擇了電影The Social Network的英文字幕文件(已命名爲out.txt)爲輸入,輸出結果如下圖所示

 

通過上面的分析可以看出,對於處理某個文件最後n行,或者某個數據庫中的最後k個表,都可以用上面的兩種思想來實現~如果看官有更好的方法,歡迎分享~~~

 

好睏,回去睡覺嘍~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章