數(shù)據(jù)結(jié)構(gòu)入門-零C基礎(chǔ)者適用(ZZ)
查看(1483) 回復(fù)(1) |
|
lyh2006
|
發(fā)表于 2010-08-13 23:09
樓主
很多朋友抱怨說嚴(yán)蔚敏的書很難,復(fù)習(xí)效果不理想。我現(xiàn)在一面在講大家要耐心,要多查多問,而轉(zhuǎn)過頭來看到那些符號,想起自己當(dāng)初C語言60分的成績,初學(xué)數(shù)據(jù)結(jié)構(gòu)的茫然,一步一步爬過來的辛苦,于是有了寫個數(shù)據(jù)結(jié)構(gòu)入門的想法,但愿對剛剛?cè)腴TC語言基礎(chǔ)不好和大跨考的朋友們有所幫助,數(shù)據(jù)結(jié)構(gòu)復(fù)習(xí)已經(jīng)進(jìn)入正常軌道的朋友可以飄過。
我重新審視嚴(yán)書,概念與文字描述的內(nèi)容都是易懂的,而算法與程序往往是卡住我們的地方。我試著解釋每個符號的含義,C語言的基礎(chǔ)知識點(diǎn),圖論中的難點(diǎn),等等。但應(yīng)該很少會涉及概念性的知識點(diǎn)。 本節(jié)主要講了結(jié)構(gòu)體定義的N種不同寫法,類型定義符typdef的用法,引用機(jī)制。 P9頁例1-6 在C語言中,最簡單的結(jié)構(gòu)體是這樣的: 復(fù)制內(nèi)容到剪貼板 代碼: struct ADT { int x,y; }; 其中ADT是結(jié)構(gòu)的名稱,x和y是結(jié)構(gòu)體的數(shù)據(jù)成員,注意{}后面的分號,這個是不能忘掉的。 現(xiàn)在添加一個成員函數(shù)(這實(shí)際上是C++的內(nèi)容),即數(shù)據(jù)結(jié)構(gòu)中所謂的基本操作,如下: 復(fù)制內(nèi)容到剪貼板 代碼: struct ADT { int x,y; void x_dayu_y() { if(x>y) printf("x>y "); else printf("x<=y "); }; }; 關(guān)于函數(shù)和if..else…語句的知識請參閱C語言課本,這個不用解釋的吧。下面給出完整的程序,來描述這個結(jié)構(gòu)是如何被使用的。當(dāng)我說到“完整的程序”的時候,你完全可以在VC++6.0上來運(yùn)行它。 復(fù)制內(nèi)容到剪貼板 代碼: #include<stdio.h> struct ADT { int x,y; void x_dayu_y() { if(x>y) printf("x>y "); else printf("x<=y "); }; }; int main() { int a; a=1; ADT adt; // 定義一個結(jié)構(gòu)體變量,請區(qū)別:結(jié)構(gòu)體變量adt的類型是結(jié)構(gòu)體ADT adt.x=1; // 賦值 adt.y=2; adt.x_dayu_y(); // 基本操作 return 0; } 結(jié)構(gòu)體的知識暫時介紹這些,對于理解例1-6的結(jié)構(gòu)已經(jīng)夠用了。 在此強(qiáng)調(diào)一點(diǎn),嚴(yán)書上的程序都是偽代碼描述,完全COPY到程序里是肯定不能執(zhí)行的。 復(fù)制內(nèi)容到剪貼板 代碼: ADT Triplet { InitTriplet(&T,v1,v2,v3) …… }ADT Triplet ADT Triplet可以理解為結(jié)構(gòu)體名稱,ADT即為書中前文提到的Abstract Data Type,而Triplet即為三元組,函數(shù)InitTriplet(&T,v1,v2,v3),此外偽代碼并未指明返回值,需要解釋一下的是符號&的含義,&在C++中表示引用,完整的程序如下: 復(fù)制內(nèi)容到剪貼板 代碼: #include<stdio.h> void f(int &a,int b) { a=100; b=100; } int main() { int a=1,b=1; f(a,b); printf("%d %d ",a,b); return 0; } |
lyh2006
|
發(fā)表于 2010-08-13 23:10
沙發(fā)
實(shí)際上函數(shù)f執(zhí)行后,a=100,b=1,這就是引用符&的作用。實(shí)際上,在C語言中,&是地址符,C中的地址與指針的傳遞過程過于復(fù)雜,不作解釋以免添亂,而這也正是C++中引入引用機(jī)制的原因。 實(shí)際上這個例題很簡單,選擇它只是為了引出結(jié)構(gòu)體和引用機(jī)制的知識點(diǎn),如果還有需要解釋的地方,請告訴我! P10頁(1)—(11) (1) 復(fù)制內(nèi)容到剪貼板 代碼: #define TRUE 1 命令define的詳細(xì)作用請參閱C語言課本,此處只作簡單說明: #define TRUE 1的效果是,在預(yù)編譯的時候,程序中所有的“TRUE”都被機(jī)械的替換為1,1代表真值。(在控制臺程序中TRUE不被支持,而在windows編程中TRUE與true等同。) 類型定義符typedef,詳細(xì)請參閱C語言課本。 復(fù)制內(nèi)容到剪貼板 代碼: typedef int Status; 定義一個變量時,Status a;與int a;的效果是相同的,類型定義符typedef只是為了使用上的方便,在windows編程中你會見到大量的類型定義。 下面請注意了,講到數(shù)據(jù)結(jié)構(gòu)嚴(yán)書中經(jīng)常會見到的結(jié)構(gòu)體定義方法。 如下面這個使用了類型定義符的結(jié)構(gòu)體定義: 復(fù)制內(nèi)容到剪貼板 代碼: typedef struct node { int x,y; }Point,*lPoint; 其核心實(shí)際上就是前面已經(jīng)講過的 復(fù)制內(nèi)容到剪貼板 代碼: struct node { int x,y; }; 只不過把名稱ADT換成了node。 這里typedef的作用: 將類型struct node{}重定義為Point; 將類型struct node {}*重定義為lPoint;(typedef struct node{}* lPoint 注意此處Point與lPoint的名稱不能相同,前者是結(jié)構(gòu)體名稱,后者是結(jié)構(gòu)體指針名稱。 在此處,可以省略struct后面的結(jié)構(gòu)體名稱node,寫成如下形式: 復(fù)制內(nèi)容到剪貼板 代碼: struct { int x,y; }; 下面是完整的程序,來描述結(jié)構(gòu)體是如何被使用的。 復(fù)制內(nèi)容到剪貼板 代碼: #include<stdio.h> #include<stdlib.h> typedef struct { int x,y; }Point,*lPoint; int main() { Point a; a.x=1; // e使用結(jié)構(gòu)體變量時用的是“.” a.y=1; lPoint b; // 定義結(jié)構(gòu)體指針 b=(lPoint)malloc(sizeof(Point)); // 要給指針分配內(nèi)存 b->x=1; // 使用指針時用的是“->” b->y=1; Point* c; // 與上面定義結(jié)構(gòu)體指針是一回事,寫法不一樣而已 c=(Point*)malloc(sizeof(Point)); c->x=1; c->y=1; return 0; } 書中還會看到: 復(fù)制內(nèi)容到剪貼板 代碼: typedef struct node { int x,y; struct node* next; }Point,*lPoint; 這里的node不能省略,其余不再做過多的解釋。有關(guān)指針與內(nèi)存分配的知識點(diǎn),將在以后章節(jié)中講到。 嚴(yán)書從(2)到(11)是把C語言的知識簡單帶過 |
lyh2006
|
發(fā)表于 2010-08-13 23:10
3樓
實(shí)際上函數(shù)f執(zhí)行后,a=100,b=1,這就是引用符&的作用。實(shí)際上,在C語言中,&是地址符,C中的地址與指針的傳遞過程過于復(fù)雜,不作解釋以免添亂,而這也正是C++中引入引用機(jī)制的原因。 實(shí)際上這個例題很簡單,選擇它只是為了引出結(jié)構(gòu)體和引用機(jī)制的知識點(diǎn),如果還有需要解釋的地方,請告訴我! P10頁(1)—(11) (1) 復(fù)制內(nèi)容到剪貼板 代碼: #define TRUE 1 命令define的詳細(xì)作用請參閱C語言課本,此處只作簡單說明: #define TRUE 1的效果是,在預(yù)編譯的時候,程序中所有的“TRUE”都被機(jī)械的替換為1,1代表真值。(在控制臺程序中TRUE不被支持,而在windows編程中TRUE與true等同。) 類型定義符typedef,詳細(xì)請參閱C語言課本。 復(fù)制內(nèi)容到剪貼板 代碼: typedef int Status; 定義一個變量時,Status a;與int a;的效果是相同的,類型定義符typedef只是為了使用上的方便,在windows編程中你會見到大量的類型定義。 下面請注意了,講到數(shù)據(jù)結(jié)構(gòu)嚴(yán)書中經(jīng)常會見到的結(jié)構(gòu)體定義方法。 如下面這個使用了類型定義符的結(jié)構(gòu)體定義: 復(fù)制內(nèi)容到剪貼板 代碼: typedef struct node { int x,y; }Point,*lPoint; 其核心實(shí)際上就是前面已經(jīng)講過的 復(fù)制內(nèi)容到剪貼板 代碼: struct node { int x,y; }; 只不過把名稱ADT換成了node。 這里typedef的作用: 將類型struct node{}重定義為Point; 將類型struct node {}*重定義為lPoint;(typedef struct node{}* lPoint 注意此處Point與lPoint的名稱不能相同,前者是結(jié)構(gòu)體名稱,后者是結(jié)構(gòu)體指針名稱。 在此處,可以省略struct后面的結(jié)構(gòu)體名稱node,寫成如下形式: 復(fù)制內(nèi)容到剪貼板 代碼: struct { int x,y; }; 下面是完整的程序,來描述結(jié)構(gòu)體是如何被使用的。 復(fù)制內(nèi)容到剪貼板 代碼: #include<stdio.h> #include<stdlib.h> typedef struct { int x,y; }Point,*lPoint; int main() { Point a; a.x=1; // e使用結(jié)構(gòu)體變量時用的是“.” a.y=1; lPoint b; // 定義結(jié)構(gòu)體指針 b=(lPoint)malloc(sizeof(Point)); // 要給指針分配內(nèi)存 b->x=1; // 使用指針時用的是“->” b->y=1; Point* c; // 與上面定義結(jié)構(gòu)體指針是一回事,寫法不一樣而已 c=(Point*)malloc(sizeof(Point)); c->x=1; c->y=1; return 0; } 書中還會看到: 復(fù)制內(nèi)容到剪貼板 代碼: typedef struct node { int x,y; struct node* next; }Point,*lPoint; 這里的node不能省略,其余不再做過多的解釋。有關(guān)指針與內(nèi)存分配的知識點(diǎn),將在以后章節(jié)中講到。 嚴(yán)書從(2)到(11)是把C語言的知識簡單帶過 |
lyh2006
|
發(fā)表于 2010-08-13 23:10
4樓
實(shí)際上函數(shù)f執(zhí)行后,a=100,b=1,這就是引用符&的作用。實(shí)際上,在C語言中,&是地址符,C中的地址與指針的傳遞過程過于復(fù)雜,不作解釋以免添亂,而這也正是C++中引入引用機(jī)制的原因。 實(shí)際上這個例題很簡單,選擇它只是為了引出結(jié)構(gòu)體和引用機(jī)制的知識點(diǎn),如果還有需要解釋的地方,請告訴我! P10頁(1)—(11) (1) 復(fù)制內(nèi)容到剪貼板 代碼: #define TRUE 1 命令define的詳細(xì)作用請參閱C語言課本,此處只作簡單說明: #define TRUE 1的效果是,在預(yù)編譯的時候,程序中所有的“TRUE”都被機(jī)械的替換為1,1代表真值。(在控制臺程序中TRUE不被支持,而在windows編程中TRUE與true等同。) 類型定義符typedef,詳細(xì)請參閱C語言課本。 復(fù)制內(nèi)容到剪貼板 代碼: typedef int Status; 定義一個變量時,Status a;與int a;的效果是相同的,類型定義符typedef只是為了使用上的方便,在windows編程中你會見到大量的類型定義。 下面請注意了,講到數(shù)據(jù)結(jié)構(gòu)嚴(yán)書中經(jīng)常會見到的結(jié)構(gòu)體定義方法。 如下面這個使用了類型定義符的結(jié)構(gòu)體定義: 復(fù)制內(nèi)容到剪貼板 代碼: typedef struct node { int x,y; }Point,*lPoint; 其核心實(shí)際上就是前面已經(jīng)講過的 復(fù)制內(nèi)容到剪貼板 代碼: struct node { int x,y; }; 只不過把名稱ADT換成了node。 這里typedef的作用: 將類型struct node{}重定義為Point; 將類型struct node {}*重定義為lPoint;(typedef struct node{}* lPoint 注意此處Point與lPoint的名稱不能相同,前者是結(jié)構(gòu)體名稱,后者是結(jié)構(gòu)體指針名稱。 在此處,可以省略struct后面的結(jié)構(gòu)體名稱node,寫成如下形式: 復(fù)制內(nèi)容到剪貼板 代碼: struct { int x,y; }; 下面是完整的程序,來描述結(jié)構(gòu)體是如何被使用的。 復(fù)制內(nèi)容到剪貼板 代碼: #include<stdio.h> #include<stdlib.h> typedef struct { int x,y; }Point,*lPoint; int main() { Point a; a.x=1; // e使用結(jié)構(gòu)體變量時用的是“.” a.y=1; lPoint b; // 定義結(jié)構(gòu)體指針 b=(lPoint)malloc(sizeof(Point)); // 要給指針分配內(nèi)存 b->x=1; // 使用指針時用的是“->” b->y=1; Point* c; // 與上面定義結(jié)構(gòu)體指針是一回事,寫法不一樣而已 c=(Point*)malloc(sizeof(Point)); c->x=1; c->y=1; return 0; } 書中還會看到: 復(fù)制內(nèi)容到剪貼板 代碼: typedef struct node { int x,y; struct node* next; }Point,*lPoint; 這里的node不能省略,其余不再做過多的解釋。有關(guān)指針與內(nèi)存分配的知識點(diǎn),將在以后章節(jié)中講到。 嚴(yán)書從(2)到(11)是把C語言的知識簡單帶過 |
回復(fù)話題 |
||
上傳/修改頭像 |
|
|