链表是一种常见的线性数据结构,用于存储一系列元素。它由一系列节点组成,每个节点包含两部分:数据域和指针域。其中,数据域用于存储元素的值,指针域用于指向下一个节点。
单链表的特点包括:
- 节点组成:单链表由多个节点组成,每个节点包含数据和指向下一个节点的指针。
- 头指针:单链表通常有一个头指针,指向链表的第一个节点。
- 尾节点指针:有些单链表会有一个尾节点指针,指向链表的最后一个节点,方便在尾部进行插入操作。
- 动态内存分配:单链表的节点在内存中可以动态分配,不需要连续的内存空间,因此可以方便地进行插入和删除操作。
- 灵活性:由于单链表的节点之间使用指针连接,因此可以根据需要在链表中间插入或删除节点,而不需要移动其他节点。
与顺序表一样,单链表也是一种线性表;和顺序表不同,链表在逻辑上连续,在物理上不连续。
如下:
单链表的实现:
1.与实现顺序表一样,创建SList.c Slist.h test.c 三个文件
.h用来包含实现方法所需的头文件以及所需方法的初始化。
test.c用来测试代码是否出错
.c用来实现各种方法
2.定义节点的结构:
实现链表的节点需要创建两个变量:数据域和指针域,利用结构体来是实现
利用typedef将struct SListNode简化为SLTNode。
3.方法声明:实现该链表所需头文件以及各种方法的声明
方法实现:在SList.c中对需要的方法进行实现。
顺序表的实现需要初始化并申请一块内存,而链表却不需要,这是因为链表存储的空间并不是连续的。
实现链表的功能:
1.打印
在main方法里实现即可
2.尾插:
在链表的插入操作中,我们需要修改的是当前节点的指针,需要传址调用。如果我们只传递指向当前节点的指针,那么在函数内部修改指针的值只会传值调用,而不会影响调用者传递给函数的原始指针。故就是二级指针(传址调用),修改当前节点指针。
测试:
头插的实现:
将赋值后的newnode的下一个节点赋给pphead,这样newnode就成为了新的头指针。
查找:
创建新节点pcur ,遍历,如果当前节点符合,返回,否则继续,若最后未找到,返回NULL
测试:
在指定位置之前插入数据:
pos之前插入,将newnode节点指向pos,将prev->next指向newnode
在指定位置之后插入数据:
删除指定位置的节点:
删除指定位置之后的数据
销毁链表:
遍历链表,next接收pcur的下一个节点,之后释放pcur后,将保存的next再赋给pcur,简而言之,创建一个第三方节点保存数据,让后遍历释放。