首先我们要明白链表是干啥的?
我们再写代码时会经常用到数组,那么我们就会知道数组开辟的内存是连续的。直接画图示意吧:
数组在内存中的存放方式大概是这样的;
内存
a[0]=1 a[1]=2 a[2]=3 a[3]=4
b[0] .. .. ..
那么数组的好处就是我们可以很快速的访问数组里的内容,直接去访问a[x]就可以了。
但是现在我如果想从数组中插入一个数,要让它变成:
内存
a[0]=0 a[1]=1 a[2]=2 a[3]=3
b[0] .. .. ..
就需要将所有的值都往后移。所以我们当要去操作这样需要灵活操作的数据的时候,我们就可以使用链表搞定它。
我们可以把这些数组连续大块内存以外的这些小块的内存利用起来,把数据存进去,然后通过链表的方式把他们连接起来,如果想要插入某段数据,直接把它所在的块插入进链表中即可。
如何用链表?
首先我们知道链表是用来利用零散的内存的那么我们就需要吧数据存进内存。
我们搞个结构体用来存放数据
struct node{
int money;//我们就存兜里有多少钱吧;我们可以在这个结构体里随便存自己想存的东西。
char name[128];//我们也可以把名字存进来,想存啥就存啥。
struct node* next;/*这就是我们说的指针域了,它本质就是一个指针,指向下一个我们要存的地方。这样就可以把这片地方和下片地连起来了。*/
}
struct node*其实就相当于我们自己定义了一个数据类型,啥是数据类型,int,char这些都是,int表示我里面放的都是些整型数,char表示字符型。
表示我指向的还是一片地,里面存的东西还都是struct node这个结构体里这些类型的数据。
这个struct node这个结构体我们并没有给里面存的具体数据。那是因为我们定义的这个结构体只告诉他你是一片地,你里面要放名字和钱。具体你是哪片地,里面放谁的名字谁的钱我还没有想好。
=========================================================================
我们来上代码实战一下:
首先我们来存阿猫的数据
struct node amao{
.money=4, //阿猫有4块钱
.name="amaochiyu" //阿猫吃鱼
}
(.money=4这种写法用来给结构体选择性的赋值)
阿猫的数据就存进去了
存阿狗的数据
struct node agou{
.money=2, //阿狗有两块钱
.name=“agoubuchimao” //阿狗不吃猫
}
阿狗也有了自己的一片地。
再多存一个阿鱼
struct node ayu{
.money=3, //阿鱼有三块
.name=“ayubeimaochi” //阿鱼被猫吃
}
阿鱼也开疆拓土。
struct node amao/ayu/agou这些结构体,我们用听起来牛逼一点的话就是节点;节点它本质还就是一个结构体,我们把它看成放东西的一片地就行了。
======================================================================
那么我们如何要把这些节点串起来呢?
struct node * phead = NULL; //首先我们定义一个头节点
我们把阿猫串进表头。
struct node* addamaolink(struct node* phead)
{
if(phead==NULL){
phead=&amao; //如果头节点的phead指针指向空的地方,我们就让它指向阿猫的地,让它和阿猫的地连起来。
}
else{
amao.next=phead; //如果不是空的,我们就让amao.next这个指针指向phead指向的地
phead=&amao; //然后在让头节点的这个指针指向amao的地
}
}
phead是空的,我们让他指向阿猫的地
阿狗同理
struct node* addagoulink(struct node* phead)
{
if(phead==NULL){
phead=&agou; //如果头节点的phead指针指向空的地方,我们就让它指向阿狗的地,让它和阿狗的地连起来。
}
else{
agou.next=phead; //如果不是空的,我们就让agou.next这个指针指向phead指向
phead=&agou; //然后在让头节点的这个指针指向agou的地
}
}
这里的phead之前已经指向阿猫的地,我们就让agou的next先指向phead 指向的地,也就是阿猫的地
然后在让phead这个指针指向阿狗的地
阿鱼也同理
struct node* addayulink(struct node* phead)
{
if(phead==NULL){
phead=&ayu; //如果头节点的phead指针指向空的地方,我们就让它指向阿鱼的地,让它和阿猫的地连起来。
}
else{
ayu.next=phead; //如果不是空的,我们就让ayu.next这个指针指向phead指向
phead=&ayu; //然后在让头节点的这个指针指向ayu的地
}
}
阿鱼同理。就这样我们就把阿猫阿狗阿鱼的数据都串起来了
=========================================================================
那么我们如何去找这个链表里的数据呢?
struct node * find(struct node * phead,char *Name){
struct node *tmp =phead;
if(phead==NULL){
return NULL;
}//如果phead指向的空地址,说明这是一个空链表
else{
while(tmp!=NULL){ // 否则这片地只要不是空的,我们就进去找数据
if(strcmp(Name,tmp->name)=0) {
return tmp;
}//我们就通过每片地里的name和自己要的找的Name去做对比,如果一样的话就说明这片地是我们要的。
else{
tmp = tmp->next; //如果不一样,我们就去下一片地找。
}
}
return NULL; // 所有地找完了都找不到,就返回一个空值。
}
}
=========================================================================
自己的浅薄理解,有什么不妥或者错误的地方还望各位大佬指点!!!!!