一些数据结构的基本准备

很多朋友抱怨说严蔚敏的书很难,复习效果不理想。我现在一面在讲大家要耐心,要多查多问,而转过头来看到那些符号,想起自己当初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/n");
        else 
            printf("x<=y/n");
    };
};
关于函数和if..else…语句的知识请参阅C语言课本,这个不用解释的吧。下面给出完整的程序,来描述这个结构是如何被使用的。当我说到“完整的程序”的时候,你完全可以在VC++6.0上来运行它。
复制内容到剪贴板
代码:
#include<stdio.h>

struct ADT
{
    int x,y;
    void x_dayu_y()
    {
        if(x>y)
            printf("x>y/n");
        else
            printf("x<=y/n");
    };
};

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/n",a,b);
    return 0;
}
实际上函数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语言的知识简单带过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值