当前位置:网站首页>通用的双向循环列表的几个比较重要的函数操作
通用的双向循环列表的几个比较重要的函数操作
2022-08-09 14:53:00 【黄小鸭233】
双向循环链表的创建
struct DNode
{
struct DNode* prev; //指向上一个结点
struct DNode* next; //指向下一个结点
char elem[]; //使用柔性数组可以接受任何类型
};再是双向循环链表的结点前插入、结点后插入以及删除结点
//在node之前插入
void insert_before(struct DNode* node, const void* pElem, size_t elemSize)
{
assert(node!=NULL && pelem!=NULL && elemsize!=0);
//因为使用的是柔性数组所以分配内存要加上插入数据的大小
struct DNode* insNode = (struct DNode*)malloc(sizeof(struct DNode) + elemSize);
if(insNode == NULL)
return;
insNode->next = node;
insNode->prev = node->prev;
memcpy(node->elem, pElem, elemSize); //因为不知道elem的类型,所以要用内存拷贝
node->prev->next = insNode; //这两句的顺序不能乱
node->prev = insNode;
}
//在node之后插入,和上面区别不多,就改几句话
void insert_after(struct DNode* node, const void* pElem, size_t elemSize)
{
assert(node!=NULL && pelem!=NULL && elemsize!=0);
//因为使用的是柔性数组所以分配内存要加上插入数据的大小
struct DNode* insNode = (struct DNode*)malloc(sizeof(struct DNode) + elemSize);
if(insNode == NULL)
return;
insNode->next = node->next;
insNode->prev = node;
memcpy(node->elem, pElem, elemSize);
node->next->prev = insNode; //这两句的顺序不能乱
node->next = insNode;
}
//删除node结点
void delete_dnode(struct DNode* node)
{
assert(node != NULL);
if(node->next = node) //如果node为头结点怎不能删除
return;
node->prev->next = node->next;
node->next->prev = node->prev;
free(node);
}
//创建一个头结点
struct DNode* create_cdlist(void)
{
//因为头结点不存储数据,所以直接分配结构体大小的内存即可
struct DNode* list = (struct DNode*)malloc(sizeof(struct DNode));
if(list != NULL) //创建失败则直接返回NULL
{
list->next = list;
list->prev = list; //刚开始没数据且为且为环所以都先指向自己
}
return list;
}
//获取第pos个结点,pos从1一开始
struct DNode* get_dnode(struct DNode* list, size_t pos)
{
assert(list != NULL);
struct DNode* node = list->next;
size_t i;
for(i = 1; i<pos && node!=list; i++, node = node->next);
if(i < pos) //pos比链表总长度大时,node已经循环了一圈退出了循环指向了头结点,
//这时候返回空
return NULL;
return node;
}边栏推荐
- OpenCV - Matrix Operations Part 3
- Mathematica 作图详解
- MySQL 原理与优化:Limit 查询优化
- [Mysql]--Transaction, transaction isolation level, dirty read, non-repeatable read, phantom read analysis
- How to use and execute quantitative programmatic trading?
- 经典面试题 之 SQL优化
- Qt对话框中show和exec的区别
- shell之函数和数组
- 如何让你的量化交易系统具有概率优势,具有正向收益预期呢?
- How to achieve stable profit through the stock quantitative trading interface?
猜你喜欢

Database multi-table link query method

启动报错:Caused by: org.apache.ibatis.binding.BindingException汇总解决

Redis6.2.1配置文件详解

What is a template engine?What are the common template engines?Introduction to common commands of thymeleaf.

focal loss原理及简单代码实现

Shell programming loop statement

DMPE-PEG-Mal Maleimide-PEG-DMPE 二肉豆蔻酰磷脂酰乙醇胺-聚乙二醇-马来酰亚胺

Similar image detection method

DMPE-PEG-Mal Maleimide-PEG-DMPE dimyristoylphosphatidylethanolamine-polyethylene glycol-maleimide

Matlab修改Consolas字体
随机推荐
[MySql]实现多表查询-一对一,一对多
注释,标识符,数据类型
How to flexibly use the advantages of the quantitative trading interface to complement each other?
OpenCV - Matrix Operations Part 3
二维数组实现八皇后问题
为什么要学编译原理
相似图像的检测方法
百度开源e-chart初探
数据库多表链接查询的方式
经典面试题 之 JVM调优
正则化原理的简单分析(L1/L2正则化)
股票程序化交易如何理解自己的交易系统?
Shell编程之正则表达式
浅谈ArraryList的浅克隆和深克隆
MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据
启动报错:Caused by: org.apache.ibatis.binding.BindingException汇总解决
How to achieve stable profit through the stock quantitative trading interface?
Mysql two engines comparison
FilenameFilter过滤文件名
redis6在centos7的安装