0
点赞
收藏
分享

微信扫一扫

【第十五届】蓝桥杯省赛C++b组

覃榜言 2天前 阅读 2

前言 

目录

前言 

单链表

概念

对比链表和顺序表

创建链表

实现单链表

准备工作

 打印链表

 创建节点并初始化

尾插

二级指针的调用

尾插代码 

头插

尾删

头删

查找(返回节点) 

 在指定位置(pos)之前插入数据

在指定位置(pos)之后插入数据

删除pos节点

删除pos之后的节点 

销毁链表


单链表

概念

        链表是⼀种物理存储结构上⾮连续⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。

对比链表和顺序表

        从上文可以得知与顺序表不同的是,链表⾥的每节"⻋厢"都是独⽴申请下来的空间,我们称之为“结点/节点” ,节点的组成主要有两个部分:当前节点要保存的数据和保存下⼀个节点的地址(指针变量)。

创建链表

//创建节点
typedef int SLTDataType;

typedef struct SLNode
{
	SLTDataType data;//数据域
	struct SLNode* next;//指针域
}SLTNode;

//创建节点
SLTNode* node1 = (SLTNode*)malloc(sizeof(SLTNode));
node1->data = 1;

SLTNode* node2 = (SLTNode*)malloc(sizeof(SLTNode));
node2->data = 2;

SLTNode* node3 = (SLTNode*)malloc(sizeof(SLTNode));
node3->data = 3;

SLTNode* node4 = (SLTNode*)malloc(sizeof(SLTNode));
node4->data = 4;

//链接节点
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = NULL;//尾指针置空

        其中数据域用于存放数据,指针域用于存放下一个结点的地址。上面的链表是手动创建节点,只是为了展示链表的形成,后续创建和链接单链表可以通过函数实现。

实现单链表

准备工作

        在开始之前我们需要定义一个指向为空的结构体类型的节点(SLNode*)plist,作为链表的头节点。

SLNode* plist = NULL;

 打印链表

 创建节点并初始化

尾插

二级指针的调用

        从这一部分开始就涉及到了二级指针传参的问题,在对单链表进行尾插时,如果此时头节点plist指向为空(即该单链表为空),就需要在函数内部改变头指针的指向,指向新插入的节点。

        这里举一个简单的例子,假如我要实现一个交换两个整形数据的函数,应该如何实现?

        同理,想要在函数内部改变一级头指针plist的指向,应该把plist的地址传入,用二级指针接收,也就是"传址调用",如果只传递一级指针(即链表的头指针),无法直接修改它所指向的地址,因为在函数内部对指针的修改不会影响到函数外部,最终只是将形参指针的指向改变而无法对实参造成影响。为了实现对链表头指针的修改,需要传递指向指针的指针,这样在函数内部就可以修改指针所指向的地址,从而改变链表的头指针。

 来一张图解释二级指针

尾插代码 

头插

尾删

头删

查找(返回节点) 

 在指定位置(pos)之前插入数据

在指定位置(pos)之后插入数据

删除pos节点

删除pos之后的节点 

销毁链表

举报

相关推荐

0 条评论