🐺
链式存储🎥
特性
- 是连续不同的内存空间
- 是由一些咧的节点组成
- 指针域 next 指针
- 数据域 data
- 示意图
- 插入节点方式
- 找到需要插入位置的前一个位置
- 将 next 指向下一个数据的头地址
- 一个 node 有一个数据和一个 next 指向下一个 node 的数据
程序📻
总共有两个结构体声明
- 链表node(用于串联list之间的node消息和下一个node)
- 链表list (指向下一个node节点)
- Node 结构体声明
/**
* 声明node 节点
* 数据存储单元
*/
typedef struct LINKNODE
{
void* data; // 指向任何类型的数据c
struct LINKNODE* next;
}LinkNode;
- List 结构体声明
/**
* 需要指向的 node
* 没有容量的概念
*/
typedef struct LINKLIST
{
int size; // 指向任何类型的数据c
LinkNode* head;
}Linklist;
- 初始化链表函数
// 初始化链表
Linklist* InitList(){
Linklist* list = (Linklist*)malloc(sizeof(Linklist)); // 分配内存空间
list->size = 0;
// 设置头节点、但是不保存数据信息,
list->head = (LinkNode*)malloc(sizeof(LinkNode));
list->head->data = NULL;
list->head->next = NULL;
}
- 在指定位置插入元素
因为需要获取 list 上的 pos 的位置,所以需要创建一个新的临时节点先用于存储下一个 node 的 data ,然后再将新节点放到当前节点的nex指针里面,同时最后也需要增加链表的长度。
// 指定位置插入
void Inster_LinkList(Linklist* list,int pos,void* data){
// 判断插入的参数
if(list == NULL || data == NULL){
return;
}
// 越界处理,将超过的节点插入到尾部
if(pos <0 || pos > list->size) {
pos = list->size;
}
// 创建新的节点 pos + data
LinkNode *newnode = (LinkNode*)malloc(sizeof(LinkNode));
newnode->data = NULL;
newnode->next = NULL;
// 找到这个节点的上一个节点
// 使用辅助节点
LinkNode* pCurrent = list->head;
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->next;
}
// 将新节点放入链表
newnode->next = pCurrent->next;
pCurrent->next = newnode;
// 增加链表长度
list->size++;
}
获取链表的长度
// 获得链表的长度
int Size_LinkList(Linklist* list) {
return list->size;
}
- 查找元素
同样也是使用遍历的方法
// 查找元素
int Find_LinkList(Linklist* list,void *data) {
if(list == NULL || data == NULL) {return 0;}
LinkNode* pCurrent = list->head->next;
// 遍历查找
for (int i = 0; i < list->size; i++)
{
if(pCurrent->data == data) {
return i;
}
// 节点移动
pCurrent = pCurrent->next;
}
return 0;
}
- 返回第一个节点
// 返回第一个节点
void* Front_LinkList(Linklist* list) {
return list->head->next->data; // 头节点的下一个节点
}
- 释放内存空间
// 释放内存
void FreeSpace_LinkList(Linklist* list) {
if(list == NULL) {return;}
// 构建辅助节点
LinkNode* pCurrent = list->head->next; // 节点指向下一个头节点的 next
// 缓存下一个节点,并且
while (pCurrent != NULL)
{
LinkNode* pNex = pCurrent;
free(pCurrent);
pCurrent = pNex;
}
// 释放链表
free(list);
}
- 打印输出
下列代码中,因为不知道用户想要打印的数据类型是什么,所以使用void*指针函数指向用户输入的数据类型
/**
* 用户打印回调函数指针,返回一个 void*
*/
typedef void(*PORINTLINKLISST) (void*);
// 打印链表,但需要用户输入数据类型,定义函数指针访问
void Print_LinkList(Linklist* list,PORINTLINKLISST print_) {
if(list == NULL) {return;}
// 构建辅助节点
LinkNode* pCurrent = list->head->next; // 头姐弟啊你的下一个节点
while (pCurrent != NULL)
{
std::cout << "data:" << pCurrent->data << std::endl;
pCurrent = pCurrent->next;
}
}
🌸🌸🌸完结撒花🌸🌸🌸
🌈🌈@FEA🌈🌈