单链表的创建(详解)

单链表的概念及结构

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表成员中的指针链接次序来实现的结构:

链表的结构类似与火车:通过一节一节的车厢相连接,可以根据人数的多少来调节车厢的数量,每个车厢都是独立存在,互不干扰的。这一节节车厢就是链表中的一个个独立单元,而串联起这些独立单元的工具则是:指针

指针通过存储下一个节点的地址,来实现串联,通过地址,就可以一直找到下一个节点下面让我们来看看这一节节车厢里面具体是什么:如图:每个节点,都有自己的地址。而每个节点都由两部分组成:所需存储的值(不一定是int 也可以是其他类型)and下一个节点的地址,即值域和指针域。当节点不在需要指向下一个节点时,我们则可以将其指针域赋值为NULL(空指针)下面我们就可以根据之前在c语言中所学的结构体的知识,来书写节点对应的代码代码语言:javascript复制struct NODE

{

int date;//值域

struct NODE* next;//指针域

};得到结构体的代码,我们就可以根据结构体来创建节点了 单链表的创建

创建单链表,第一步我们需先创建节点,第二步再将节点一个个链接起来。1.创建节点创建节点,我们需要向内存申请大小为(struct NODE)的空间。由此我们需要用到动态内存分配中的函数:malloc(需包含头文件:stdlib.h or malloc.h)。代码语言:javascript复制struct NODE* p=(struct NODE*)malloc(sizeof(struct NODE));别怕不要被上面一长串的代码吓到,我们一个个来看:

首先看等号左边,我们定义了一个指针变量p,且这个变量是我们前面定义的结构体变量:即我们定义了一个结构体变量的指针,由于接收结构体指针其次,我们使用了malloc函数用于向内存申请空间,malloc后边的括号,代表我们申请空间的大小 即一个结构体的大小(sizeof(struct NODE))最后,我们来看malloc前面的括号,这代表的强制类型转化 即转化为结构体指针类型,这是因为malloc函数的返回类型是void*(无具体类型的指针,即没有明确说明是什么类型)所以我们需要强制类型转化一下2.创建链表(创建可以用很多方式来创建,在此我仅举一个例子来作为示范)首先我们可以先创建一个叫做头节点的节点(即一个没有存放数值的节点),先将指针域赋值为NULL

然后我们可以通过循环不断输入数据,以0为结束标志 ,在循环内每输入一个数据,则创建一个节点并将其链接在一起代码语言:javascript复制#include

#include

int main()

{

int n;

typedef struct NODE//先定义结构体

{

int date;

struct NODE* next;

}NODE;

//创建头指针

NODE* head = (NODE*)malloc(sizeof(NODE));

NODE* p = head;

p->next = NULL;//先赋值为空

while (1)//不断输入一个整数,以0为结束标志

{

scanf("%d", &n);

if (n != 0)

{

NODE* s = (NODE*)malloc(sizeof(NODE));//创建新的节点

s->next = p->next;//将新节点的指针域赋值为NULL

s->date = n;

p->next = s;//将p与s链接

p = s;//p移动至一下节点

}

else

break;

}由此,我们便创建起了一个链表(如有纰漏还请斧正)

[an error occurred while processing the directive]