这个简单的程序是什么意思?【高手请进】
数据结构有很多的问题都不懂,比如有些例程不是用C语言去写的,下面是一个链表的类型声明,有些看不太懂,这种语句好像在C中跑不起来:#ifndef_List_HstructN...
数据结构有很多的问题都不懂,比如有些例程不是用C语言去写的,下面是一个链表的类型声明,有些看不太懂,这种语句好像在C中跑不起来:
#ifndef _List_H
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef ptrToNode Position;
List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P,List L);
position Find(ElementType X,ListL, position P);
void DeleteList(List L);
int ISlast(Position P);
Elementytpe Retrieve(Position P);
#endif
struct Node
{
ElementType Element;
Position Next;
};
能解释一下么? 展开
#ifndef _List_H
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef ptrToNode Position;
List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P,List L);
position Find(ElementType X,ListL, position P);
void DeleteList(List L);
int ISlast(Position P);
Elementytpe Retrieve(Position P);
#endif
struct Node
{
ElementType Element;
Position Next;
};
能解释一下么? 展开
1个回答
展开全部
这代码的确是C代码没有错,不过因为缺少main函数和其他的一些定义,肯定是通不过编译的。
我按句翻译好了。
#ifndef _List_H //#ifndef预编译指令,如果没有定义 _List_H,就执行下面
struct Node; //Node 结构体变量声明,就像int a 一样,Node是变量名
typedef struct Node *PtrToNode; //typedef定义,定义新的类型,这种类型的名字叫做PtrToNode,它的类型是指向Node结构体的指针;
typedef PtrToNode List; //定义一个链表,其存储的数据格式是Node结构体,名字是List。
typedef ptrToNode Position; //依旧是PtrToNode类型的指针,只不过换了个名字叫Position而已。
List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P,List L);
position Find(ElementType X,ListL, position P);
void DeleteList(List L);
int ISlast(Position P);
Elementytpe Retrieve(Position P); //上面的N个函数从名字上就可以看出来,是对链表进行操作的函数,分别是 清空链表、检查链表是否为空、检查是否Position指向的是链表的最后一个元素、查找指定元素在链表中的位置、删除链表;至于……呃……最后一个 int ISlast(Position P); ……是你打错了吧……
#endif//预编译指令#ifndef结束。
struct Node
{
ElementType Element;
Position Next;
}; //结构体定义,不说了。
这样说或许你还是比较迷糊~其实我也觉得说的蛮迷糊的~
#ifndef的意思是“如果没有定义XXX,就执行下面的代码”,所以很简单,从#ifndef开始到#endif为止中间的内容都是在定义一些代码中要用到的新类型,之所以用#ifndef把他们包含进来,是因为“模块化开发”的思想,在一个软件系统中,这些定义应该是写在.h文件中的,为了防止重复定义,就使用了#ifndef。
接下来的难点就是typedef编译器指令了,typedef的作用是定义新的类型,其实说白了就是取个别名而已,比如
typedef int MyInt;
这一句,就是定义了一个新的类型叫做MyInt,其实它就是int,骗人用的-_-。
这样定义的好处是,如果有一堆int类型的变量,有一些表示长度有一些表示温度,如果这样写:
int length, temp;
当然不难理解,可如果要保存10个长度和20个温度呢?总不能length1 length2吧~这时就要用typedef了:
typedef int Length;
typedef int Temp;
然后如果需要表示温度,就……
Length roadLength;
这样子。
这例子举得比较恶心,看起来好像typedef没什么用~其实慢慢你会发现它还是有点用的……Orz
回到你的代码上
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef ptrToNode Position;
第一行定义了一个指向Node结构体的指针类型,这个类型的名字是PtrToNode,也就是说,如果我现在需要定义一个Node*类型的变量,就不用写
Node * pNode;
而写
PtrToNode pNode;
就好了。
第二行定义了一个链表,这个很好理解,空链表只有2种形式,一种是null,另一种是有个“哨兵元素”,它的定义是后者。
第三句同理,依旧是Node*,指向Node结构的指针,只不过又取了个名字叫Position而已。
=============可爱的分割线============
综上所述,想要运行这段代码,缺少很多东西:(
缺少1个Main函数;
缺少N多链表操作函数实现;
也就是说,你需要自己实现
List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P,List L);
position Find(ElementType X,ListL, position P);
void DeleteList(List L);
int ISlast(Position P);
Elementytpe Retrieve(Position P);
这些函数和main方法……
如果你还有疑问,请补充问题~
==============郁闷的分割线==========
呃……不好意思,前面说错了
int ISlast(Position P);
这个函数不是你打错……是我理解错了。它的作用是判断当前Position的元素是否是链表的最后一个,其实就是检查Node结构
struct Node
{
ElementType Element;
Position Next;
};
里的Next指针是否为空而已……
PS,这样说的话,List是个单链表吧~
我按句翻译好了。
#ifndef _List_H //#ifndef预编译指令,如果没有定义 _List_H,就执行下面
struct Node; //Node 结构体变量声明,就像int a 一样,Node是变量名
typedef struct Node *PtrToNode; //typedef定义,定义新的类型,这种类型的名字叫做PtrToNode,它的类型是指向Node结构体的指针;
typedef PtrToNode List; //定义一个链表,其存储的数据格式是Node结构体,名字是List。
typedef ptrToNode Position; //依旧是PtrToNode类型的指针,只不过换了个名字叫Position而已。
List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P,List L);
position Find(ElementType X,ListL, position P);
void DeleteList(List L);
int ISlast(Position P);
Elementytpe Retrieve(Position P); //上面的N个函数从名字上就可以看出来,是对链表进行操作的函数,分别是 清空链表、检查链表是否为空、检查是否Position指向的是链表的最后一个元素、查找指定元素在链表中的位置、删除链表;至于……呃……最后一个 int ISlast(Position P); ……是你打错了吧……
#endif//预编译指令#ifndef结束。
struct Node
{
ElementType Element;
Position Next;
}; //结构体定义,不说了。
这样说或许你还是比较迷糊~其实我也觉得说的蛮迷糊的~
#ifndef的意思是“如果没有定义XXX,就执行下面的代码”,所以很简单,从#ifndef开始到#endif为止中间的内容都是在定义一些代码中要用到的新类型,之所以用#ifndef把他们包含进来,是因为“模块化开发”的思想,在一个软件系统中,这些定义应该是写在.h文件中的,为了防止重复定义,就使用了#ifndef。
接下来的难点就是typedef编译器指令了,typedef的作用是定义新的类型,其实说白了就是取个别名而已,比如
typedef int MyInt;
这一句,就是定义了一个新的类型叫做MyInt,其实它就是int,骗人用的-_-。
这样定义的好处是,如果有一堆int类型的变量,有一些表示长度有一些表示温度,如果这样写:
int length, temp;
当然不难理解,可如果要保存10个长度和20个温度呢?总不能length1 length2吧~这时就要用typedef了:
typedef int Length;
typedef int Temp;
然后如果需要表示温度,就……
Length roadLength;
这样子。
这例子举得比较恶心,看起来好像typedef没什么用~其实慢慢你会发现它还是有点用的……Orz
回到你的代码上
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef ptrToNode Position;
第一行定义了一个指向Node结构体的指针类型,这个类型的名字是PtrToNode,也就是说,如果我现在需要定义一个Node*类型的变量,就不用写
Node * pNode;
而写
PtrToNode pNode;
就好了。
第二行定义了一个链表,这个很好理解,空链表只有2种形式,一种是null,另一种是有个“哨兵元素”,它的定义是后者。
第三句同理,依旧是Node*,指向Node结构的指针,只不过又取了个名字叫Position而已。
=============可爱的分割线============
综上所述,想要运行这段代码,缺少很多东西:(
缺少1个Main函数;
缺少N多链表操作函数实现;
也就是说,你需要自己实现
List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P,List L);
position Find(ElementType X,ListL, position P);
void DeleteList(List L);
int ISlast(Position P);
Elementytpe Retrieve(Position P);
这些函数和main方法……
如果你还有疑问,请补充问题~
==============郁闷的分割线==========
呃……不好意思,前面说错了
int ISlast(Position P);
这个函数不是你打错……是我理解错了。它的作用是判断当前Position的元素是否是链表的最后一个,其实就是检查Node结构
struct Node
{
ElementType Element;
Position Next;
};
里的Next指针是否为空而已……
PS,这样说的话,List是个单链表吧~
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询