天天看点

数据结构中的C语言基础,送给正在刷王道的考研党~

国内高校的数据结构教材大都选自清华大学严蔚敏老师的书,考虑到大多数同学C语言的基础不是很好,尤其是对结构体和指针的理解不深刻的同学,如果直接去看数据结构中用到的各种结构体的定义,就不是很友好,因此写下这篇博客,串讲一下常见的数据结构的结构体定义以及一些细节问题~

//比如单链表的结构体的定义:
typedef struct LNode{
	struct LNode* next;
	int data;
}LNode,*LinkList;
           

由于各种辅导书或者一般的教材代码不是非常规范,在定义一个链表的结点的时候也是多种多样的,这样导致大家在阅读代码的时候会纠结各种各样的写法~

我们先回忆一下C语言中的关键字typedef,该关键字的作用是“起别名”,是将一个已知类型起另外一个名字。
比如我们来看大家最熟悉的整形(int)
我们定义一个整形变量a: int a;
我们还可以给int起一个别名: typedef int MyInt  此时我们如果想定义一个整形变量b,可以采用如下语法:
MyInt b;   //它等价于int b;
搞清楚typedef的作用以后,我们回到最初的单链表的结构体的定义中来。
我们知道在C语言中如果要定义一个结构体变量或者结构体指针的时候,需要使用关键字struct(补充一句:C++中是不需要的)
struct LNode* head; //C语言定义一个单链表的头指针
我们为了省略关键字struct  所以使用
typedef struct LNode{
	struct LNode* next;
	int data;
}    LNode
这样我们就可以省略掉struct这个关键字了,因为我们相当于做了typedef struct LNode LNode;
此时struct LNode 的别名就叫作LNode 这样我们在写代码的时候就可以省略掉struct 这个关键字
所以LNode* head;  //它等价于struct LNode* head;
           

讨论完第一个大家可能觉得有问题的地方以后,我们来看第二个关于 LinkList 的问题:在说这个问题之前,我们先来看一个大家的易错点,这也是C语言考试中比较常考的一个知识点~

//例如 我们定义两个整形变量a和b:
int a,b;  //它等价于int a; int b;
我们再定义两个整形指针p和q:
int* p,*q;  //它等价于int *p;  int *q;
           

但是很多C语言基础不扎实的同学,可能在定义指针的时候会出现一个小小的错误

还是定义两个整形指针p和q,不少同学会有下面的写法:

int *p,q;

这里等价的写法其实是:int *p; int q; 实际上它是一个整形指针和一个整形变量,而并非p和q两个指针,所以回归到我们的单链表中,就会有同学犯同样的错误:

LNode* head,p;  看似正确,但是是一个很细节的错误,实际上它定义的是是LNode* head;  LNode p;  
而正确的写法应该是:LNode* head,*p; 这个等价于LNode* head; LNode* p; 这才是我们想要的正确结果

为了防止这个细节错误的发生,我们将*和LNode放在一起并起别名为LinkList
也就是
typedef struct LNode{
	struct LNode* next;
	int data;
}*LinkList;
简单化简一下就是:
typedef struct LNode* LinkList; 
现在LinkList head; 就等价于LNode* head; 
这样我们就可以少写一个*  同时也可以减少上面的细节错误
与此同时,如果我们需要定义多个结点指针,只需要:
LinkList p,q,r;    
等价于:
LNode *p,*q,*r;
等价于:
LNode* p; 
LNode* q;
LNode* r
           

总结如下:

在如下的定义的前提下:
typedef struct LNode{
	struct LNode* next;
	int data;
}LNode,*LinkList;


 1. struct LNode* head;   
 2. LNode *head; 
 3. LinkList head;
以上三种定义是等价的
           

希望这篇文章能让大家更清楚的掌握各种数据结构的结构体的定义

继续阅读