单链表由各个内存结构通过一个指针链接在一起组成,每一个内存结构都存在后继内存结构(链尾除外),内存结构由数据域和指针域组成。
下文介绍了链表的一些基本操作,所有代码均在子函数中编写,文章最下方附带完整代码,Copy即可食用。
一、链表的创建
说到链表,肯定少不了结构体,首先第一步我们要创建结构体(头文件不算数嗷)。接下来就要创建头结点,所谓头结点,其实就是创建一个指针来指向一块内存空间 如下文所示:
typedef struct Node{
int data; //数据域(你可以理解为存放数据的位置)
struct Node *next; //指针域(存放下一个结点的地址)
}Node;
LinkList create(){
//定义一个指针,为指针 申请一块空间
Node *head = (Node *)malloc(sizeof(Node));
//判断空间是否开辟成功
if(!head){
printf("空间申请失败!\n");
return NULL;
}
//头结点,指针域值为 NULL
head->next = NULL;
//返回 头结点 指针
return head;
}
二、链表的输入
链表的数据(输入/插入)与数组思想一样,利用scanf录入数据值,不同的是数组是直接放入下标位空间,而链表是将所录入的数据放入到了结构体中的数据域中,然后令移动至指针域所指向的下一个结点空间,继续输入,注意 最后一位结点记得将指针域赋空值 即NULL,如下文所示:
void input(Node *head){
//用来判断头结点是否开辟成功 若不成功则结束程序
if(!head){
return;
}
//这里需要注意 链表是通过头结点一步一步移动寻找数据的,所以需要再创建一个指针指向头结点,利用这个指针进行操作,否则会造成数据丢失的情况。
//创建指针 指向头结点
Node *q = head;
//这里就以录入5个数据为例
for(int i=0;i<5;i++){
Node *p = (Node *)malloc(sizeof(Node)); //开辟新的结点
printf("请输入数据:");
scanf("%d",&p->data); //这里就是输入数据的位置,注意需要放地址
//这里利用的是 尾插法 连接的链表,(尾插法即:将结点连接至链表尾部)
q->next = p; //q指向的是头结点,头结点的指针域存放p的地址
//令q结点移动至它本身指针域存放地址的位置 即p的位置,循环结束下一次循环再次创建新的p结点
q = q->next;
}
//这里因为循环录入已经结束,所以将最后一个结点的指针域赋空值
q->next = NULL;
}