⑴ 數據結構的問題 求步驟和思路
1 學習方法
因為要准備這個話題, 所以我認真的思考了我的學習方法, 但是我覺得基本上我就是上課前看看書、上課時認真聽課、 下課以後復習復習、當然還有做作業時很認真的去做。根本談不上什麼好方法, 不過我還是有一些話要送給大家。
我能行!
個人覺得這句話非常重要,不知道大家是怎樣看待數據結構這門課的, 有多少人覺得數據結構很難呢看我知道還是有一些同學這樣覺得的, 有時候我跟我的朋友講要怎樣學,講了一大堆以後, 他就向我抱怨:我以前c++都沒有學好, 數據結構更學不好了, 這哪跟哪的話啊,數據結構與c++沒有什麼關系,我想假如抱有這樣的心態, 自己就不相信自己, 那是不可能學好的, 然後那些覺得數據結構很難的同學, 我想他們應該會很看重數據結構的吧, 然後就一天到晚捧著一本數據結構, 這樣不會覺得很累嗎看而且因為覺得很難, 就容易不相信自己, 學的效率也不會很好, 個人認為數據結構很好學, 很容易學, 或許這有點妄自菲薄吧, 但是因為我覺得很容易, 當然就會覺得自己沒問題, 學得很輕松, 效果也還可以。大家都是從高考走過來的, 應該知道心態的重要性吧, 兩種不同的心態, 完全就是兩種不同的效果。 學了這么久數據結構了, 我們到底在學些什麼呢看 不知道大家有沒有想過, 那現在我們現在來歸納一下我們學習的內容吧, 其實學到現在我們也就學了幾種普通的數據結構, 象二叉樹, 樹, 圖,還有排序的問題, 前面的線性表和字元串也就是一些概念, 當然還有一個很重要的KMP演算法, 然後在每種數據結構中我們也就是學到了若干處理的演算法, 我想真正數起來也就是幾十個演算法吧。 學習數據結構也就是要掌握這幾十種演算法, 多簡單。至於如何掌握每個演算法呢, 我想就是多看看書, 重要的是能夠理解。
我能獨自完成作業!
這里我的定義和老師的不同, 老師是鼓勵大家討論的, 不過我發現還是有一些同學就是先問好別人演算法,然後再自己寫, 雖然這個不算抄襲作業, 但自己基本上沒有一個思考問題的過程, 雖然要理解演算法也會要思考很多, 但是因為沒有自己獨立的思考過程, 要自己寫程序、 寫演算法的時候根本寫不出來, 所以我想如果真的想學好數據結構的話, 最好是能夠自己思考問題, 不要剛想了一會就覺得做不出來, 然後就去問其他人。其實老師給我們的作業還是基於我們的水平的, 我絕對相信我們自己能夠獨自想出演算法, 雖有可能會比較長時間吧, 但是這樣肯定會比問其他人學到更多的東西。當然我並不是說不要問同學, 有時候就是腦筋轉不過來,一問別人就懂了, 當然問了別人不能只是我知道了這個演算法, 還應該去想如何思考才能得到這個演算法,這樣水平會提高很多。
多實驗!
這個就沒有太多理由了, 我一直覺得編程是一門熟練科學, 多編程,水平肯定會提高, 最重要的是能夠養成一種感覺,就是對程序對演算法的敏感, 為什麼那些牛人看一個演算法一下子就看懂了看而自己要看很久才能弄懂, 而且弄懂了過了一陣子又忘記了看其實這個是因為牛人們以前看的程序很多, 編得也很多, 所以他們有了那種感覺,所以我覺得大家應該多看程序, 多寫程序, 培養自己的感覺。
2 復習和考試的技巧
我想大家應該都有這樣的感覺,就是覺得自己什麼都掌握了, 但是在考試的時候就是會犯暈, 有時候一出考場就知道錯在哪個了, 然後考完以後一對答案,發現其實考得很簡單, 應該都是自己會做的, 這個就是與自己的復習和考試的技巧有關系了。
首先就是復習, 前面已經說過其實我們學的演算法也就是幾十個, 那麼我們的任務也就是理解這幾十個演算法, 復習也就是要加深你的理解。如何理解演算法, 然後理解到什麼程度呢看 是能默出整個演算法嗎看其實不是這樣的, 數據結構的考試有它的特點, 考過期中考試了, 大家應該都發現數據結構其實不要求你把整個演算法背出來, 它注重考察你的理解, 那麼怎麼考察呢看其實也就是兩種方式吧, 一種就是用實例, 就是給你一個例子, 要你用某個演算法運行出結果, 我想這個期末考試的時候仍然會有很多這樣的題目, 比如排序那塊就很好出這樣的題目,要復習這種題目我覺得很簡單,就是每個演算法都自己用例子去實踐一下, 以不變應萬變,我期中復習的時候就是這樣去做的, 而且考試之前我就覺得那個並查集的題目就很有可能會考, 於是就自己出了幾個例子,做了一下。另外一種考察方式就是演算法填空和演算法改錯, 可能有一些同學覺得這種題目很難, 其實我們首先可以確定這兩種題目肯定是與書上演算法有關系的, 只要理解了書上的演算法就可以了,有人覺得看完書以後什麼都懂了, 而且要默也默得出來, 其實不是這樣的,演算法改錯和填空主要是考察的細微處, 雖然你覺得你默得出來, 那是能夠默出演算法的主體部分, 很多細微的地方你就會很容易忽略。我想大家考過期中考以後應該都有這種感覺吧看那要怎樣解決這種問題呢看 我覺得有兩種方法, 一種就是自己去編程實現, 這種方法比較有意義,還能夠提高編程水平, 另外一種就是用實例分析演算法的每句話, 我認為這種方法是最有效的。
然後還有一種題目, 就是最後的寫演算法的題目, 我覺得這種題目還是很好解決的, 只要是能夠自己做出作業的, 基本上都會很容易做出來,這也是為什麼我前面覺得平時做作業應該自己獨立思考的原因,同時做這種題目千萬要小心, 尤其是題目簡單的時候, 那肯定會有一些小地方要考慮清楚,一不小心就會被扣掉很多分, 這樣很不值。
我覺得考試的時候沒有太多要講的, 只要復習好了, 考試的時候細心一點就可以了, 然後就是做一個題目開始就要盡量保證正確,如果覺得留在那裡等後面做完了再來檢查,這樣錯誤還是很有可能檢查不出來, 我期中考試的時候就基本上沒有檢查, 因為我做每個題目都是確保正確, 用的時間也挺多的, 然後也覺得沒有檢查的必要了。
一個學生學習數據結構的體會(轉)
讀《數據結構(C語言版)》(1)
今天開始認真讀這本清華版的數據結構,嚴蔚敏和吳偉民編著。也許你會奇怪我為什麼會選擇這本C語言描述的數據結構書,現在的數據結構不都用面向對象語言描述嗎看其實這本書不是我選的,而是我參加的機試指定的參考書。不過對於本書選用的語言,我倒有自己的看法。用C語言描述顯然有很多不便,但是在一個充斥著用OO描述數據結構的世界裡,從OO中抽身出來用C看待數據結構的思想,也許更能看清數據結構的本質。
好了,言歸正傳。在今天這第一篇文章里,我來探討一下數據結構的基本概念。作者一開篇就歸納了計算機解題的一般步驟:逗首先要從具體問題抽象出一個適當的數學模型,然後設計一個解此數學模型的演算法,最後編出程序,進行測試、調試直至得到最終解答。地我把它再進一步歸納一下,就是:抽象數學模型——設計演算法——編寫程序。這個思路非常重要,除了一些非常簡單的問題,所有的程序設計都應該遵循這三個基本步驟。我們平時寫程序常犯的錯誤是忽略第一個或第二個步驟,或者更甚者,前兩個都忽略。
在設計數學模型的過程中,實際上就引出了數據結構的概念。本書中作者給出的定義是:逗簡單來說,數據結構是一門研究非數值計算的程序設計問題中計算機的操作對象以及它們之間的關系和操作等的學科。地國內的教材為了語言上的嚴謹常常把話說得很難懂。請大家注意這句話里的這幾個關鍵詞:1)非數值計算,這說明了數據結構這門學科的應用范圍,如果你想解一個線性方程組,大概很難直接找到合適的數據結構;2)操作對象,也就是問題中的數據及其表示的形式;3)關系,即數據間的關系;4)操作,即針對數據的操作。
把以上的定義用公式寫出來,就是
Data_Structure = (D, S)
其中D是數據元素的有限集,S是D上關系的有限集。所以在設計數據結構時,首要的任務就是找出要操作的數據,其次是挖掘出數據間的關系。這兩步完成以後,數據的邏輯結構就定下來了。其中數據間的結構有以下幾種:
集合,這和數學中的集合概念是一致的;
線性結構,即數據元素之間一對一的關系;
樹形結構,即數據元素之間一對多的關系;
圖狀結構或網狀結構,即數據元素之間多對多的關系。
然而只有邏輯結構是不夠的,程序要能夠運行,必須把數據的邏輯結構在計算機中表示出來,也就是設計物理結構。大多數高級語言都對數據的物理結構有較好支持,如各種數據類型。作者在解釋數據類型的概念時說到:逗引入數據類型的目的,從硬體的角度看,是作為解釋計算機內存中信息含義的一種手段,而對使用數據類型的用戶來說,實現了信息的隱蔽,即將一切用戶不必了解的細節都封裝在類型中。地這個概括非常精闢,從中可以看出以後的OOP只是在更高層次上對信息的封裝和隱蔽。
對數據類型進一步擴展,作者引出了抽象數據類型的概念。抽象數據類型(ADT)是指一個數學模型以及定義在該模型上的一組操作。在引入抽象數據類型後,使邏輯結構更加獨立,從而讓程序員可以更加專注於邏輯結構的設計。把抽象數據類型用公式表示出來,就是(D, S, P),其中D是數據對象,S是D上的關系集,P是對D的基本操作集。如果計算機解題一定要遵循一個通用的模式的話,上面這個式子就給出了答案。
讀《數據結構(C語言版)》(2)
本節談一談演算法分析和大O估演算法(big-O notation)。演算法效率的度量一般採用事前分析估算的方法,通常的做法是,逗從演算法中選取一種對於所研究的問題(或演算法類型)來說是基本操作的原操作,以該基本操作重復執行的次數作為演算法的時間量度地。談到這里時,作者引出了大O估演算法。
在本書中,作者對大O估演算法的介紹顯得有些草率。一開始就冒出一個式子T(n) = O(n3),然後在本頁最底下用小字介紹了所謂的逗"O"的形式定義地:若f(n)是正整數n的一個函數,則xn=O(f(n))表示存在一個正的常數M,使得當n≥n0時都滿足|xn|≤M|f(n)|。也許是我數學基礎太差,總之看到這個定義時我一頭霧水。不知道為什麼作者沒有花一點篇幅介紹大O估演算法的由來和定義。我google了一下,發現了這樣的介紹:
Definition: A theoretical measure of the execution of an algorithm, usually the time or memory needed, given the problem size n, which is usually the number of items. Informally, saying some equation f(n) = O(g(n)) means it is less than some constant multiple of g(n). The notation is read, "f of n is big oh of g of n".
Formal Definition: f(n) = O(g(n)) means there are positive constants c and k, such that 0 ≤ f(n) ≤ cg(n) for all n ≥ k. The values of c and k must be fixed for the function f and must not depend on n.
Note: As an example, n2 + 3n + 4 is O(n2), since n2 + 3n + 4 < 2n2 for all n > 10. Strictly speaking, 3n + 4 is O(n2), too, but big-O notation is often misused to mean equal to rather than less than. The notion of "equal to" is expressed by Θ(n).
The importance of this measure can be seen in trying to decide whether an algorithm is adequate, but may just need a better implementation, or the algorithm will always be too slow on a big enough input. For instance, quicksort, which is O(n log n) on average, running on a small desktop computer can beat bubble sort, which is O(n2), running on a supercomputer if there are a lot of numbers to sort. To sort 1,000,000 numbers, the quicksort takes 20,000,000 steps on average, while the bubble sort takes 1,000,000,000,000 steps!
Any measure of execution must implicitly or explicitly refer to some computation model. Usually this is some notion of the limiting factor. For one problem or machine, the number of floating point multiplications may be the limiting factor, while for another, it may be the number of messages passed across a network. Other measures which may be important are compares, item moves, disk accesses, memory used, or elapsed ("wall clock") time.
(以上介紹來自:Paul E. Black, "big-O notation", from Dictionary of Algorithms and Data Structures, Paul E. Black, ed., NIST.)
另外,這個帖子也討論了演算法的時間復雜度估計,說得非常通俗易懂。
讀《數據結構(C語言版)》(3)
【問題描述】
設計一個可進行復數運算的演示程序。
【基本要求】
實現下列六種基本運算:
由輸入的實部和虛部生成一個復數;
兩個復數求和;
兩個復數求差;
兩個復數求積;
從已知復數中分離出實部;
從已知復數中分離出虛部。
運算結果以相應的復數或實數的表示形式顯示。
(全文見附件)
⑵ 數據結構與演算法分析
本文出自:
www點54manong點com
請尊重原創,轉載請註明出處,謝謝!
什麼是數據結構,為什麼要學習數據結構?數據結構是否是一門純數學課程?它在專業課程體系中起什麼樣的作用?我們要怎麼才能學好數據結構?… 相信同學們在剛開始《數據結構》這門課的學習時,心裡有著類似前面幾個問題的這樣那樣的疑問。希望下面的內容能幫助大家消除疑惑,下定決心堅持學好這門課:
1 學習數據數據結構的意義
數據結構是計算機科學與技術專業、計算機信息管理與應用專業,電子商務等專業的基礎課,是十分重要的核心課程。所有的計算機系統軟體和應用軟體都要用到各種類型的數據結構。因此,要想更好地運用計算機來解決實際問題,僅掌握幾種計算機程序設計語言是難以應付當前眾多復雜的課題。要想有效地使用計算機、充分發揮計算機的性能,還必須學習和掌握好數據結構的有關知識。打好「數據結構」這門課程的扎實基礎,對於學習計算機專業的其他課程,如操作系統、資料庫管理系統、軟體工程、編譯原理、人工智慧、圖視學等都是十分有益的。
2 為什麼要學習數據結構
在計算機發展的初期,人們使用計算機的目的主要是處理數值計算問題。當我們使用計算機來解決一個具體問題時,一般需要經過下列幾個步驟:首先要從該具體問題抽象出一個適當的數學模型,然後設計或選擇一個解此數學模型的演算法,最後編出程序進行調試、測試,直至得到最終的解答。例如,求解梁架結構中應力的數學模型的線性方程組,可以使用迭代演算法來求解。
由於當時所涉及的運算對象是簡單的整型、實型或布爾類型數據,所以程序設計者的主要精力是集中於程序設計的技巧上,而無須重視數據結構。隨著計算機應用領域的擴大和軟、硬體的發展,非數值計算問題越來越顯得重要。據統計,當今處理非數值計算性問題佔用了85%以上的機器時間。這類問題涉及到的數據結構更為復雜,數據元素之間的相互關系一般無法用數學方程式加以描述。因此,解決這類問題的關鍵不再是數學分析和計算方法,而是要設計出合適的數據結構,才能有效地解決問題。下面所列舉的就是屬於這一類的具體問題。
例1:圖書館信息檢索系統。當我們根據書名查找某本書有關情況的時候;或者根據作者或某個出版社查找有關書籍的時候,或根據書刊號查找作者和出版社等有關情況的時候,只要我們建立了相關的數據結構,按照某種演算法編寫了相關程序,就可以實現計算機自動檢索。由此,可以在圖書館信息檢索系統中建立一張按書刊號順序排列的圖書信息表和分別按作者、書名、出版社順序排列的索引表,如圖1.1所示。由這四張表構成的文件便是圖書信息檢索的數學模型,計算機的主要操作便是按照某個特定要求(如給定書名)對圖書館藏書信息文件進行查詢。
諸如此類的還有學生信息查詢系統、商場商品管理系統、倉庫物資管理系統等。在這類文檔管理的數學模型中,計算機處理的對象之間通常存在著的是一種簡單的線性關系,這類數學模型可稱為線性的數據結構。
例2:八皇後問題。在八皇後問題中,處理過程不是根據某種確定的計演算法則,而是利用試探和回溯的探索技術求解。為了求得合理布局,在計算機中要存儲布局的當前狀態。從最初的布局狀態開始,一步步地進行試探,每試探一步形成一個新的狀態,整個試探過程形成了一棵隱含的狀態樹。如圖1.2所示(為了描述方便,將八皇後問題簡化為四皇後問題)。回溯法求解過程實質上就是一個遍歷狀態樹的過程。在這個問題中所出現的樹也是一種數據結構,它可以應用在許多非數值計算的問題中。
例3:教學計劃編排問題。一個教學計劃包含許多課程,在教學計劃包含的許多課程之間,有些必須按規定的先後次序進行,有些則沒有次序要求。即有些課程之間有先修和後續的關系,有些課程可以任意安排次序。這種各個課程之間的次序關系可用一個稱作圖的數據結構來表示,如圖1.3所示。有向圖中的每個頂點表示一門課程,如果從頂點vi到vj之間存在有向邊<vi,vj>,則表示課程i必須先於課程j進行。由以上三個例子可見,描述這類非數值計算問題的數學模型不再是數學方程,而是諸如線性表、樹、圖之類的數據結構。因此,可以說數據結構課程主要是研究非數值計算的程序設計問題中所出現的計算機操作對象以及它們之間的關系和操作的學科。
學習數據結構的目的是為了了解計算機處理對象的特性,將實際問題中所涉及的處理對象在計算機中表示出來並對它們進行處理。與此同時,通過演算法訓練來提高學生的思維能力,通過程序設計的技能訓練來促進學生的綜合應用能力和專業素質的提高。
3數據結構課程的內容
數據結構與數學、計算機硬體和軟體有十分密切的關系,它是介於數學、計算機硬體和計算機軟體之間的一門計算機專業的核心課程,是高級程序設計語言、操作系統、編譯原理、資料庫、人工智慧、圖視學等課程的基礎。同時,數據結構技術也廣泛應用於信息科學、系統工程、應用數學以及各種工程技術領域。
數據結構課程重在討論軟體開發過程中的方案設計階段、同時設計編碼和分析階段的若干基本問題。此外,為了構造出好的數據結構及其實現,還需考慮數據結構及其實現的評價與選擇。因此,數據結構的內容包括三個層次的五個「要素」,如圖1.3所示。
數據結構的核心技術是分解與抽象。通過分解可以劃分出數據的三個層次;再通過抽象,舍棄數據元素的具體內容,就得到邏輯結構。類似地,通過分解將處理要求劃分成各種功能,再通過抽象舍棄實現細節,就得到運算的定義。上述兩個方面的結合使我們將問題變換為數據結構。這是一個從具體(即具體問題)到抽象(即數據結構)的過程。然後,通過增加對實現細節的考慮進一步得到存儲結構和實現運算,從而完成設計任務。這是一個從抽象(即數據結構)到具體(即具體實現)的過程。熟練地掌握這兩個過程是數據結構課程在專業技能培養方面的基本目標。
結束語:數據結構作為一門獨立的課程在國外是從1968年才開始的,但在此之前其有關內容已散見於編譯原理及操作系統之中。20世紀60年代中期,美國的一些大學開始設立有關課程,但當時的課程名稱並不叫數據結構。1968年美國唐.歐.克努特教授開創了數據結構的最初體系,他所著的《計算機程序設計技巧》第一卷《基本演算法》是第一本較系統地闡述數據的邏輯結構和存儲結構及其操作的著作。從20世紀60年代末到70年代初,出現了大型程序,軟體也相對獨立,結構程序設計成為程序設計方法學的主要內容,人們越來越重視數據結構。從70年代中期到80年代,各種版本的數據結構著作相繼出現。目前,數據結構的發展並未終結,一方面,面向各專門領域中特殊問題的數據結構得到研究和發展,如多維圖形數據結構等;另一方面,從抽象數據類型和面向對象的觀點來討論數據結構已成為一種新的趨勢,越來越被人們所重視。
⑶ 幾個數據結構的題目,成績分析問題。謝謝
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedefstructstudent{
unsignednum;//學號
charname[20];
doublescore[5];//[0]:數學,[1]:英語,[2]:計算機,[3]:平均成績,[4]:總成績
structstudent*next;
}*LinkList,*pNode,Node;
LinkListgetEmptyList(){
LinkListhead=(pNode)malloc(sizeof(Node));
head->num=0;
head->name[0]=0;
head->next=0;
returnhead;
}
intinsertNode(LinkListhead,Nodenode){
pNodep=head;
pNodenewnode=(pNode)malloc(sizeof(Node));
*newnode=node;
while(p->next){
if(p->next->num==node.num){
printf("重復的學號:%u,操作失敗! ",node.num);
free(newnode);
return0;
}
if(p->next->num>node.num){
newnode->next=p->next;
p->next=newnode;
return1;
}
elsep=p->next;
}
p->next=newnode;
newnode->next=0;
return1;
}
intmysort(LinkListhead,intindex){
pNodep,pt,q,qt;
if(index<0||index>4){
printf("0:按數學成績排序。 ");
printf("1:按英語成績排序。 ");
printf("2:按計算機成績排序。 ");
printf("3:按平均成績排序。 ");
printf("4:按總成績排序。 ");
return0;
}
for(p=head;p->next;p=p->next){
qt=p;
q=p->next;
while(q->next){
if(qt->next->score[index]<q->next->score[index])
qt=q;
q=q->next;
}
if(p!=qt){
pt=p->next;
p->next=qt->next;
qt->next=p->next->next;
p->next->next=pt;
}
}
return1;
}
voidshow(LinkListhead){
inti;
pNodep=head->next;
while(p){
printf("%u ",p->num);
printf("%s ",p->name);
for(i=0;i<5;++i)
printf("%.2lf ",p->score[i]);
printf(" ");
p=p->next;
}
}
intstatist(LinkListhead,intindex){
intscore0_59=0,score60_69=0;
intscore70_79=0,score80_89=0;
intscore90_100=0,n=0;
doublet,max=0,min=100,total=0;
pNodep=head->next;
if(index<0||index>3){
printf("0:統計數學成績。 ");
printf("1:統計英語成績。 ");
printf("2:統計計算機成績。 ");
printf("3:統計平均成績。 ");
return0;
}
while(p){
t=p->score[index];
if(t>=90)++score90_100;
elseif(t>=80)++score80_89;
elseif(t>=70)++score70_79;
elseif(t>=60)++score60_69;
else++score0_59;
if(t>max)max=t;
if(t<min)min=t;
total+=t;
++n;
p=p->next;
}
if(score0_59)printf("0--59:%d ",score0_59);
if(score60_69)printf("60--69:%d ",score60_69);
if(score70_79)printf("70--79:%d ",score70_79);
if(score80_89)printf("80--89:%d ",score80_89);
if(score90_100)printf("90--100:%d ",score90_100);
if(n)printf("平均成績:%.2lf ",total/n);
return1;
}
voidreadFile(LinkListhead,charfilename[]){
inti;
Nodenode;
FILE*infp=fopen(filename,"rt");
if(infp==NULL){
printf("打開文件%s時失敗! ",filename);
return;
}
while(fscanf(infp,"%u%s%",&node.num,node.name)==2){
node.score[4]=0;
for(i=0;i<3;++i){
fscanf(infp,"%lf",&node.score[i]);
node.score[4]+=node.score[i];
}
node.score[3]=node.score[4]/3;
insertNode(head,node);
}
fflush(infp);
fclose(infp);
}
voidwriteFile(LinkListhead,charfilename[]){
inti;
pNodep=head->next;
FILE*outfp=fopen(filename,"wt");
if(outfp==NULL){
printf("打開文件%s時失敗! ",filename);
return;
}
while(p){
fprintf(outfp,"%u%s",p->num,p->name);
for(i=0;i<5;++i)
fprintf(outfp,".2lf",p->score[i]);
fprintf(outfp," ");
p=p->next;
}
fclose(outfp);
}
voidinputData(LinkListhead){
inti;
Nodenode;
printf("學號姓名英語數學計算機: ");
scanf("%u%s",&node.num,node.name);
node.score[4]=0;
for(i=0;i<3;++i){
scanf("%lf",&node.score[i]);
node.score[4]+=node.score[i];
}
node.score[3]=node.score[4]/3;
insertNode(head,node);
}
intmain(){
charinFilename[]="input.dat";
charoutFile[][60]={"outFileMath.dat","outFileEnglish.dat",
"outFileComputer.dat","outFileAverage.dat","outFileTotal.dat"};
charcommand[20];
intop,index,save;
LinkListhead=getEmptyList();
do{
printf("********************************* ");
printf("*考試成績分析系統* ");
printf("********************************* ");
printf("*1、輸入信息* ");
printf("*2、顯示信息* ");
printf("*3、按課程成績排序* ");
printf("*4、信息分析* ");
printf("*5、讀數據文件* ");
printf("** ");
printf("*0、推出分析系統* ");
printf("********************************* ");
printf(" 請選擇:");
fgets(command,20,stdin);
fflush(stdin);
op=command[0]-'0';
switch(op){
case1:inputData(head);break;
case2:show(head);break;
case3:
printf("0:按數學成績排序 ");
printf("1:按英語成績排序 ");
printf("2:按計算機成績排序 ");
printf("3:按平均成績排序 ");
printf("4:按總成績排序 ");
printf(" 請輸入相應編號:");
scanf("%d",&index);
fflush(stdin);
mysort(head,index);
printf("排序完畢,存檔否(1存,0不存):");
scanf("%d",&save);
fflush(stdin);
if(save==1)writeFile(head,outFile[index]);
break;
case4:
printf("0:數學成績分析 ");
printf("1:英語成績分析 ");
printf("2:計算機成績分析 ");
printf("3:平均成績分析 ");
printf("請輸入相應編號:");
scanf("%d",&index);
fflush(stdin);
mysort(head,index);
statist(head,index);
break;
case5:readFile(head,inFilename);break;
case0:break;
default:printf("錯誤的選擇。 ");break;
}
}while(op);
printf("END!!!! ");
return0;
}
⑷ 計算機考研:數據結構常用演算法解析(2)
數據結構是計算機考研408計算機學科專業基礎綜合的重要組成部分,考生需要認真復習,尤其是對於數據結構中一些常用的演算法問題,考生一定要弄懂弄會,理解的去掌握。獵考考研就帶大家一一梳理這些知識點。
第二章
循環鏈表是一種首尾相接的鏈表。也就是終端結點的指針域不是指向NULL空而是指向開始結點(也可設置一個頭結點),形成一個環。採用循環鏈表在實用中多採用尾指針表示單循環鏈表。這樣做的好處是查找頭指針和尾指針的時間都是O(1),不用遍歷整個鏈表了。
判別鏈表終止的條件也不同於單鏈表,它是以指針是否等於某一指定指針如頭指針或尾指針來確定。
何時選用順序表、何時選用鏈表作為線性表的存儲結構為宜?
答:
在實際應用中,應根據具體問題的要求和性質來選擇順序表或鏈表作為線性表的存儲結構,通常有以下幾方面的考慮:
1.基於空間的考慮。當要求存儲的線性表長度變化不大,易於事先確定其大小時,為了節約存儲空間,宜採用順序表;反之,當線性表長度變化大,難以估計其存儲規模時,採用動態鏈表作為存儲結構為好。
2.基於時間的考慮。若線性表的操作主要是進行查找,很少做插入和刪除操作時,採用順序表做存儲結構為宜;反之, 若需要對線性表進行頻繁地插入或刪除等的操作時,宜採用鏈表做存儲結構。並且,若鏈表的插入和刪除主要發生在表的首尾兩端,則採用尾指針表示的單循環鏈表為宜。
第2章節有關數據結構演算法,上文中為大家作了分析,希望考生對於這些演算法能夠熟記於心,方便考試的應用和日後的實際操作,預祝大家都能夠取得好成績,加油!
更多詳情請點擊:計算機考研:數據結構常用演算法解析匯總
考研有疑問、不知道如何總結考研考點內容、不清楚考研報名當地政策,點擊底部咨詢官網,免費領取復習資料:https://www.87dh.com/xl/
⑸ 數據結構課程設計--學生成績管理系統C語言
一、需求分析
1. 系統菜單的主要功能
(1)輸入若干條記錄
(2)查找並修改記錄
(3)查找並刪除記錄
(4)成績排序
(5)查找並顯示一條記錄
(6)將數據載入內存中
(7)將所有數據寫入文件中
(0)退出程序
2. 功能分析
功能1為輸入一條記錄到結構體中去。
功能2、3和5演算法相似,都是先查找成績,2、3在此基礎上再對查找出的信息進行操作。因為學生姓名定義成了字元數組的形式,因此在運用選擇法進行排序的時候,要用到strcmp,strcpy等函數
功能4為成績排序,可按學生學號排序或某單科成績或總分排序,並輸出相關的學生信息等。
功能6和7是對文件的操作,提前准備好數據。
二、總體設計
「學生成績管理系統」包括:成績錄入、修改、刪除、成績統計和信息保存、載入這幾個模塊。
1、 主函數 main()
利用無限次循環while(1)和swithch()實現各函數的調用,系統根據輸入的數字選項來調用相應的函數。
2、 菜單選擇函數showmenu ();
這是一個無參函數,主要實現「功能選擇」的界面,在這個界面里有顯示系統的各項功能選單,根據每個功能前面的序號進行選擇。等執行完每一個函數功能後,按任一鍵回到主界面也要通過這個函數來實現!3、 輸入記錄函數addstudent (stu *s) 這是一個帶參函數,用來執行第學生成績記錄的輸入,當學生為0時停止輸入。
演算法:利用函數參數s,並將s->next設為NULL。每輸入一個數據就聲明一個新節點p,把p->next設為NULL,並且鏈接到之前列表的尾端。4、 顯示記錄函數showstudent (stu *s) 這是一個不返回值的有參函數,形參為「鏈表頭的指針」,負責對全部學生成績記錄的輸出,不足之處就是不能對學生成績進行分頁顯示。 演算法:先將p結點的指針指向第一個結點,將p結點(即第一個結點)的數據輸出。然後再將p結點的指針指向p指針的的指針(即下一結點),將p結點(即第一結點)的數據輸出。重復執行此步聚直到p指針指向NULL為止。5、 查找記錄函數findstudent (stu *s) 這是一個不返回值的有參函數,形參為「鏈表頭的指針」,實現按學號對某個學生進行查找,並顯示所查找到的記錄。 演算法:採用線性查找法往下一個節點查找。輸入所要查找的學生的學號s,設一個指針變數p,先指向第一個結點,當strcmp(p->name,s) && p != NULL時,使p後移一個結點,如果p!=NULL,輸出p所指的結點。6、 刪除記錄函數delstudent (stu *s) 這是一個有參函數,形參為「鏈表頭的指針」,先輸入要刪除的學生記錄的學號,找到後顯示該學生信息,等確認後便可按「Y」進行刪除。 演算法:從p指向的第一個結點開始,檢查該結點中的num值是否等於輸入的要求刪除的那個學號。如果相等就將該結點刪除,如不相等,就將p後移一個結點,再如此進行下去,直到遇到表尾為止。7、保存數據到文件函數savestudent (stu *s) 這是一個不返回值的有參函數,形參為「鏈表頭的指針」,可以把學生記錄保存在電腦上由自己任意命名的二進制文件。8、從文件讀數據函數loadstudent (stu *s) 這是一個不返回值的有參函數,形參為「鏈表頭的指針」,根據輸入的文件地址進行讀取。
三、程序流程圖
1)成績統計:
2)信息錄入:
3)信息修改:
4)信息刪除:
4)信息查詢:
4)信息保存:5)主函數:
四、程序調試及體會
1)程序演示:
2)程序調試:
(1)剛開始沒有那個初始化函數,程序運行後,沒有輸入任何數據就試得去執行顯示功能,結果顯示的是一些亂碼!加入初始化函數後,這種現象也隨之消失。
(2)剛開始執行輸入函數,按學號順序輸入十個學生的成績,輸完後執行顯示功能,學生成績記錄是按學號的反順序顯示的,試著在其中增加一些語句,希望能把學號按正常順序顯示,但暫時沒有成功,所以在輸入成績時只能按學號反順序輸入,最後就按學號正常順序輸出了。
(3)剛開始時,先把成績按平均分排序,再插入一個學生的成績,執行顯示功能,雖然插入的學生的成績能正常插入,但該學生的名次為0。後來,在插入成績之後,調用排序函數,把所有成績重新排序一次。
(4)在輸入函數中設了一個無限循環,可以輸入無數個學生的成績信息,當學號為0的時候則停止輸入。
(5)輸入太多個學生的成績時,屏幕顯示不能控制為一頁一頁顯示,所以為了方便起見,不要輸入太多記錄,十七左右為最佳。
(6)在沒有輸入任何信息的情況下,去執行排序功能,最後顯示有一個記錄,學號、姓名為空白,成績都為0,名次為1。
(7)在輸入選項時不能輸入字母,否則會死循環,建議不要亂輸字母。
3)心得體會:
經過一個星期的課程設計,感覺自己收獲不少!
首先是:鏈表是數據結構的基本體現,所以這個課程設計裡面主要都是用鏈表,而已要達到這樣的功能,使用鏈表相當方便,但不容易理解,所以在這方面我很了很多的時間看課本和參考課外書,使C語言的知識強化了不少。
其次,在做課程設計的過程中,發現了平時很多沒有注意到的問題,例如:返回值函數和不返回值函數兩者在主函數中的調用是不同的…………
更重要的是,這次課程設計雖然花了我不少時間,但正是這些時間,讓我見識到了要學好C語言,數據的處理是相當重要的。這個學生成績管理系統都是在自己知識范圍內完成的,所以界面清晰簡單,可能不是很好看,但絕對實用!
從這里我也得到一個體會,做一個程序,或者開發一個軟體,應該著重從它的後台製作入手,不能做出一個中看不中用的程序或者軟體。
相信這次的課程設計為我以後繼續從事計算機工作打了一個小小的開頭。
參考書目;
[1]譚浩強. C程序設計(第三版) . 北京:清華大學出版社, 2006
[2]譚浩強. C程序設計上機指導(第三版) . 北京:清華大學出版社, 2005
[3]嚴蔚敏、吳偉民. 數據結構(C語言版) . 北京:清華大學出版社, 2006
計算機科學與技術系課程設計評分表