链表的学习是数据结构中的重中之重,一定要把这里彻底搞懂,后面的知识自然就是一通百通
首先我们在学习单链表的时候之前,要对指针有一定的了解,链表与线性表最大的不同就在于,线性表的每一个数据存储的地址是连续的的,而链表每一个节点的地址是随机分配的。
下面我们来逐一讲解一下每一步的操作:
1.所需要的头文件和自定义
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
2.创建结构体用来存放数据和下一节点的位置
typedef struct List {
ElemType data;
struct List* next;
}Node,*LinkList;
因为每创建一个节点都要用到一次该结构体,所以用typedef定义一个结构体以便以后使用,注意这里如果你对C语言学习了解较少的话,要回去学一学结构体,这里的Node是定义该结构体的名称并不是定义为该结构体的变量,而*LinkList也不是指向该结构体的指针变量而是定义指向该结构的指针名称
当定义结构体变量时代码为
Node a,b,c;
当定义指向该结构体变量时代码为
LinkList a,b,c;
注意当定义指向该结构体的指针时:Node *a;和LinkList a;是等价的
3.对链表的初始化
Status InitList(LinkList * L) {
*L = (LinkList)malloc(sizeof(Node));
if (!(*L))
{
return ERROR;
}
(*L)->next = NULL;
}
Status是在1.中定义的是int的别名,简单来说在这里我们可以认为Status=int;
参数LinkList *L:可能在初学时会感到困惑,为什么不是LinkList L,而是LinkList *L注意我们这里的形参是个二级指针,为什么要让二级指针做形参呢?这就要考虑到指针和变量的区别了,一个是传地址,一个是传值,结果是一个可以改变实参的值,一个不可以,而二级指针和一级指针的区别在于,二级指针改变的是一级指针的地址,而一级指针改变的是一级指针指向变量的值;在主函数中我们创建了一个头指针L,因为链表中的每一个节点都是临时申请的,头节点也不例外,所以我们首先要为头指针申请一个地址,就是上面的代码,而要改变主函数中的头指针L的地址就要用到二级指针了。为了程序的严谨性,还要对头节点L进行判空操作,以判断头节点L是否申请内存成功