[数据结构]链表

作为一个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,有空更新循环链表~

linked list
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
02-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值