数据结构入门-零C基础者适用(ZZ)
查看(1385) 回复(1)
lyh2006
  • 积分:1982
  • 注册于:2010-08-01
发表于 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
  • 积分:1982
  • 注册于:2010-08-01
发表于 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
  • 积分:1982
  • 注册于:2010-08-01
发表于 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
  • 积分:1982
  • 注册于:2010-08-01
发表于 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语言的知识简单带过

分享到:
回复话题
上传/修改头像

硬币有几面?(答案为数字)

考研论坛提示:
1、请勿发布个人联系方式或询问他人联系方式,包括QQ和手机等。
2、未经允许不得发布任何资料出售、招生中介等广告信息。
3、如果发布了涉及以上内容的话题或跟帖,您在考研网的注册账户可能被禁用。

网站介绍 | 关于我们 | 联系方式 | 广告业务 | 帮助信息
©1998-2015 ChinaKaoyan.com Network Studio. All Rights Reserved.

中国考研网-联系地址:上海市邮政信箱088-014号 邮编:200092 Tel & Fax:021 - 5589 1949 沪ICP备12018245号