【数据结构】线性表的链式存储——单链表(C语言版)
一.基本概念
1.定义
线性表的链式存储又称单链表。通过一组任意的存储单元存储线性表中的数据元素,每个链表结点不仅存放数据,还会存放一个指向下一结点的指针。
2.特点
1.单链表解决了顺序表需要大量连续的存储空间的缺点,而单链表附加了指针域,存在着空间浪费的缺点。
2.离散分布,不能随机读取。
3.在查找特定结点时,只能从表头开始遍历;对于添加或删除元素的操作,只需要改变指针,而不用移动大量元素。
关于头指针和头结点
头结点:数据域不含任何信息,指针与指向首元素结点。
头指针:无论链表是否含有头结点,头指针都指向链表的第一个结点。
有头结点的链表,其第一个结点就是头结点;没有头结点的链表,其第一个结点是首元素结点。
头结点的好处:线性表中,只有首元素结点没有直接前驱,加入头结点后,使首元素也有了直接前驱,进而让线性表中所有元素的操作的到了统一。
二.单链表基本操作的实现
单链表的结构:
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType data;
struct SListNode* next;
}SLTNode;
1.创建新结点
SLTNode* Buynewnode(SLTDataType x)
{
SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
if(newnode == NULL)//检查是否maollc成功。
{
perror("maollc fail");//若maollc失败程序就会中断。
exit(-1);
}
//程序能够走到这里说明maollc成功。
newnode->data = x;
newnode->next = NULL;
return newnode;//返回存放着新结点地址的结构体指针
}
2.创建单链表
SLTNode* CreateSList(int n)//创建一个单链表
{
SLTNode* phead = NULL, * ptail = NULL;
for (int i = 0; i < n; i++)
{
SLTNode* newnode = BuySLTNode(i);
if (phead == NULL)
{
ptail = phead = newnode