學習數據結構的心得體會
數據結構學習體會及教學建議時間過的很快,一轉眼一學期的數據結構課程就已經快要告一段落了,在接觸這么課以前,我覺得編程無非就是會寫代碼就好了。
然而事實上數據結構對于程序來說,有著非常重要的地位。
隨著計算機應用領域的不斷擴大,非數值計算的問題占據了當今計算機應用的絕大部分,簡單的數據類型已經遠遠不能滿足需要,個數據元素之間的復雜關系已經不是普通數學方程式能夠表達的了,所以數據結構就扮演了十分重要的角色。
在學期初,我覺得數據結構還是比較簡單的,但可能由于之前c語言學習對指針掌握的不夠熟練,導致在數據結構中接觸到與指針有關的問題,例如線性表,堆棧,隊列,二叉樹等問題的時候,都會顯得有些吃力。
但是在不斷學習數據結構的過程中我也不斷加強了對指針的學習,現在我已經能夠基本掌握指針的相關知識并且能夠熟練運用了。
這一學期的學習下來我發現想要學好數據結構有以下幾點經驗{雖然可能我的數據結構學的并不是很好}
【第1句】:初步了解算法思想、原理想要弄清楚一個算法的實現,首先要知道這個算法的大致原理,這是最簡單的一步,也是最基礎的一步,只有明白算法想要干什么,才能弄清楚相應的代碼段是為什么
【第2句】:鉆研課本代碼段對于書上的算法代碼,我們一定要仔細鉆研每一步的具體含義和目的,在此基礎上深入的了解算法的實現過程,而不是一味的四級硬背,不僅無聊,而且效率低下。
【第3句】:查找各種算法資料例如排序算法,其實歷史上有很多不同的排序算法,書上
數據結構上機出問題了
貼出原碼你程序中可能存取了不該存取的地址,如:char *p=NULL;*p=2; \\\/\\\/<---------編譯肯定無錯,運行就掛
數據結構 上機實驗與解析
太高深了,我是學Java的給你下了點希望能用上這是youku上的視頻不過得安Flash播放器才能看線性結構的特點:在數據元素的非空有限集中,(1) 存在唯一的一個被稱作“第一個”的數據元素。
(2) 存在唯一的一個被稱作“最后一個”的數據元素。
(3) 除“第一個”之外,集合的每一個數據元素只有一個前驅。
(4) 除“最后一個”之外,集合的每一個數據元素只有一個后繼。
【第2句】:1線性表的類型定義線性表(Linear List)是最常用且最簡單的一種數據結構。
簡言之,一個線性表是n個數據元素的有限序列。
一個數據元素可以有若干個數據項(Item)組成。
在這種情況下,常把數據元素稱為記錄(Record),含有大量記錄的線性表又稱為文件(File)。
同一個線性表中的數據元素必定具有相同特性,即屬同一數據對象,相鄰數據元素之間存在著序偶關系。
若將線性表記為:(a1, …, ai-1, ai, ai+1, …, an)則表中ai-1領先于ai,ai領先于ai+1,稱ai-1是ai的直接前驅元素,ai+1是ai的直接后繼元素。
當i=1,2,…,n-1時,ai又且僅有一個直接后繼,當i=2,3,…,n時,ai又且僅有一個直接前驅。
線性表中元素的個數n(n≥0)定義為線性表的長度,n=0時稱為空表。
在非空表中的每個數據元素都有一個確定的位置,如a1是第一個數據元素,an是最后一個數據元素,ai是第i個數據元素,稱i為數據元素ai在線性表中的位序。
【第2句】:2線性表的順序表示和實現線性表的順序表示指的是用一組地址連續的存儲單元依次存儲線性表的數據元素。
假設線性表的每個元素需要占用L個存儲單元,并以所占的第一個單元的存儲地址作為數據元素的存儲位置。
則線性表中第i+1個數據元素的存儲位置LOC(ai+1)和第i個數據元素的存儲位置LOC(ai)之間滿足下列關系:LOC(ai+1)= LOC(ai)+L,一般來說,線性表的第i個數據元素ai的存儲位置為:LOC(ai)= LOC(a1)+(i-1)*L,其中LOC(a1)是線性表的第一個數據元素a1的存儲位置,通常稱作線性表的起始位置或基地址。
線性表的這種機內表示稱作線性表的順序存儲結構或順序映像(Sequential Mapping),反之,稱這種存儲結構的線性表為順序表。
線性表的順序存儲結構是一種隨機存取的存儲結構。
\\\/\\\/--------------線性表的動態分配順序存儲結構--------------\\\/\\\/#define LIST_INIT_SIZE 100 \\\/\\\/線性表存儲空間的初始分配量#define LISTINCREMENT 10 \\\/\\\/線性表存儲空間的分配增量Typedef struct{ ElemType *elem; \\\/\\\/存儲空間基址 Int length; \\\/\\\/當前長度 Int listsize; \\\/\\\/當前分配的存儲容量(以sizeof(ElemType)為單位)}SqList; 當在順序存儲結構的線性表中某個位置上插入或刪除一個數據元素時,其時間主要耗費在移動元素上(換句話說,移動元素的操作為預估算法時間復雜度的基本操作),而移動元素的個數取決于插入或刪除元素的位置。
在順序存儲結構的線性表中插入或刪除一個數據元素,平均約移動表中一半的元素。
【第2句】:3線性表的鏈式表示和實現
【第2句】:
【第3句】:1線性鏈表 線性表的鏈式存儲結構的特點是用一組任意的存儲單元存儲線性表的數據元素(這組存儲單元可以是連續的,也可以是不連續的)。
因此,為了表示每個數據元素ai與其直接后繼數據元素ai+1之間的邏輯關系,對數據元素ai來說,除了存儲其本身的信息之外,還需要存儲一個指示其直接后繼的信息(即直接后繼的存儲位置)。
這兩部分信息組成數據元素ai的存儲映像,稱為結點(Node)。
它包括兩個域:其中存儲數據元素信息的域稱為數據域;存儲直接后繼存儲位置的域稱為指針域。
指針域中存儲的信息稱作指針或者鏈。
N個結點(ai(1≤i≤n)的存儲映像)鏈結成一個鏈表,即為線性表(a1, a2, …, an)的鏈式存儲結構。
又由于此鏈表的每個結點中只包含一個指針域,故又稱為線性鏈表或者單鏈表。
這個鏈表的存取必須從頭指針開始進行,頭指針指示鏈表中第一個結點(即第一個數據元素的存儲映像)的存儲位置。
線性鏈表中最后一個結點的指針為“空”(NULL)。
用線性鏈表表示線性表時,數據元素之間的邏輯關系是由結點中的指針指示的。
換句話說,指針為數據元素之間的邏輯關系得映像,則邏輯上相鄰的兩個數據元素其存儲的物理位置不要求緊鄰,由此,這種存儲結構為非順序映像或者鏈式映像。
\\\/\\\/--------------線性表的單鏈表存儲結構--------------\\\/\\\/Typedef struct{ ElemType data; Struct LNode *next;}LNode, *LinkList; 有時候,我們在單鏈表的第一個結點之前附設一個結點,稱之為頭結點。
頭結點的數據域可以不存儲任何信息,也可以存儲如線性表的長度等類的附加信息,頭結點的指針域存儲指向第一個結點的指針(即第一個元素結點的存儲位置)。
單鏈表是非隨機存取的存儲結構。
單鏈表和順序存儲結構不同,它是一種動態結構。
\\\/\\\/--------------線性表的靜態單鏈表存儲結構--------------\\\/\\\/#define MAXSIZE 1000 \\\/\\\/鏈表的最大長度Typedef struct{ ElemType data; Int cur;}component, SLinkList[MAXSIZE]; 這種描述方法便于在不設“指針”類型的高級程序設計語言中使用鏈表結構。
在如上述的鏈表中,數據的一個分量表示一個結點,同時用游標(指示器cur)代替指針指示結點在數組中的相對位置。
為了和指針型描述的線性鏈表相區別,我們給這種用數組描述的鏈表起名靜態鏈表。
【第2句】:
【第3句】:2循環鏈表 循環鏈表(Circular Linked List)是另一種形式的鏈式存儲結構。
它的特點是表中最后一個結點的指針域指向頭結點,這個鏈表形成一個環。
循環鏈表的操作和線性表基本一致,差別僅在于算法的循環條件不是p或者p->next是否為空,而是它們是否等于頭指針。
但有的時候,若在循環鏈表中設立尾指針而不設頭指針,可使某些操作簡化。
【第2句】:
【第3句】:3雙向鏈表 在單鏈表中,NextElem的執行時間為O(1),而PriorElem的執行時間為O(n)。
為克服單鏈表這種單向性的缺點,可利用雙向鏈表(Double Linked List)。
在雙向鏈表的結點中有兩個指針域,其一指向直接后繼,另一個指向直接前驅。
\\\/\\\/--------------線性表的雙向鏈表存儲結構--------------\\\/\\\/Typedef struct{ ElemType data; Struct *prior; Struct *next;}DuLNode, *DuLinkList;\\\/\\\/--------------一個帶頭結點的線性表類型定義--------------\\\/\\\/\\\/\\\/--------------注意:不同的C++標準,其鏈表結構的定義是不同的--------------\\\/\\\/Typedef struct LNode{ ElemType data; Struct LNode *next;}*Link, *Position;Typedef struct { Link head,tail; Int len;}LinkList;
【第2句】:4一元多項式的表達和相加一般情況下的一元n次多項式可寫成: Pn(x) = 其中,pi是指數為ei的項的非零系數,且滿足 0≤ e1 < e2 < … < em = n若用一個長度為m且每個元素有兩個數據項(系數項和指數項)的線性表 ((p1, e1),(p2, e2),…,(pm, em))便可以唯一的確定多項式Pn(x)。
若只對多項式進行“求值”等不改變多項式的系數和指數的運算,則采用類似于順序表的順序存儲結構即可,否則應采用鏈式存儲表示。
有序鏈表的基本操作定義與線性鏈表有兩處不同:第一, LocateElem的職能不同第二, 增加了按有序關系進行插入的操作OrderInsertStatus LocateElem(LinkList L, ElemType e, Position &q, int (*compare)(ElemType, ElemType))\\\/\\\/若有序鏈表L中存在與e滿足判定函數compare()取值為0的元素,則q指示L中第一個\\\/\\\/值為e的結點的位置,并返回TRUE;否則q指示第一個與e滿足判定函數compare()取值>0的元素的前驅的位置,并返回FALSEStatus OrderInsert(LinkList &L, ElemType e, int (*compare)(ElemType, ElemType))\\\/\\\/按有序判定函數compare()的約定,將值為e的結點插入到有序鏈表L的適當位置上\\\/\\\/--------------多項式抽象數據類型的存儲結構定義--------------\\\/\\\/typedef struct{\\\/\\\/項的表示,多項式的項作為LinkList的數據元素 Float coef; \\\/\\\/系數 Int expn; \\\/\\\/指數}term, ElemType;\\\/\\\/兩個類型名:term用于本ADT,ElemType為LinkList的數據對象名typedef LinkList polynomial; \\\/\\\/用帶頭結點的有序鏈表表示多項式void AddPolyn(polynomial &Pa, polynomial &Pb){\\\/\\\/多項式加法:Pa = Pa + Pb,利用兩個多項式的結點構成“和多項式”。
ha = GetHead(Pa); hb = GetHead(Pb); \\\/\\\/ha和hb分別指向Pa和Pb的頭結點 qa = NextPos(ha); qb = NextPos(hb); \\\/\\\/qa和qb分別指向Pa和Pb中當前結點 while(!Empty(Pa)&&!Empty(Pb)) \\\/\\\/Pa和Pb均非空 { a = GetCurElem(qa); b = GetCurElem(qb); \\\/\\\/a和b為兩表中當前元素比較 swith(*cmp(a, b)) { case -1: \\\/\\\/多項式PA中當前結點的指數值小 ha = qa; qa = NextPos(Pa, qa); break; case 0: \\\/\\\/兩者的指數值相等 sum = a.coef + b.coef; if (sum != 0.0) \\\/\\\/修改多項式PA中當前結點的系數值 { SetCurElem(qa, sum); ha = qa; } else \\\/\\\/刪除多項式PA中當前結點 { DelFirst(ha, qa); FreeNode(qa); } DelFirst(hb, qb); FreeNode(qb); qb = NextPos(Pb, hb); qa = NextPos(Pa, ha); break; case 1: \\\/\\\/多項式PB中當前結點的指數最小 DelFirst(hb, qb); InsFirst(ha, qb); qb = NextPos(Pb, hb); break; }\\\/\\\/switch }\\\/\\\/while if (!Empty(Pb)) Append(Pa, qa); \\\/\\\/連接Pb中剩余結點 FreeNode(hb); \\\/\\\/釋放Pb的頭結點}\\\/\\\/AddPolyn
怎么樣學數據結構都講五章了,上機還不知道干什么
數據結構的確有點抽象,所以需要你從一開始對書中每一種數據結構都上機自己實驗,一般是從線性表開始的,數組就不說了,鏈表的構造,生成,翻轉等等很多操作都要自己熟練,后面講到圖和樹,都是以鏈表操作為基礎的,剛開始就要學扎實了
數據結構上機問題
這個或許對你有所幫助,詳細算法:#include
上一篇:暑假體驗生活家長感言
下一篇:數學期中檢測感言200字