(c語言課程設(shè)計(jì))C語言文本編輯器講課講稿_第1頁
(c語言課程設(shè)計(jì))C語言文本編輯器講課講稿_第2頁
(c語言課程設(shè)計(jì))C語言文本編輯器講課講稿_第3頁
(c語言課程設(shè)計(jì))C語言文本編輯器講課講稿_第4頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

文本編輯器文本編輯器是最常用的文檔創(chuàng)建和編輯工具。隨著計(jì)算機(jī)科學(xué)與技術(shù)的發(fā)展,用來處理文本的編輯器隨處可見,并且形式多樣。比如,Windows下的記事本,寫字板,EditPlus,UltraEdit等都是十分優(yōu)秀的文本編輯器和處理工具。在本章中,我們將向讀者講解如何利用C語言來發(fā)展開發(fā)一個(gè)簡易的文本編輯器。1設(shè)計(jì)目的利用C語言的單鏈表數(shù)據(jù)結(jié)構(gòu)及相關(guān)函數(shù),本章編程實(shí)現(xiàn)了一個(gè)與DOS操作系統(tǒng)下的Edit相似的文本編輯器。再次文本編輯器中,用戶可以通過快捷和選擇菜單項(xiàng),完成基本的文本編輯器和文件處理工作。通過文章的介紹,讀者可以了解文本編輯器的開發(fā)過程,掌握菜單的開發(fā)技巧,加深對(duì)文件操作的理解。更重要的是,希望此程序能拋磚引玉,引領(lǐng)讀者掌握編程的方法和技巧,開發(fā)出更優(yōu)秀的程序。2功能描述如圖.1所示,文本編輯器主要由五大功能模塊構(gòu)成,它們分別是文件操作模塊,文本編輯模塊,剪切操作模塊,菜單控制模塊和幫助及其他模塊。下面分別簡要介紹功能模塊的功能。(1)文件操作模塊。在文件操作模塊中,主要完成文件的創(chuàng)建,打開,保存和另存操作。用戶可以選擇File菜單上的New子菜單來完成新建文本文件操作;選擇File菜單上的Save子菜單來完成保存文件操作選擇File菜單上的Open子菜單來完成打開文件操作;選擇Flie菜單上的Saveas子菜單來完成文件的另存為操作。在文件的打開,保存和另存為操作中,系統(tǒng)會(huì)提示用戶輸入文件路徑及文件名。值得一提的是,當(dāng)用戶打開ー個(gè)文件時(shí),指定的文件必須存在,否則系統(tǒng)會(huì)報(bào)錯(cuò)。(2)文本編輯器模塊。在文本編輯器模塊中,主要完成在編輯窗口中以添加或插入的方式輸入字符,刪除光標(biāo)所在當(dāng)前位置的單個(gè)字符或前ー個(gè)位置的單個(gè)字符,朝上下左右4個(gè)方向的光標(biāo)移動(dòng)操作。當(dāng)光標(biāo)所在位置及后面的位置沒有字符時(shí),系統(tǒng)會(huì)以添加的方式輸入字符;當(dāng)光標(biāo)所在位置及后面的位置有字符時(shí),系統(tǒng)會(huì)已插入的方式輸入字符。用戶可以使用Backspace鍵刪除光標(biāo)前ー個(gè)字符,也可以使用Del鍵刪除當(dāng)前位置的字符或刪除Ctrl+左移(右移)鍵i選定了的多個(gè)字符。用戶可以使用左移鍵(一),右移鍵(f),上移鍵(t)和下移鍵(I)來移動(dòng)光標(biāo)位置。(3)剪貼板操作模塊。在剪貼板操作模塊中,主要完成對(duì)已選定文本的剪切,復(fù)制,粘貼工作。如果用戶要剪切文本以便可以將它移動(dòng)到其他位置,可通過Ctrl+X左移鍵(右移鍵)先選定文本,然后選擇Edit菜單上的Cut子菜單或按Ctrl+X快捷鍵來完成剪切任務(wù)。如果用戶要復(fù)制文本以便可以將它黏貼到其他位置,必須先選定文本,然后選擇Edit菜單上的Copy紫菜單或按Ctrl+C快捷鍵來完成復(fù)制任務(wù)。如果用戶要粘貼剪切或復(fù)制的文本,必須將光標(biāo)置于要粘貼文本的位置,然后選擇Edit菜單上的Paste子菜單或按Ctrl+V快捷鍵來完成粘貼任務(wù)。(4)菜單控制模塊。在菜單控制模塊中,主要完成菜單的顯示。光帶條在子菜單之間的上下移動(dòng)或菜單之間的左右移動(dòng)和子菜單項(xiàng)的選取。本文本編輯器共有Flie,Edit和Help3個(gè)子菜單項(xiàng),用戶可以分別按Fl,F2和F3功能鍵來完成這3個(gè)菜單項(xiàng)的調(diào)用,即顯示某項(xiàng)菜單。用戶可按光標(biāo)上移或下移鍵在某菜單項(xiàng)的子菜單之間循環(huán)移動(dòng),也可使用光標(biāo)的左移或右移鍵在3個(gè)菜單項(xiàng)之間循環(huán)移動(dòng)。當(dāng)光帶移動(dòng)到某個(gè)字菜單項(xiàng)上時(shí),用戶此時(shí)可使用Enter鍵來選取相關(guān)菜單選項(xiàng)。(5)幫助及其他模塊。在幫助及其他模塊中,主要完成系統(tǒng)功能及按鍵的簡要介紹。其他模塊包括文本的快速預(yù)覽和窗口的顯示。用戶可按F10功能鍵來打開快速預(yù)覽窗口,在快速預(yù)覽窗口中沒有功能菜單條。主窗口要有菜單欄,文本編輯區(qū)和狀態(tài)欄三大部分構(gòu)成,菜單欄用來顯示菜單項(xiàng),文本編輯區(qū)主要用來文本字符的輸入,刪除等操作,狀態(tài)欄主要用來顯示當(dāng)前光標(biāo)在文本窗口中的坐標(biāo)值。汪怠:TurboC2.默認(rèn)定義的文本窗口為整個(gè)屏幕,共有80列(或40列),25行的文本單元,每個(gè)單元包括ー個(gè)字符和一個(gè)屬性,字符即ASCII碼字符,屬性規(guī)定該字符的顏色和強(qiáng)度。同時(shí),他還規(guī)定整個(gè)屏幕的左上角坐標(biāo)為(1,1),右下角坐標(biāo)為(80,25)?并規(guī)定沿水平方向?yàn)閄軸,方向朝右:眼垂直方向?yàn)檠据S,方向朝下。3總體設(shè)計(jì)功能模塊設(shè)計(jì)在?2節(jié)中,簡單描述了各功能模塊的作用,下面分別介紹各功能模塊的具體設(shè)計(jì)。在介紹各功能模塊的具體設(shè)計(jì)之前,有必要先描述一下主程序的執(zhí)行流程。.程序執(zhí)行主流程文本編輯器程序執(zhí)行主流程如圖.2所示,它是在main()函數(shù)中實(shí)現(xiàn)的。他首先初始化ー些全局變量及結(jié)構(gòu)數(shù)組,接著調(diào)用drawmainO函數(shù)來顯示主窗口,然后調(diào)用while(l)進(jìn)入主循環(huán),等待用戶按鍵,最后程序根據(jù)用戶的按鍵值,進(jìn)行相應(yīng)的處理,完成文本編輯的相關(guān)工作。下面對(duì)圖.2中的按鍵判斷和相關(guān)處理作補(bǔ)充說明。(1)若按鍵為常規(guī)字符,即其ASCI!碼大于32小于127,則繼續(xù)判斷在文本編輯區(qū)的當(dāng)前光標(biāo)位置有沒有字符,若有字符,則調(diào)用insert()函數(shù),將此字符插入在當(dāng)前位置,否則在判斷沒有滿行后,將此字符添加在單鏈表的數(shù)據(jù)域中,若此行已滿,則執(zhí)行添加新行操作。(2)若按鍵為Enter鍵,則將光標(biāo)移至下一行的行首,等待用戶輸入新的字符。(3)若按鍵為光標(biāo)移動(dòng)鍵(左,右,上,下)且移動(dòng)后的位置滿足相關(guān)條件,則執(zhí)行g(shù)otoxy()操作,將光標(biāo)移動(dòng)至目標(biāo)位置。(4)若按鍵為Backspace鍵,則將調(diào)用Del()函數(shù)將光標(biāo)的前ー個(gè)字符從單鏈表中刪除;若按鍵為Del鍵,也將調(diào)用del()函數(shù)將光標(biāo)的當(dāng)前位置的字符從單鏈表中刪除。(5)若按鍵為Ctrl開頭的按鍵,則執(zhí)行與其相關(guān)的操作。具體來說,若為Ctrl+左移鍵(一),則將選定當(dāng)前光標(biāo)的位置開始向右的一個(gè)字符,若按住Ctrl鍵不放,連續(xù)按右移鍵,可以選定多個(gè)字符。若為Ctrl+左移鍵(一),則將執(zhí)行與以上相同的操作。若為Ctrl+X鍵,則將選定相關(guān)內(nèi)容保存起來,且從單鏈表中刪除選定的字符后重新顯示單鏈表的內(nèi)容。若為Ctrl+C鍵,則將選定的相關(guān)內(nèi)容保存起來,重新顯示單鏈表中的內(nèi)容(目的:為了去除字符的底色)。若為Ctrl+V鍵,則調(diào)用insert()函數(shù)將保存起來的字符插入在單鏈表中,并重新顯示單鏈表中的內(nèi)容。(6)若按鍵為F10鍵,則調(diào)用qview()函數(shù),實(shí)現(xiàn)文本的快速預(yù)覽。若按鍵為F1,F2,F3功能鍵,則調(diào)用menuctrl()菜單控制函數(shù),在此函數(shù)中完成案件的具體判斷和執(zhí)行相應(yīng)功能操作。若為F1鍵,則調(diào)用File菜單;若為F2鍵,則調(diào)用Edit菜單;若為F3鍵,則調(diào)用Help菜單。.文件操作模塊在此模塊中,主要實(shí)現(xiàn)文件的新建、打開、保存和另存為操作。在此系統(tǒng)中,文件的新建操作實(shí)現(xiàn)比較簡單,文件另存為操作與保存操作類似,下面重點(diǎn)介紹在此文本編輯器程序中,文件的打開和保存操作的具體設(shè)計(jì)和實(shí)現(xiàn)。在介紹之前,我們先簡單描述一下程序中用到的保存數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。在此程序中,共有兩種類型的單鏈表,我們稱其為行單鏈表和列單鏈表,ー個(gè)列單鏈表用來保存一行的字符,有多少行即有多少個(gè)這樣的單鏈表。行單鏈表只有一個(gè),它的每個(gè)節(jié)點(diǎn)的數(shù)據(jù)域用來保存不同列單鏈表的首節(jié)點(diǎn)的地址。例如,第4行第4列的字符保存在行單鏈表的第4個(gè)節(jié)點(diǎn)的數(shù)據(jù)域所指的列單鏈表的第4個(gè)節(jié)點(diǎn)的數(shù)據(jù)域中。有關(guān)具體數(shù)據(jù)結(jié)構(gòu)的定義,在后面的小節(jié)中會(huì)有具體介紹。1)打開文件文件的打開流程如圖.3所示,它首先提示用戶輸入要打開文件的文件名,若該文件不存在或由于其他原因打開失敗,則會(huì)結(jié)束文件打開操作。若文件成功打開并且文件指針沒有到文件尾,則從文件中一次讀取ー個(gè)字符,并將該字符添加到ー列單鏈表節(jié)點(diǎn)中,直至遇到換行符(ASCII碼10)或連續(xù)讀取字符個(gè)數(shù)大于76(在此文件編輯器中,每行最多為76個(gè)字符)。當(dāng)列單鏈表形成后,它的首地址將被保存至行單鏈表的相應(yīng)節(jié)點(diǎn)的數(shù)據(jù)域中,如此動(dòng)作,直至文件指針指向文件尾部而結(jié)束。注意:由于本程序中每行以回車符(ASCH碼為13)結(jié)束,而當(dāng)用Windows的記事本創(chuàng)建一個(gè)文本文件,打開此文件并用fgetc()函數(shù)讀取時(shí),程序?qū)懭肓袉捂湵砉?jié)點(diǎn)中的值是ASCII碼為!3的回車符。2)保存文件保存文件操作主要完成將單鏈表中的數(shù)據(jù)寫入文件中的任務(wù),它的具體實(shí)現(xiàn)流程如下。(1)用戶輸入ー個(gè)保存此單鏈表數(shù)據(jù)的文件名。(2)以只寫方式打開此文件,若成功打開此文件,則執(zhí)行步驟(3);否則退出。(3)讀取行單鏈表中的節(jié)點(diǎn)數(shù)據(jù)域的值,若值不為空,則執(zhí)行步驟(4);否則執(zhí)行步驟(6)。(4)依次讀取行單鏈表節(jié)點(diǎn)中保存的首地址的相應(yīng)列單鏈表節(jié)點(diǎn)的數(shù)據(jù)域的值,若其值為回車符,則用換行符替代后將其寫入文件中;否則直接將其值寫入文件中,直至該列單鏈表中指針域?yàn)镹ULL的最后一個(gè)元素結(jié)束。(5)讀取行單鏈表中的下ー個(gè)節(jié)點(diǎn),并跳至步驟(3)〇(6)關(guān)閉文件,退出。.文件編輯模塊在文件編輯模塊中,主要完成以添加或插入的方式輸入字符、刪除光標(biāo)所在的當(dāng)前位置或前ー個(gè)位置的單個(gè)字符、朝上下左右4個(gè)方向的光標(biāo)的移動(dòng)操作。下面介紹這4個(gè)功能的具體設(shè)計(jì)與實(shí)現(xiàn)。1)添加字符當(dāng)光標(biāo)處在文本編輯的最后一行的位置且光標(biāo)后面沒有字符時(shí),若此時(shí)輸入字符,程序會(huì)判斷一行中字符的個(gè)數(shù),若字符個(gè)數(shù)不等于76,則在當(dāng)前的列單鏈表的最后ー個(gè)節(jié)點(diǎn)中保存輸入的字符,然后添加一個(gè)新的節(jié)點(diǎn)來保存下ー個(gè)輸入的字符:若等于76,則在當(dāng)前的列單鏈表的最后ー個(gè)節(jié)點(diǎn)中保存輸入的字符,然后在行單鏈表中添加一個(gè)新節(jié)點(diǎn)用來保存下一行的列單鏈表的首地址,添加一個(gè)新的列單鏈表節(jié)點(diǎn)來保存下ー個(gè)用戶輸入的字符。2)插入字符若光標(biāo)所在處已經(jīng)存在字符,當(dāng)用戶在當(dāng)前位置輸入字符時(shí),程序會(huì)調(diào)用insert。函數(shù)將輸入的字符在光標(biāo)所在的位置處在列單鏈表中插入,插入完成后,會(huì)調(diào)用test。函數(shù)來檢查各行是否滿足只有76個(gè)字符的條件,若不滿足此條件,則在此函數(shù)中會(huì)對(duì)多出的字符進(jìn)行處理。下面分別對(duì)列單鏈表中字符的插入過程和單鏈表的檢查過程進(jìn)行介紹。若在第m行,第n列的位置插入一個(gè)字符,其insert()過程描述如下:(1)定位至行單鏈表中的第m個(gè)節(jié)點(diǎn),得到這個(gè)節(jié)點(diǎn)的數(shù)據(jù)域的值,其值為對(duì)應(yīng)列單鏈表中第一個(gè)節(jié)點(diǎn)的地址。(2)定位至列單鏈表中的第n-1個(gè)節(jié)點(diǎn)。(3)創(chuàng)建一個(gè)新的列單鏈表節(jié)點(diǎn),用其數(shù)據(jù)域保存輸入的字符。(4)若字符插入在第m行第1歹リ,則直接將行單鏈表中第H!個(gè)節(jié)點(diǎn)的數(shù)據(jù)域的值改變?yōu)樾碌牧袉捂湵砉?jié)點(diǎn)的地址,新的列單鏈表節(jié)點(diǎn)的指針域指向列單鏈表中原來的第1個(gè)節(jié)點(diǎn)。若字符不是插入在第m行第1歹リ,則執(zhí)行簡單的單鏈表中插入節(jié)點(diǎn)的操作。(5)插入此字符后,調(diào)用test。函數(shù),從第m行開始檢查各行是否滿足每行只允許有76個(gè)字符的條件,若不滿足此條件,則必須進(jìn)行處理。其test。檢查處理過程描述如下:(1)用指針tail指向已經(jīng)插入了新節(jié)點(diǎn)的列單鏈表中的最后一個(gè)節(jié)點(diǎn)。(2)若此單鏈表中節(jié)點(diǎn)數(shù)超過76個(gè),則指針pl會(huì)指向此列單鏈表中的第76個(gè)節(jié)點(diǎn),指針p2指向第7Y個(gè)節(jié)點(diǎn),并將pl所指節(jié)點(diǎn)的指針域設(shè)置為NULL。(3)若tail所指節(jié)點(diǎn)的數(shù)據(jù)域?yàn)镋nter鍵(ASCII為13)且在行單鏈表中只有m個(gè)節(jié)點(diǎn),則在此行單鏈表中添加一個(gè)新的節(jié)點(diǎn),新節(jié)點(diǎn)的數(shù)據(jù)域?yàn)镻2的值,指針域?yàn)榭?并將m節(jié)點(diǎn)的指針域指向它;若tail所指節(jié)點(diǎn)反而數(shù)據(jù)域?yàn)镋nter鍵(ASCH為13)且在行單鏈表中有多于m個(gè)節(jié)點(diǎn),與上面不同的是,它執(zhí)行的是在行單鏈表插入一個(gè)新的節(jié)點(diǎn)的操作。(4)若tail所指節(jié)點(diǎn)的數(shù)據(jù)域不是回車符,pl的數(shù)據(jù)域?yàn)榛剀嚪⑶倚袉捂湵碇兄挥衜個(gè)節(jié)點(diǎn),則在行單鏈表中添加一個(gè)新的節(jié)點(diǎn),新節(jié)點(diǎn)的數(shù)據(jù)域?yàn)閜2的值,指針域?yàn)榭?并將第m節(jié)點(diǎn)的指針域指向它;若tail所指節(jié)點(diǎn)的數(shù)據(jù)域不為回車符并且行單鏈表中有多于m節(jié)點(diǎn),則將tail的指針域指向行單鏈表中第m+1個(gè)節(jié)點(diǎn)所指的列單鏈表的首節(jié)點(diǎn),并將行單鏈表中第m+1個(gè)節(jié)點(diǎn)的數(shù)據(jù)域修改成指針p2的值,并對(duì)行單鏈表中第m+1個(gè)節(jié)點(diǎn)所指的列單鏈表進(jìn)行test()檢查,相似的處理過程至行單鏈表中的最后ー個(gè)節(jié)點(diǎn)結(jié)束。3)刪除字符當(dāng)用戶按下Del鍵時(shí),系統(tǒng)會(huì)調(diào)用del()函數(shù)在單鏈表中刪除當(dāng)前光標(biāo)所在處的字符;當(dāng)用戶按下Backspace鍵時(shí),系統(tǒng)也會(huì)調(diào)用這個(gè)函數(shù)在單鏈表中刪除當(dāng)前光標(biāo)所在處前ー個(gè)位置的字符。若在第m行、第n列的位置刪除ー個(gè)字符,其在列單鏈表中刪除一個(gè)節(jié)點(diǎn)的操作域插入工作十分相似,所以這里重點(diǎn)介紹刪除該字符后,單鏈表中數(shù)據(jù)的前移工作過程。(1)在相應(yīng)的列單鏈表中刪除第n個(gè)節(jié)點(diǎn)。(2)判斷第m行是否存在并且判斷在此行中是否有字符,若第m行不存在,或此行中沒有字符,則結(jié)束字符刪除過程,否則執(zhí)行步驟(3)〇(3)用tail保存第m行相應(yīng)列單鏈表中最后ー個(gè)節(jié)點(diǎn)的地址,并將最后ー個(gè)節(jié)點(diǎn)的指針域保存為第川+1行中相應(yīng)列單鏈表的第一個(gè)元素的地址。(4)計(jì)算出第m行中沒有字符的位置的個(gè)數(shù)num,然后在第m+!行的相應(yīng)列單鏈表中截取num個(gè)節(jié)點(diǎn),并將行單鏈表中的第m+1節(jié)點(diǎn)的數(shù)據(jù)域改為相應(yīng)列單鏈表中的第num個(gè)節(jié)點(diǎn)后的節(jié)點(diǎn)的地址。(5)調(diào)用m++語句,是變量m增1,跳至步驟(3),開始對(duì)下一行進(jìn)行處理。4)移動(dòng)光標(biāo)移動(dòng)光標(biāo)的操作主要利用gotoxyO函數(shù)來實(shí)現(xiàn),過程非常簡單,只需對(duì)當(dāng)前的光標(biāo)位置和移動(dòng)方向進(jìn)行判斷后,即可執(zhí)行g(shù)otoxyO過程。例如,如果當(dāng)前光標(biāo)在第m行第1列,且按下了光標(biāo)左移鍵,只需將光標(biāo)移至第mT行,第76列。.剪貼板操作模塊在剪切板操作模塊中,主要完成對(duì)已選定文本的剪切、復(fù)制和粘貼工作,因此剪貼板操作與文本選定工作密切相關(guān)。下面分別介紹文本的選定和對(duì)選定文本的剪切、復(fù)制和粘貼操作的具體實(shí)現(xiàn)。1)選定文本用戶可按Ctrl+くー或Ctrl+->來選定文本,就具體實(shí)現(xiàn)而言,兩者基本相同。在介紹選定文本的實(shí)現(xiàn)過程之前,先簡要介紹一個(gè)全局的結(jié)構(gòu)數(shù)組r[],它的元素的類型為record結(jié)構(gòu)體類型,每ー個(gè)元素可保存一個(gè)字符的x坐標(biāo)、y坐標(biāo)和字符值。其文本選定的實(shí)現(xiàn)過程如下:(1)當(dāng)用戶按下Ctrl+くー或Ctrl+->鍵時(shí),程序?qū)?dāng)前光標(biāo)位置向左或向右移動(dòng)一個(gè)位置。(2)當(dāng)前光標(biāo)所在位置的字符的x坐標(biāo)、y坐標(biāo)和字符值保存在數(shù)組元素r[value]中value從〇開始,若按減為Ctrl+<-,value值在原來基礎(chǔ)上每次加1;若按鍵為Ctrl+->,value值在原來基礎(chǔ)上每次減1.(3)調(diào)用ColorviewO函數(shù),用不同的顏色來顯示已經(jīng)選定的當(dāng)前文本,以達(dá)到突出選定文本的效果。2)剪切用戶可按Ctrl+X鍵或通過Edit菜單選項(xiàng)來剪切選定的文本,若之前沒有選定的文本,此按鍵無效。它的實(shí)現(xiàn)過程如下:(1)若全局變量value的值大于〇(大于〇表示已經(jīng)有文本選定),則執(zhí)行下面操作。(7)(2)保存當(dāng)前位置的坐標(biāo),利用循環(huán)語句,依次利用x[0]至x[value-l]數(shù)組元素保存已選定字符的坐標(biāo),調(diào)用del〇函數(shù)在單鏈表中一次刪除ー個(gè)選定的字符。(3)利用全局變量backup保存value的值后,將value賦值為〇〇(4)重新在文本編輯器中顯示單鏈表中保存的所有字符,并將光標(biāo)置位到原來的位置。3)復(fù)制用戶可按Ctrl+C鍵或通過Edit菜單選項(xiàng)來復(fù)制選定的文本,復(fù)制操作的實(shí)現(xiàn)比剪切操作簡單,它的實(shí)現(xiàn)過程如下:(1)保存當(dāng)前位置的坐標(biāo)。(2)利用全局變量backup保存value的值后,將value賦值為〇〇(3)重新在文本編輯器中顯示單鏈表中保存的所有字符,并將光標(biāo)置位到原來的位置。4)粘貼用戶可按Ctrl+V鍵或通過Edit菜單選項(xiàng),完成粘貼操作。這ー操作必須在剪切或復(fù)制操作之后出現(xiàn)。它的具體實(shí)現(xiàn)過程如下:(1)若全局變量backup的值大于〇(大于〇表示已經(jīng)有字符放入了剪貼板數(shù)組)中,則執(zhí)行下面的操作。(2)保存當(dāng)前位置的坐標(biāo),利用循環(huán)語句,依次利用x[0]至x[backupT]數(shù)組元素保存已選定字符的坐標(biāo)和字符值,調(diào)用insert〇函數(shù)在單鏈表中一次插入一個(gè)字符。(3)重新在文本編輯器中顯示單鏈表中保存的所有字符,并將光標(biāo)置位到原來的位置。5.菜單控制模塊在菜單控制模塊中,主要完成菜單的顯示、光帶條在子菜單之間的上下移動(dòng)或菜單之間的左右移動(dòng)以及子菜單項(xiàng)的選項(xiàng)工作。下面分別介紹這3項(xiàng)功能的具體實(shí)現(xiàn)。1)顯示菜單用戶可按Fl、F2和F3功能鍵來分別調(diào)用File、Edit和Help菜單,即完成菜單的顯示。當(dāng)按下這3個(gè)功能鍵中的某個(gè)功能鍵時(shí),程序會(huì)調(diào)用menuctrl()函數(shù)來完成菜單的調(diào)用操作。在menuctrl()函數(shù)中,會(huì)根據(jù)功能鍵的鍵值調(diào)用drawmenu(value,flag)函數(shù),參數(shù)value、flag都為局部變量,分別用來保存調(diào)用某個(gè)菜單、某個(gè)菜單下的第幾個(gè)菜單選項(xiàng)。例如,按F1鍵后,它的默認(rèn)值為drawmenu(0,0),表示繪制File菜單及其5個(gè)菜單選項(xiàng),并將菜單選擇光帶條置于第一個(gè)菜單選項(xiàng)上。下面簡要描述一下draw(value,flag)函數(shù)的過程。(1)先取value除以3的余數(shù)m(因?yàn)橛?個(gè)菜單項(xiàng),所以除數(shù)選擇3),根據(jù)m的值來繪制不同的菜單。m的取值為〇、1、2、。當(dāng)m等于〇時(shí),表示繪制File菜單;其余類推。(2)然后繪制菜單的邊框及菜單選項(xiàng)值。(3)取File除以x的余數(shù)t,x的取值視m的取值而定,如當(dāng)m=5時(shí),x=5,因?yàn)镕ile菜單下有5個(gè)選項(xiàng)。(4)根據(jù)t的值,用不同的前景色和背景色在原來的位置重新顯示菜單選項(xiàng),以達(dá)到光帶條的效果。2)移動(dòng)菜單光帶條當(dāng)用戶按Fl、F2和F3中的某個(gè)功能鍵調(diào)用了某個(gè)菜單后,可繼續(xù)按光標(biāo)左移、右移、上移和下移鍵來實(shí)現(xiàn)菜單之間的切換和菜單選項(xiàng)之間的切換。若為左移鍵,則調(diào)用drawmenu(--value,flag)函數(shù),將切換至某個(gè)菜單的左邊鄰居菜單。若當(dāng)前菜單為最左邊的File菜單,則切換至最右邊的Help菜單。若為右移鍵,則調(diào)用drawmenu(++value,flag)函數(shù)。若為上移鍵,則調(diào)用drawmenu(value,--flag)函數(shù);若為下移鍵,則調(diào)用drawmenu(value,++flag)函數(shù)。3)選取菜單當(dāng)用戶將光帶選擇條置于某個(gè)菜單選項(xiàng)上時(shí),可按Enter鍵來選取該菜單選項(xiàng)。選取菜單操作的實(shí)現(xiàn)比較簡單,它主要利用a二(value%3)*10+flag%b來計(jì)算出選擇的菜單選項(xiàng)的編號(hào)。選取不同菜單選項(xiàng)后,a的值不同。這樣,程序可根據(jù)a的值,返回給main〇函數(shù)不同的標(biāo)記,在mainい函數(shù)中,可根據(jù)標(biāo)記的不同來執(zhí)行相關(guān)功能。6.幫助及其他模塊幫助模塊主要用于提示用戶如何使用本軟件,它的實(shí)現(xiàn)非常簡單。同樣,文本的快速預(yù)覽模塊是在原來主窗口顯示模塊的基礎(chǔ)上,去除了菜單的顯不〇主窗口主要由菜單欄、文本編輯區(qū)和狀態(tài)欄3大部分構(gòu)成。菜單欄用來顯示菜單項(xiàng),文本編輯區(qū)主要用來完成文本字符的輸入、刪除等操作,狀態(tài)欄主要用來顯示當(dāng)前光標(biāo)在文本窗口中的坐標(biāo)值。它主要利用文本窗口的gotoxy()函數(shù)和cprintf()函數(shù)來實(shí)現(xiàn),這里需要對(duì)文本窗口的坐標(biāo)進(jìn)行仔細(xì)設(shè)計(jì)。本程序定義了3個(gè)結(jié)構(gòu)體,分別與剪貼板、列單鏈表和行單鏈表相關(guān)。下面分別介紹這3個(gè)結(jié)構(gòu)體及幾個(gè)全局變量。.與剪貼板相關(guān)的record結(jié)構(gòu)體typedefstructrecord{charch;intcol,line;}record;record結(jié)構(gòu)體表示一個(gè)字符所具有的屬性,當(dāng)用戶使用相關(guān)按鍵選定文本后,選定的文本保存在record結(jié)構(gòu)體類型的數(shù)組中。結(jié)構(gòu)體中各字段表示的意義如下。charch:保存一個(gè)選定的文本字符。intcol,line:分別保存選定字符所在位置的x軸坐標(biāo)和y軸坐標(biāo)。.與列單鏈表相關(guān)的node結(jié)構(gòu)體typedefstruetnode{charch;structnode*next;}node;node結(jié)構(gòu)體定義了在ー個(gè)單鏈表中保存行中的單個(gè)字符的結(jié)構(gòu),我們稱由node類型的節(jié)點(diǎn)構(gòu)成的單鏈表為列單鏈表。結(jié)構(gòu)體中各字段表示的意義如下。charch:數(shù)據(jù)域,保存一個(gè)字符。structnode*next:指針域,指向列單鏈表中的下ー個(gè)節(jié)點(diǎn)。.與行單鏈表相關(guān)的Hnode結(jié)構(gòu)體typedefstructHnode(node*next;structHnode*next1;}record;Hnode結(jié)構(gòu)體定義了在ー個(gè)單鏈表中保存列單鏈表首節(jié)點(diǎn)地址的結(jié)構(gòu),我們稱由Hnode類型的節(jié)點(diǎn)構(gòu)成的單鏈表為行單鏈表。結(jié)構(gòu)體中各字段表示的意義如下。node*next:數(shù)據(jù)域,。指向列單鏈表的首節(jié)點(diǎn)的地址structHnode*next1:指針域,指向列單鏈表中的下ー個(gè)節(jié)點(diǎn)。4,全局變量及數(shù)組intvalue,backup,NUM:value保存有值數(shù)組元素的最大下標(biāo)值,backup保存value的副本,NUM保存當(dāng)前行中用戶輸入的字符個(gè)數(shù)。recordr[500]:定義ー個(gè)有500個(gè)元素的結(jié)構(gòu)體數(shù)組,每個(gè)數(shù)組元素可保存一個(gè)選定的文本字符及其坐標(biāo)值。drawmain()函數(shù)原型:voiddrawmain()drawmain。函數(shù)用于在程序中會(huì)只包括菜單欄,編輯區(qū)和狀態(tài)欄在內(nèi)的主窗口。qview()函數(shù)原型:voidqview(Hnode*q)qviewO函數(shù)用于快速預(yù)覽文本。q為指向行單鏈表中第一個(gè)節(jié)點(diǎn)的指針。view()函數(shù)原型:viodview(Hnode*q)view()函數(shù)用于按行顯示保存在單鏈表中的文本字符,q為指向行單鏈表中第一個(gè)節(jié)點(diǎn)的指針。4)check()函數(shù)原型:intcheck(Hnode*Hhead,intm,intn)函數(shù)用于在單鏈表中檢查第m行,第n列位置的字符,若為常規(guī)字符,則返回該字符;否則返回0或T.judge()函數(shù)原型:intjudje(Hnode*Hhead,intm)judge。函數(shù)用于返回第m行中不包括回車符在內(nèi)的常規(guī)字符的個(gè)數(shù)。del()函數(shù)原型:intdel(Hnode*Hhead,intm,intn)del()函數(shù)用于在單鏈表中刪除第m行,第n列位置的字符。)test()函數(shù)原型:inttest(Hnode*Hhead,intn)test。函數(shù)用于執(zhí)行后,檢驗(yàn)第n行及后面的數(shù)據(jù),使其滿足每行不多于76個(gè)字符的規(guī)則。insert()函數(shù)原型:viodinsert(Hnode*Hheadintm,intn,chara)insert()函數(shù)用于在第m行,第n列位置的前ー個(gè)位置插入單個(gè)字符。control()函數(shù)原型:voidcontrol(intA,Hnode*Hhead)control。函數(shù)用于對(duì)左移鍵(右移鍵)進(jìn)行響應(yīng),A為按鍵的整數(shù)值,Hhead為行單鏈表的首地址。colorview。函數(shù)原型:voicolorview(Hnode*Hhead,intx,inty)colorviewO函數(shù)用于用不同的前、背景色現(xiàn)實(shí)選擇的字符。drawmenu()函數(shù)原型:voiddrawmenu(intm,intn)drawmenu函數(shù)用于畫菜單,m表示第幾項(xiàng)菜單,n表示第m項(xiàng)的第n個(gè)子菜單項(xiàng)。menuctrl()函數(shù)原型:intmenuctrl(Hnode*Hhead,intA)menuctrl()函數(shù)用于菜單控制。save()函數(shù)原型:voidsave(Hnode*head)save。函數(shù)用于將head所指的行單鏈表中所指的各個(gè)列單鏈表中的數(shù)據(jù)域的值寫入文件,文件路徑和文件名由用戶指定。saveas()函數(shù)原型:voidsaveas(Hnode*head)saveasO函數(shù)用于實(shí)現(xiàn)文件另存工作,文件路徑和文件名由用戶指定。opens()函數(shù)原型:voidopens(Hnode*Hp)opens()函數(shù)用于從任意文本文件中讀取文件內(nèi)容,保存至行單鏈表形式的數(shù)據(jù)結(jié)構(gòu)中。)main()函數(shù)原型:voidmain()main().4程序?qū)崿F(xiàn)源碼分析1.程序預(yù)處理程序預(yù)處理包括頭文件的加載,以及結(jié)構(gòu)體,常量和全局變量的定義。/?文本編輯器editor源代碼?/ttincludettincludettincludettinclude#defineLEFT0x4b00/**-:光標(biāo)左移*/#defineRIGHT0x4d00/*-*:光標(biāo)右移?/#defineD0WN0x5000/*(鍵:光標(biāo)下移?/#defineUPOx480〇/*t鍵:光標(biāo)上移?/#defineESC0x011b/*ESC鍵:取消菜單打開操作*/#defineENTEROxlcOd/?回車鍵:換行?/#defineDEL21248/*DEL鍵:刪除當(dāng)前字符?/#defineBACK3592/*BackSpace鍵:刪除當(dāng)前光標(biāo)位置前ー個(gè)字符?/#defineCL2944〇/*ctrl+一鍵:從右至左,選定文本?/#defineCR29696/*ctrl+f鍵:從左到右,選定文本?/#defineCcH779/*ctrl+c鍵:將選定文本,復(fù)制一份到剪貼板中?/#defineCvl2054/*ctrl+v鍵:將剪貼板中的內(nèi)容復(fù)制到當(dāng)前位置?/#defineCxH544/*ctrl+x鍵:對(duì)選定文本,執(zhí)行剪切操作?/#defineFH5104/*Fl鍵:打開文件菜單?/#defineF215360/*F2鍵:打開編輯菜單?/#defineF3156/*F3鍵:打開幫助菜單?/#defineF1017408/*F10鍵:進(jìn)入文本快速預(yù)覽模式?/intvalue,backup,NUM;/*value保存有值數(shù)組元素的最大下標(biāo)值,backup保存value的副本,NUM保存當(dāng)前行中的用戶輸入的字符個(gè)數(shù)?/typedefstructrecordcharch;/?保存一字符?/intcol,line;/*x軸和y軸坐標(biāo)?/}record;recordr[500];/?定義ー個(gè)有500個(gè)元素的結(jié)構(gòu)體數(shù)組,保存選定的文本字符的屬性?/typedefstructnode/?定義保存行中的單個(gè)字符的結(jié)構(gòu)?/(charch;/?數(shù)據(jù)域:保存一字符?/structnode*next;/?指針域:指向下ー個(gè)結(jié)點(diǎn)的指針?/}node;/*由此類型節(jié)點(diǎn)構(gòu)成的單鏈表,命名為:列單鏈表?/typedefstructHnode/?定義保存所有列單鏈表首節(jié)點(diǎn)的指針的結(jié)構(gòu)?/(node*next;/?指向列單鏈表的首節(jié)點(diǎn)的地址?/structHnode*nextl;/?指向下ー個(gè)節(jié)點(diǎn)的指針}Hnode;/?由此類型節(jié)點(diǎn)構(gòu)成的單鏈表,命名為:行單鏈表?/.繪制主窗口繪制文本編輯器主窗ロ由drawmain()函數(shù)來完成,通過準(zhǔn)確定位相關(guān)輸出對(duì)象的坐標(biāo)來完成主窗口的繪制。主窗口共分為3個(gè)區(qū)域:菜單區(qū),文本編輯去和狀態(tài)欄區(qū)。voiddrawmain。/?畫主窗口函數(shù)?/{inti,j;gotoxy(1,1);/?在文本窗口中設(shè)置光標(biāo)至(1,1)處?/textbackground(7);/?選擇新的文本背景顏色,7為LIGHTGRAY淡灰色?/textcolor(0);/?在文本模式中選擇新的字符顏色〇為BLACK黑?/insline();/*在文本窗口的(1,1)位置處中插入ー個(gè)空行?/for(i=].;i〈=24;i++)gotoxy(1,1+i);/*(x,y)中x不變,y++*/cprintf("%c",196);/?在窗口左邊輸出ー,即畫出主窗口的左邊界?/gotoxy(80,1+i);cprintf(ff%cH,196);/?在窗口右邊,輸出ー,即畫出主窗口的右邊界?/)for(i=l;i<=79;i++)(gotoxy(1+i,2);/?在第2行,第2列開始?/cprintf(,f%c\196);/?在窗口頂端,輸出ー*/gotoxy(l+i,25);/?在第25行,第2列開始?/cprintf(,r%cM,196);/?在窗口底端,輸出ー*/)gotoxy(1,1);cprintf("%c",196);/?在窗口左上角,輸出ー*/gotoxy(1,24);cprintf("%c",196);/?在窗口左下角,輸出ー*/gotoxy(80,1);cprintf("%c",196);/?在窗口右上角,輸出ー*/gotoxy(80,24);cprintf("%c",196);/?在窗口右下角,輸出ー*/gotoxy(7,1);cprintfCr%c%cFile%c%c,f,179,17,,179);/*|<>|*/gotoxy(27,1);cprintf(n%c%cEdit%c%c'r,179,17,,179);/*|<>|*/gotoxy(47,1);cprintf(n%c%cHelp%c%c'f,179,17,,179);/*|<>|*/gotoxy(5,25);/?跳至窗口底端?/textcolor(1);cprintf("Row:ICol:1");gotoxy(68,25);cprintf("Version).文本字符顯示輸出文本字符顯示輸出模塊的作用是通過循環(huán)讀取各單鏈表,醬爆錯(cuò)在單鏈表眾多的字符在文本編輯區(qū)中顯示輸出。通過qview(hnode*q)函數(shù),可實(shí)現(xiàn)文本字符的快速預(yù)覽。通過view(honde*q)函數(shù),可實(shí)現(xiàn)文本字符在編輯區(qū)域的顯示。voidqview(Hnode*q)/*快速預(yù)覽文本:開頭:#,回車I**/voidview(Hnode*q);/*view()函數(shù)聲明?/node*p;inti;window(l,1,80,25);/?定義文本窗口大小?/clrscr();/?清屏?//?循環(huán)讀取兩個(gè)單鏈表中的值:q是ー個(gè)指向行單鏈表首節(jié)點(diǎn)的指針,此單鏈表數(shù)據(jù)域的值為實(shí)際保存各行字符的列單鏈表p中的首節(jié)點(diǎn)地址?/do{p=q->next;/*p指向保存行數(shù)據(jù)的列單鏈表的首節(jié)點(diǎn)的地址?/cprintf("#");/?每行幵頭,打印此字符,不管前面是否有回車符?/while(p!=NULL)/?循環(huán)讀取單鏈表p中的值?/{if(p->ch==13)putch(1*');/*若為回車鍵,打印出?號(hào)?/elseputch(p->ch);/*輸出各行中的字符到預(yù)覽窗口p=p->next;/?指向下ー個(gè)節(jié)點(diǎn)?/q=q-〉next1;/?指向下ー個(gè)節(jié)點(diǎn)?/printf("\n");/?輸出ー個(gè)回車?/}while(q!=NULL);getch();clrscr();drawmainO;/*按任意鍵后,回到主窗口界面?/window(2,2,79,23);textbackground(9);for(i=0;i<24;i++)insline();/?插入24個(gè)空行?/window(3,3,78,23);textcolor(10);voidview(Hnode*q)/*按行顯示保存在單鏈表中的文本字符,q為指向行單鏈表中第一個(gè)節(jié)點(diǎn)的指針?/node*p;/*p為保存列單鏈表節(jié)點(diǎn)元素地址的指針?/clrscr();/?清屏?//?雙重循環(huán),讀取并顯示保存在單鏈表中字符?/do{p=q-〉next;while(p!=NULL&&p->ch>=32&&p->ch<127&&p->ch!=13&&p->ch!=一1)/?指針p不能為空,且數(shù)據(jù)域必須為常規(guī)字符?/(putch(p->ch);/*在文本窗口中輸出該字符?/p=p->next;/?指向下ー個(gè)節(jié)點(diǎn)?/)q=q->next1;/*指向下ー個(gè)節(jié)點(diǎn)?/if((p->ch==13IIp->ch==-l)&&q!=NULL)gotoxy(l,wherey()+1);/*若ch為回車或EOF標(biāo)記,光標(biāo)跳至下行的開始處?/}while(q!=NULL);/?逐行逐列顯示文本字符?/).刪除字符程序調(diào)用del(Honde*Hhead,intm,intn)函數(shù)來完成刪除第行、第列位置的字符。它的具體過程在功能模塊設(shè)計(jì)部分已經(jīng)詳細(xì)介紹。下面介紹另外兩個(gè)對(duì)字符進(jìn)行檢測的函數(shù),它在字符的刪除、插入等許多操作中都有用到。調(diào)用check(Hnode*Head,intm,intn)函數(shù),在單鏈表中檢查第山行、第n列位置的字符,若為常規(guī)字符,則返回該字符;否則返回0或?し,調(diào)用judge(Hnode*Hhead,intm)函數(shù),在單鏈表中統(tǒng)計(jì)第m行中的常規(guī)字符的總個(gè)數(shù),并返回統(tǒng)計(jì)值。intdel(Hnode*Hhead,intm,intn)/*del():刪除第m行,第n列位置的字符?/{Hnode*q,*ql;node*pl,*p2,*tail;inti,num=O,j,flag=O;q二Hhead;if(n=O&&m=l)return;/*第1行,第〇列不存在?/if(n=O&&m>l)/?若為第〇列字符,但行必須大于1,執(zhí)行向上行移處理?/n二76;m=m-1;gotoxy(n,m);/*移至第m-1行,第76列?/flag=1;/?移位的標(biāo)志置1*/)for(i=l;i<m;i++)/?定位至行單鏈表中的第m個(gè)元素?/q=q->nextl;pl=q->next;for(i=l;i<n-l;i++)/?定位至列單鏈表中的第n-1個(gè)元素?/pl=pl->next;p2=plー〉next;/*p2指向列單鏈表中的第n個(gè)元素?/1バ!Iニニ1)/*若是刪除第11I行第1列的字符*/(qー〉next二plー〉next;free(pl);elseplー〉next=p2ー〉next;/?在單鏈表中刪除第m行第n列的元素?/free(p2);)/?刪除掉第m行第n列的元素后,處理行單鏈表中第m個(gè)節(jié)點(diǎn)后的數(shù)據(jù)向前移的任務(wù)?/while((num=judge(Hhead,m++))〉〇)/?執(zhí)行一次judge(Head,m)后,m才加1.這里必須滿足行常規(guī)字符數(shù)不為O的條件?/{pl二qー〉next;ql二q;if(pl!=NULL)/?若當(dāng)前行非空?/{while(plー〉next!=NULL)pl=pl-〉next;tail=pl;/*tail保存列單鏈表最后ー個(gè)元素的地址?/q二qー〉next1;/?指向下一行的元素的地址?/pl=p2=qー〉next;tail->next=pl;/*tai1的指針域指向下一行的第一個(gè)元素的地址?/}else/?若當(dāng)前行的字符個(gè)數(shù)為0,即刪除該字符后,只剩下回車符,則將下ー個(gè)行單鏈表中節(jié)點(diǎn)的數(shù)據(jù)域移至前一下節(jié)點(diǎn)的數(shù)據(jù)域?/{q=q->nextl;pl=p2=q->next;qlー〉next二pl;/*ql-〉next指向下一行的第一個(gè)元素的地址?/}for(i=O;i<76-num;i++)/?當(dāng)前行還有76-num個(gè)空位沒有字符,在下ー行的單鏈表中讀取字符,直至遇到回車符為止?/{pl=p2;/*pl指向p2的前ー個(gè)節(jié)點(diǎn),p2指向行單鏈表中下ー個(gè)節(jié)點(diǎn)?/p2=p2ー〉next;if(p2ー〉chニニ13)break;/?若為回車,跳出循環(huán)?/qー〉next二p2;/?在列單鏈表中去掉移至上行的元素?/plー〉next二NULL;/?下行移至上行的最后ー個(gè)元素,指針置空?/}returnflag;/?返回〇:表示沒有換位,返回1:表示有換位?/)intcheck(Hnode*Hhead,intm,intn)/*check():在單鏈表中檢查第m行第n列位置的字符,若為常規(guī)字符,則返回該字符?/(inti;Hnode*q;node*p;q二Hhead;for(i=l;i<m;i++)/?定位至行單鏈表中的第i個(gè)元素?/q=q->nextl;p=q-〉next;/?獲取第m個(gè)節(jié)點(diǎn)的數(shù)據(jù)域?/for(i=l;i<n;i++)/*定位至列單鏈表中的第n個(gè)元素?/p=p->next;if(p->chニニ13)returnT;/?若第m行,第n列的字符為回車鍵,則返回ー1*/if(p->ch>=32&&p->ch<127)returnp->ch;/?若第m行,第n列的字符為常規(guī)字符,則返回該字符*/elsereturnO;/?若第m行,第n列的字符既非回車符又非常規(guī)字符,則返回〇?/intjudge(Hnode*Hhead,intm)/*judge():返回第m行中的常規(guī)字符總的個(gè)數(shù),不包括回車符?/{Hnode*q;node*p;inti,numニ〇;q二Hhead;for(i=l;i<m;i++)/?定位至行單鏈表中的第m個(gè)元素?/q二q->nextl;if(qニニNULL)return-1;/?返回T,表示第m行不存在?/p二q-〉next;while(p-)next!二NULL)(p二p-〉next;num++;/?統(tǒng)計(jì)第m行的字符個(gè)數(shù)?/}/?行尾字符還沒有判斷,接下來判斷行尾字符?/if(pー〉chニニ13&&numニニ〇)return。;/?返回0,表示當(dāng)前行只有一個(gè)回車字符?/if(p->ch>=32&&p->ch<127)returnnum+1;/?返回num+1,表示當(dāng)前行的最后ー個(gè)字符為常規(guī)字符?/if(p-〉chニニ13&&num!ニ〇)returnnum;/?返回num,表示當(dāng)前行的最后一個(gè)字符為回車符,不計(jì)算在內(nèi)?/elsereturnl;/?返回num,表示當(dāng)前行中只有一個(gè)字符,且沒有回車符?/}.插入字符在文本編輯區(qū)中插入字符的工作由insert(Hnode,*Hhead,intm,intn,chara)函數(shù)和test(Hnode*Hhead,intn)函數(shù)配合完成。(1)通 過insert(Hnode*Hhead,intm,intn,chara)函數(shù),在第m行、第n列的位置之前的ー個(gè)位置,在單鏈表中插入字符a。(2)通過test(Hnode*hhead,intn)函數(shù),檢查和處理第n行及后面的數(shù)據(jù),使其滿足每行不超過76個(gè)字符的規(guī)則voidinsert(Hnode*Hhead,intm,intn,chara)/*第m行,第n列的位置之前一個(gè)位置,插入單字符?/(inti;Hnode*q;node*p,*pl,*p2;q二Hhead;for(i=l;i<m;i++)/?定位至行單鏈表中的第m個(gè)元素?/q=q->nextl;pl=q->next;for(i=l;i<n-l;i++)/?定位至列單鏈表中的第n-1個(gè)元素?/pl=pl->next;p=(node*)malloc(sizeof(node));/*創(chuàng)建一個(gè)新的列單鏈表節(jié)點(diǎn)?/p->ch=a;/?給此節(jié)點(diǎn)的數(shù)據(jù)域賦值?/if(n=l)/?插入之前,若只有一個(gè)字符在行中,則插在此節(jié)點(diǎn)之前?/{p-〉next=q->next;q->next=p;}else{pー〉next二plー〉nex

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論