用ps怎么做网站首页/竞价推广专员
上章
🐺
链式存储🎥
特性
- 是连续不同的内存空间
- 是由一些咧的节点组成
- 指针域 next 指针
- 数据域 data
- 示意图
- 插入节点方式
- 找到需要插入位置的前一个位置
- 将 next 指向下一个数据的头地址
- 一个 node 有一个数据和一个 next 指向下一个 node 的数据
程序📻
总共有两个结构体声明
- 链表node(用于串联list之间的node消息和下一个node)
- 链表list (指向下一个node节点)
- Node 结构体声明
/*** 声明node 节点* 数据存储单元
*/
typedef struct LINKNODE
{void* data; // 指向任何类型的数据cstruct LINKNODE* next;}LinkNode;
- List 结构体声明
/*** 需要指向的 node* 没有容量的概念
*/
typedef struct LINKLIST
{int size; // 指向任何类型的数据cLinkNode* 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 + dataLinkNode *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🌈🌈