数据结构入门-零C基础者适用(ZZ)
查看(1472) 回复(1) |
|
lyh2006
|
发表于 2010-08-13 23:09
楼主
很多朋友抱怨说严蔚敏的书很难,复习效果不理想。我现在一面在讲大家要耐心,要多查多问,而转过头来看到那些符号,想起自己当初C语言60分的成绩,初学数据结构的茫然,一步一步爬过来的辛苦,于是有了写个数据结构入门的想法,但愿对刚刚入门C语言基础不好和大跨考的朋友们有所帮助,数据结构复习已经进入正常轨道的朋友可以飘过。
我重新审视严书,概念与文字描述的内容都是易懂的,而算法与程序往往是卡住我们的地方。我试着解释每个符号的含义,C语言的基础知识点,图论中的难点,等等。但应该很少会涉及概念性的知识点。 本节主要讲了结构体定义的N种不同写法,类型定义符typdef的用法,引用机制。 P9页例1-6 在C语言中,最简单的结构体是这样的: 复制内容到剪贴板 代码: struct ADT { int x,y; }; 其中ADT是结构的名称,x和y是结构体的数据成员,注意{}后面的分号,这个是不能忘掉的。 现在添加一个成员函数(这实际上是C++的内容),即数据结构中所谓的基本操作,如下: 复制内容到剪贴板 代码: struct ADT { int x,y; void x_dayu_y() { if(x>y) printf("x>y "); else printf("x<=y "); }; }; 关于函数和if..else…语句的知识请参阅C语言课本,这个不用解释的吧。下面给出完整的程序,来描述这个结构是如何被使用的。当我说到“完整的程序”的时候,你完全可以在VC++6.0上来运行它。 复制内容到剪贴板 代码: #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; // 定义一个结构体变量,请区别:结构体变量adt的类型是结构体ADT adt.x=1; // 赋值 adt.y=2; adt.x_dayu_y(); // 基本操作 return 0; } 结构体的知识暂时介绍这些,对于理解例1-6的结构已经够用了。 在此强调一点,严书上的程序都是伪代码描述,完全COPY到程序里是肯定不能执行的。 复制内容到剪贴板 代码: ADT Triplet { InitTriplet(&T,v1,v2,v3) …… }ADT Triplet ADT Triplet可以理解为结构体名称,ADT即为书中前文提到的Abstract Data Type,而Triplet即为三元组,函数InitTriplet(&T,v1,v2,v3),此外伪代码并未指明返回值,需要解释一下的是符号&的含义,&在C++中表示引用,完整的程序如下: 复制内容到剪贴板 代码: #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
|
发表于 2010-08-13 23:10
沙发
实际上函数f执行后,a=100,b=1,这就是引用符&的作用。实际上,在C语言中,&是地址符,C中的地址与指针的传递过程过于复杂,不作解释以免添乱,而这也正是C++中引入引用机制的原因。 实际上这个例题很简单,选择它只是为了引出结构体和引用机制的知识点,如果还有需要解释的地方,请告诉我! P10页(1)—(11) (1) 复制内容到剪贴板 代码: #define TRUE 1 命令define的详细作用请参阅C语言课本,此处只作简单说明: #define TRUE 1的效果是,在预编译的时候,程序中所有的“TRUE”都被机械的替换为1,1代表真值。(在控制台程序中TRUE不被支持,而在windows编程中TRUE与true等同。) 类型定义符typedef,详细请参阅C语言课本。 复制内容到剪贴板 代码: typedef int Status; 定义一个变量时,Status a;与int a;的效果是相同的,类型定义符typedef只是为了使用上的方便,在windows编程中你会见到大量的类型定义。 下面请注意了,讲到数据结构严书中经常会见到的结构体定义方法。 如下面这个使用了类型定义符的结构体定义: 复制内容到剪贴板 代码: typedef struct node { int x,y; }Point,*lPoint; 其核心实际上就是前面已经讲过的 复制内容到剪贴板 代码: struct node { int x,y; }; 只不过把名称ADT换成了node。 这里typedef的作用: 将类型struct node{}重定义为Point; 将类型struct node {}*重定义为lPoint;(typedef struct node{}* lPoint 注意此处Point与lPoint的名称不能相同,前者是结构体名称,后者是结构体指针名称。 在此处,可以省略struct后面的结构体名称node,写成如下形式: 复制内容到剪贴板 代码: struct { int x,y; }; 下面是完整的程序,来描述结构体是如何被使用的。 复制内容到剪贴板 代码: #include<stdio.h> #include<stdlib.h> typedef struct { int x,y; }Point,*lPoint; int main() { Point a; a.x=1; // e使用结构体变量时用的是“.” a.y=1; lPoint b; // 定义结构体指针 b=(lPoint)malloc(sizeof(Point)); // 要给指针分配内存 b->x=1; // 使用指针时用的是“->” b->y=1; Point* c; // 与上面定义结构体指针是一回事,写法不一样而已 c=(Point*)malloc(sizeof(Point)); c->x=1; c->y=1; return 0; } 书中还会看到: 复制内容到剪贴板 代码: typedef struct node { int x,y; struct node* next; }Point,*lPoint; 这里的node不能省略,其余不再做过多的解释。有关指针与内存分配的知识点,将在以后章节中讲到。 严书从(2)到(11)是把C语言的知识简单带过 |
lyh2006
|
发表于 2010-08-13 23:10
3楼
实际上函数f执行后,a=100,b=1,这就是引用符&的作用。实际上,在C语言中,&是地址符,C中的地址与指针的传递过程过于复杂,不作解释以免添乱,而这也正是C++中引入引用机制的原因。 实际上这个例题很简单,选择它只是为了引出结构体和引用机制的知识点,如果还有需要解释的地方,请告诉我! P10页(1)—(11) (1) 复制内容到剪贴板 代码: #define TRUE 1 命令define的详细作用请参阅C语言课本,此处只作简单说明: #define TRUE 1的效果是,在预编译的时候,程序中所有的“TRUE”都被机械的替换为1,1代表真值。(在控制台程序中TRUE不被支持,而在windows编程中TRUE与true等同。) 类型定义符typedef,详细请参阅C语言课本。 复制内容到剪贴板 代码: typedef int Status; 定义一个变量时,Status a;与int a;的效果是相同的,类型定义符typedef只是为了使用上的方便,在windows编程中你会见到大量的类型定义。 下面请注意了,讲到数据结构严书中经常会见到的结构体定义方法。 如下面这个使用了类型定义符的结构体定义: 复制内容到剪贴板 代码: typedef struct node { int x,y; }Point,*lPoint; 其核心实际上就是前面已经讲过的 复制内容到剪贴板 代码: struct node { int x,y; }; 只不过把名称ADT换成了node。 这里typedef的作用: 将类型struct node{}重定义为Point; 将类型struct node {}*重定义为lPoint;(typedef struct node{}* lPoint 注意此处Point与lPoint的名称不能相同,前者是结构体名称,后者是结构体指针名称。 在此处,可以省略struct后面的结构体名称node,写成如下形式: 复制内容到剪贴板 代码: struct { int x,y; }; 下面是完整的程序,来描述结构体是如何被使用的。 复制内容到剪贴板 代码: #include<stdio.h> #include<stdlib.h> typedef struct { int x,y; }Point,*lPoint; int main() { Point a; a.x=1; // e使用结构体变量时用的是“.” a.y=1; lPoint b; // 定义结构体指针 b=(lPoint)malloc(sizeof(Point)); // 要给指针分配内存 b->x=1; // 使用指针时用的是“->” b->y=1; Point* c; // 与上面定义结构体指针是一回事,写法不一样而已 c=(Point*)malloc(sizeof(Point)); c->x=1; c->y=1; return 0; } 书中还会看到: 复制内容到剪贴板 代码: typedef struct node { int x,y; struct node* next; }Point,*lPoint; 这里的node不能省略,其余不再做过多的解释。有关指针与内存分配的知识点,将在以后章节中讲到。 严书从(2)到(11)是把C语言的知识简单带过 |
lyh2006
|
发表于 2010-08-13 23:10
4楼
实际上函数f执行后,a=100,b=1,这就是引用符&的作用。实际上,在C语言中,&是地址符,C中的地址与指针的传递过程过于复杂,不作解释以免添乱,而这也正是C++中引入引用机制的原因。 实际上这个例题很简单,选择它只是为了引出结构体和引用机制的知识点,如果还有需要解释的地方,请告诉我! P10页(1)—(11) (1) 复制内容到剪贴板 代码: #define TRUE 1 命令define的详细作用请参阅C语言课本,此处只作简单说明: #define TRUE 1的效果是,在预编译的时候,程序中所有的“TRUE”都被机械的替换为1,1代表真值。(在控制台程序中TRUE不被支持,而在windows编程中TRUE与true等同。) 类型定义符typedef,详细请参阅C语言课本。 复制内容到剪贴板 代码: typedef int Status; 定义一个变量时,Status a;与int a;的效果是相同的,类型定义符typedef只是为了使用上的方便,在windows编程中你会见到大量的类型定义。 下面请注意了,讲到数据结构严书中经常会见到的结构体定义方法。 如下面这个使用了类型定义符的结构体定义: 复制内容到剪贴板 代码: typedef struct node { int x,y; }Point,*lPoint; 其核心实际上就是前面已经讲过的 复制内容到剪贴板 代码: struct node { int x,y; }; 只不过把名称ADT换成了node。 这里typedef的作用: 将类型struct node{}重定义为Point; 将类型struct node {}*重定义为lPoint;(typedef struct node{}* lPoint 注意此处Point与lPoint的名称不能相同,前者是结构体名称,后者是结构体指针名称。 在此处,可以省略struct后面的结构体名称node,写成如下形式: 复制内容到剪贴板 代码: struct { int x,y; }; 下面是完整的程序,来描述结构体是如何被使用的。 复制内容到剪贴板 代码: #include<stdio.h> #include<stdlib.h> typedef struct { int x,y; }Point,*lPoint; int main() { Point a; a.x=1; // e使用结构体变量时用的是“.” a.y=1; lPoint b; // 定义结构体指针 b=(lPoint)malloc(sizeof(Point)); // 要给指针分配内存 b->x=1; // 使用指针时用的是“->” b->y=1; Point* c; // 与上面定义结构体指针是一回事,写法不一样而已 c=(Point*)malloc(sizeof(Point)); c->x=1; c->y=1; return 0; } 书中还会看到: 复制内容到剪贴板 代码: typedef struct node { int x,y; struct node* next; }Point,*lPoint; 这里的node不能省略,其余不再做过多的解释。有关指针与内存分配的知识点,将在以后章节中讲到。 严书从(2)到(11)是把C语言的知识简单带过 |
回复话题 |
||
上传/修改头像 |
|
|