作为一个Abstract data type,链表在时间上、逻辑上都能提供很多的便利,数据结构就是这样,只要从逻辑上理解这个结构是啥,代码实现部分因人而异OvO
本文引索: ///
·链表介绍 ///
·结点介绍+代码 ///
·链表的几种形式: ///
·单链表 ///
·循环链表 ///
·双向链表 ///
链表:由一个个“结点(node)”组成长长的一串链,是为“链表(Linked List)”
链者,顾名思义:环环相扣,即:只能从一个环找到下一个环
首先介绍:
·结点:
一个结点,想让它存储一些信息,还要执行环环相扣的功能,那就得有至少两个以上的“地方”来存储一些信息+行驶相扣功能:
struct node{
int data; //char啊,数组啊啥的,储存的信息是啥就定义啥,这里假设储存数字
node *next;//这里用组合结构本身定义一个“同类型的指针”
};
or
typedef struct node{
int data;
Node *next;
}Node; //网上常见的两种定义方式,这里是’宏定义‘
Q1:行使功能为啥要用指针?TAT
A:一个结点里面有存储指针的地方,辣么它就可以储存“下一个结点的地址!”,下一个结点的指针域又能储存下下个结点的“地址!”,这样不就连起来了嘛!~
Q2:要咋连呢?
A:往下看~
·单链表:
单链表:一个环(结点)扣一个环(结点),且只能从’上一个环‘找’下一个环‘,方向唯一(从链头到链尾)
那么现在,我们来一步步完成链表的创建,首先,让我们创建一个只有两个结点的链表~
#include<stdio.h>
struct node{
int data;
node *next;
};
int main()
{
return 0;
}
呃.....相信在初学的在尝试实现的时候,都会是这样:道理都懂,但是如何用代码去实现它?
所以创建链表的难点只有一个:怎么两个结点间,连起来?
step by step:
1. 创建链表,首先你得申请一个空间~,先创建第一个结点!!!!
* 头文件<stdlib.h>/<malloc.h>: malloc()函数~(直接贴码,具体功能你需要去百度看看)
#include<stdio.h>
#include<stdlib.h> //新增
struct node{
int data;
node *next;
};
int main()
{
node *p1; //新增
p1 = (node *)malloc(sizeof(node));//新增
p1->data = 1; //新增
p1->next = NULL; //新增
//在最后一个结点加NULL是一个好习惯,因为现在只有一个结点p1,没有下一个,所以令它的 “next” 等于NULL
return 0;
}
2.我们来创建第二个结点!!
#include<stdio.h>
#include<stdlib.h>
struct node{
int data;
node *next;
};
int main()
{
node *p1,*p2;
p1 = (node *)malloc(sizeof(node));
p2 = (node *)malloc(sizeof(node));
p1->data = 1;
p2->data = 2;
p1->next = p2; //亮点
p2->next = NULL;
return 0;
}
亮点即为连接方法~ 前一个结点的指针域,储存下一个结点本身的地址!(这也是开头强调‘只能一个结点找向下一个结点’的原因:单链表为单向顺序! 不可逆!)
换句话说:你知道p1,你可以用p1->next找到p2,但是你知道p2,就不能找到p1 QAQ
3.劳资要好多好多个结点!!!!
唔..如果要好多个结点,怕是可以用循环创建啦~!(get√)
但是每一个结点都要另外创建一个指针来进行操作吗 Orz...
那不是画风清奇?!:
p1 =(node *) malloc(sizeof(node));
.
.
.
pn =(node *) malloc(sizeof(node));
显然这样是不行的,实现不了的。
那要怎么办?
思路是这样的,我们用尽可能少的指针来表示尽可能多的结点!
所以呢,我的方法是用三个指针:1.第一个指针p1,用来保存申请的空间/p1 = (node*)malloc(sizeof(node))
2.第二个指针p2,用来保存p1上一个结点,然后进行 p2->next = p1, 再令p2 =p1;
3.第三个指针head,用来保存一开始的一个结点,知道头结点就能找出链表中的任一一个元素~
代码如下:
#include<stdio.h>
#include<stdlib.h>
struct node{
int data;
node *next;
};
int main()
{
node *p1,*p2,*head = 0;
for(int i = 1;i <= 5;i++)
{
p1 =(node *)malloc(sizeof(node));
p1->data = i;
if(head == 0) //head = 0是一个巧妙的方法而已,这样就能无差别的把第一到第n个结点的操作都
{ //包括在这个循环里面
head = p1;
p2 = p1;
}else
{
p2->next = p1;
p2 = p1;
}
}
p2->next = NULL; //不要忘了最后的一个结点要NULL!!!
return 0;
}
图示:
所以这样一来,单链表就创建好了!
Mark,有空更新循环链表~