考研论坛

 
查看: 19606|回复: 45
打印 上一主题 下一主题

数据结构入门-零C基础者适用(ZZ)

[复制链接]

21

主题

1252

帖子

4476

积分

高级战友

Rank: 4

精华
0
威望
599
K币
3877 元
注册时间
2012-5-14
楼主
发表于 2012-7-8 12:31 | 只看该作者
概念什么的都还好懂,一看到算法代码就晕了
回复

使用道具 举报

0

主题

17

帖子

217

积分

一般战友

Rank: 2

精华
0
威望
0
K币
217 元
注册时间
2011-10-16
沙发
发表于 2012-4-9 17:17 | 只看该作者
感谢楼主楼主 确实看的纠结
回复

使用道具 举报

0

主题

6

帖子

252

积分

一般战友

Rank: 2

精华
2
威望
210
K币
42 元
注册时间
2009-8-13
板凳
 楼主| 发表于 2009-8-30 18:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很多朋友抱怨说严蔚敏的书很难,复习效果不理想。我现在一面在讲大家要耐心,要多查多问,而转过头来看到那些符号,想起自己当初C语言60分的成绩,初学数据结构的茫然,一步一步爬过来的辛苦,于是有了写个数据结构入门的想法,但愿对刚刚入门C语言基础不好和大跨考的朋友们有所帮助,数据结构复习已经进入正常轨道的朋友可以飘过。
我重新审视严书,概念与文字描述的内容都是易懂的,而算法与程序往往是卡住我们的地方。我试着解释每个符号的含义,C语言的基础知识点,图论中的难点,等等。但应该很少会涉及概念性的知识点。

本节主要讲了结构体定义的N种不同写法,类型定义符typdef的用法,引用机制。

P9页例1-6

在C语言中,最简单的结构体是这样的:

  1. struct ADT
  2. {
  3.     int x,y;
  4. };
复制代码
其中ADT是结构的名称,x和y是结构体的数据成员,注意{}后面的分号,这个是不能忘掉的。
现在添加一个成员函数(这实际上是C++的内容),即数据结构中所谓的基本操作,如下:

  1. struct ADT
  2. {
  3.     int x,y;
  4.     void x_dayu_y()
  5.     {
  6.         if(x>y)
  7.             printf("x>y\n");
  8.         else
  9.             printf("x<=y\n");
  10.     };
  11. };
复制代码
关于函数和if..else…语句的知识请参阅C语言课本,这个不用解释的吧。下面给出完整的程序,来描述这个结构是如何被使用的。当我说到“完整的程序”的时候,你完全可以在VC++6.0上来运行它。
  1. #include<stdio.h>

  2. struct ADT
  3. {
  4.     int x,y;
  5.     void x_dayu_y()
  6.     {
  7.         if(x>y)
  8.             printf("x>y\n");
  9.         else
  10.             printf("x<=y\n");
  11.     };
  12. };

  13. int main()
  14. {
  15.     int a;
  16.     a=1;
  17.     ADT adt; // 定义一个结构体变量,请区别:结构体变量adt的类型是结构体ADT
  18.     adt.x=1; // 赋值
  19.     adt.y=2;
  20.     adt.x_dayu_y(); // 基本操作
  21.     return 0;
  22. }
复制代码
结构体的知识暂时介绍这些,对于理解例1-6的结构已经够用了。
在此强调一点,严书上的程序都是伪代码描述,完全COPY到程序里是肯定不能执行的。
  1. ADT Triplet
  2. {
  3.     InitTriplet(&T,v1,v2,v3)
  4.     ……
  5. }ADT Triplet
复制代码
ADT Triplet可以理解为结构体名称,ADT即为书中前文提到的Abstract Data Type,而Triplet即为三元组,函数InitTriplet(&T,v1,v2,v3),此外伪代码并未指明返回值,需要解释一下的是符号&的含义,&在C++中表示引用,完整的程序如下:

  1. #include<stdio.h>

  2. void f(int &a,int b)
  3. {
  4.     a=100;
  5.     b=100;
  6. }

  7. int main()
  8. {
  9.     int a=1,b=1;
  10.     f(a,b);
  11.     printf("%d %d\n",a,b);
  12.     return 0;
  13. }
复制代码
实际上函数f执行后,a=100,b=1,这就是引用符&的作用。实际上,在C语言中,&是地址符,C中的地址与指针的传递过程过于复杂,不作解释以免添乱,而这也正是C++中引入引用机制的原因。
实际上这个例题很简单,选择它只是为了引出结构体和引用机制的知识点,如果还有需要解释的地方,请告诉我!

P10页(1)—(11)
(1)
  1. #define TRUE 1
复制代码
命令define的详细作用请参阅C语言课本,此处只作简单说明:
#define TRUE 1的效果是,在预编译的时候,程序中所有的“TRUE”都被机械的替换为1,1代表真值。(在控制台程序中TRUE不被支持,而在windows编程中TRUE与true等同。)

类型定义符typedef,详细请参阅C语言课本。
  1. typedef int Status;
复制代码
定义一个变量时,Status a;与int a;的效果是相同的,类型定义符typedef只是为了使用上的方便,在windows编程中你会见到大量的类型定义。

下面请注意了,讲到数据结构严书中经常会见到的结构体定义方法。

如下面这个使用了类型定义符的结构体定义:

  1. typedef struct node
  2. {
  3.     int x,y;
  4. }Point,*lPoint;
复制代码
其核心实际上就是前面已经讲过的
  1. struct node
  2. {
  3.     int x,y;
  4. };
复制代码
只不过把名称ADT换成了node。
这里typedef的作用:
将类型struct node{}重定义为Point;
将类型struct node {}*重定义为lPoint;(typedef struct node{}* lPoint;)
注意此处Point与lPoint的名称不能相同,前者是结构体名称,后者是结构体指针名称。
在此处,可以省略struct后面的结构体名称node,写成如下形式:

  1. struct
  2. {
  3.     int x,y;
  4. };
复制代码
下面是完整的程序,来描述结构体是如何被使用的。
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef struct
  4. {
  5.     int x,y;
  6. }Point,*lPoint;

  7. int main()
  8. {
  9.     Point a;
  10.     a.x=1; // e使用结构体变量时用的是“.”
  11.     a.y=1;
  12.     lPoint b; // 定义结构体指针
  13.     b=(lPoint)malloc(sizeof(Point)); // 要给指针分配内存
  14.     b->x=1; // 使用指针时用的是“->”
  15.     b->y=1;
  16.     Point* c; // 与上面定义结构体指针是一回事,写法不一样而已
  17.     c=(Point*)malloc(sizeof(Point));
  18.     c->x=1;
  19.     c->y=1;
  20.     return 0;
  21. }
复制代码
书中还会看到:
  1. typedef struct node
  2. {
  3.     int x,y;
  4.     struct node* next;
  5. }Point,*lPoint;
复制代码
这里的node不能省略,其余不再做过多的解释。有关指针与内存分配的知识点,将在以后章节中讲到。

严书从(2)到(11)是把C语言的知识简单带过

[ 本帖最后由 lonelyskytaut 于 2009-8-30 18:24 编辑 ]

    评分

    参与人数 2威望 +60 收起 理由
    yylsky + 30 精品文章
    lonelyskytaut + 30

    查看全部评分

    回复

    使用道具 举报

    18

    主题

    277

    帖子

    867

    积分

    中级战友

    Rank: 3Rank: 3

    精华
    0
    威望
    310
    K币
    557 元
    注册时间
    2009-5-21
    地板
    发表于 2009-8-30 19:16 | 只看该作者
    虽然俺不考本专业 但也顶一个~
    回复

    使用道具 举报

    0

    主题

    86

    帖子

    266

    积分

    一般战友

    Rank: 2

    精华
    0
    威望
    90
    K币
    176 元
    注册时间
    2009-8-25
    5
    发表于 2009-8-30 20:13 | 只看该作者
    严版的C用的是类C语言,并非严谨的用C写成的。所以要用严的书写出算法到计算机上测试是由不小的难度。如果要上机试建议看 《数据结构习题解析》 上面的写的严谨的多。
    回复

    使用道具 举报

    69

    主题

    1463

    帖子

    2万

    积分

    资深会员

    Rank: 6Rank: 6

    精华
    2
    威望
    14455
    K币
    11954 元
    注册时间
    2009-4-6
    6
    发表于 2009-8-30 20:48 | 只看该作者
    呵呵,支持楼主。
    计算机     苏州大学
    上帝没有给我翅膀,科学让我飞翔。
    回复

    使用道具 举报

    0

    主题

    5

    帖子

    10

    积分

    新手上路

    Rank: 1

    精华
    0
    威望
    0
    K币
    10 元
    注册时间
    2009-8-27
    7
    发表于 2009-8-30 22:31 | 只看该作者
    顶一个
    回复

    使用道具 举报

    1

    主题

    98

    帖子

    250

    积分

    一般战友

    Rank: 2

    精华
    0
    威望
    30
    K币
    220 元
    注册时间
    2009-5-21
    8
    发表于 2009-8-31 10:04 | 只看该作者
    楼主 转帖 请注明出处
    不注明出处 好像是不太厚道。。

    [ 本帖最后由 xiajianlei 于 2009-8-31 10:06 编辑 ]
    回复

    使用道具 举报

    0

    主题

    5

    帖子

    10

    积分

    新手上路

    Rank: 1

    精华
    0
    威望
    0
    K币
    10 元
    注册时间
    2008-7-10
    9
    发表于 2009-8-31 10:27 | 只看该作者
    我还以为是楼主本人自己原帖呢。。~?
    回复

    使用道具 举报

    2

    主题

    344

    帖子

    870

    积分

    中级战友

    Rank: 3Rank: 3

    精华
    0
    威望
    160
    K币
    710 元
    注册时间
    2008-5-25
    10
    发表于 2009-8-31 13:37 | 只看该作者
    支持一下呀~
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册 人人连接登陆

    本版积分规则   

    关闭

    您还剩5次免费下载资料的机会哦~

    扫描二维码下载资料

    使用手机端考研帮,进入扫一扫
    在“我”中打开扫一扫,
    扫描二维码下载资料

    关于我们|商务合作|小黑屋|手机版|联系我们|服务条款|隐私保护|帮学堂| 网站地图|院校地图|漏洞提交|考研帮

    GMT+8, 2024-5-5 17:39 , Processed in 0.050719 second(s), Total 12, Slave 11(Usage:7.25M, Links:[2]1,1_1) queries , Memcache On.

    Powered by Discuz!

    © 2001-2017 考研 Inc.

    快速回复 返回顶部 返回列表
    × 关闭