单链表
- 单链表是线性表的链式存储方式,链式结构说白了就是用指针来实现数组的操作罢了,但是很难(QWQ),---------- 尤其是我c语言一塌糊涂,所以指针压根就没怎么搞懂,哈哈哈,其实我觉得只用会用了自然就懂了,所以加油吧。QuQ
- 单链表的特点在于逻辑上相邻的元素其物理上不一定相邻,也就是说它是一种非随机存储的存储结构,需要通过一系列的指针来进行操作。
- 因为要保证逻辑上的相邻,所以需要定义一个指针域来存储下一个元素的位置,所以单链表的结构体定义为:
typdef struct LNode{
Elemtype data; //数据域
struct LNode *next // 指针域,用于存放下一个结点(元素)的地址位置
} LNode, *Linklist;
- 这里我们可以注意一下 LNode , 和 *LinkList , 他们分别是 struct LNode 定义的一个变量和一个指针, 由于我们这里用了typdef 关键字, 所以我们在main函数里也可直接用LinkList 来声明单链表;
int main(void)
{
LinkList L; // 建立一张单链表
//LNode *L; //此种方法也可以建立链表,但是容易搞混
}
ps: 这里我们可以思考一下, 为什么不能用以下这种方式定义单链表:
int main(void)
{
LNode L; // 老子就想这样定义,但是好像不行(QWQ)
}
,,,原因很简单,因为你的单链表中相关函数的操作就是针对单链表的,但是LNode只不过是一个你设置的结构体变量,并不是指针,而函数对于单链表的操作本身是对于指针的操作,所以我们得用上面的两种操作。
- 其实对于LNode * 和 LinkList 想要理解也不是特别简单,尤其是新人,比如下面两段代码:
void CreateList_L(LinkList &L, int n)
{
L = (LinkList) malloc (sizeof(LNode)); //强调这是一张链表
L ->next = NULL;
for(int i = n; i>0; i--){
p = (LNode *) malloc (sizeof(LNode)); //强调这是一个节点
.......
}
}
LinkList List_TailInsert(LinkList &L)
{
int x;
L = (LinkList)malloc(sizeof(LNode)); //强调这是一张链表
LNode *s, *r = L;
scanf(&x); //& 取x的地址
while(x != 9999)
{
s = (LNode *) malloc(sizeof(LNode)); //强调这是一个节点
......
}
}
-
通过上面两段代码可以看出, LNode* 和 LinkList 的含义是相同的,都是 LNode 的一个指针,但是他们的侧重点不同:
LNode * 强调节点, LinkList 强调链表
这里为了怕搞混淆,其实可以理解为,当你的操作是需要建立或者对表进行相关操作时,你就用LinkList, 如果是需要用到结点的相关操作,比如删除,或者增加某个结点, 你就用LNode *; -
单链表的其他操作以及c++实现放到下面一篇,这篇先水一波(QWQ)
-
在加一点,因为单链表有带头结点和不带头结点两种操作,但是由于水平有限,所以在接下来的文章只会介绍单链表带头节点的相关操作和代码实现,至于不带头结点的,可以看看然后自己理解理解就行。
-
啊,,, 指针这玩意想要好好理解确实很麻烦,我上面写的这么些东西不过是想强调两件事:
单链表是对指针的线性操作;
LinkList 是用来强调单链表的,而LNode * 是用来强调结点的。