双向循环链表demo#include
#include
typedef struct node
{
int data; //数据域 保存数据元素
struct node * next; //保存下一个数据元素的地址
struct node * prev; //保存上一个数据元素的地址
}node;
//创建表头表示链表
node* creatlist()
{
node * headnode = (node )malloc(sizeof(node));
//初始化,自己指向自己
headnode->next = headnode->prev = headnode;
return headnode;
}
//创建节点
node creatnode(int data)
{
//c语言:malloc + free
//c++:new + delete
node* newnode = (node *)malloc(sizeof(node));
//初始化
newnode->data = data;
newnode->next = null;
newnode->prev = null;
return newnode;
}
//遍历链表
void printlist(node *headnode)
{
//双向链表不光可以用 next 打印,也可以用 prev 进行打印
//next指针打印:先进后出
//prev指针打印:先进先出
node *p = headnode -> next;
while(p != headnode){
printf(%dt,p->data);
p = p -> next;
}
printf(n);
}
//插入节点:头插法
void insertnodebyhead(node *headnode,int data)
{
//创建插入的节点
node newnode = creatnode(data);
//注意顺序,赋值会改变指针指向,因此要先连后断
/
headnode -> next = newnode;
newnode -> prev = headnode;
newnode -> next = headnode -> next;
headnode ->next->prev = newnode;
*/
// 从上面调整顺序,得到下面
newnode -> prev = headnode;
newnode -> next = headnode -> next;
headnode ->next->prev = newnode;
headnode -> next = newnode;
}
//插入节点:尾插法
void insertnodebytail(node *headnode,int data)
{
//创建插入的节点
node *newnode = creatnode(data);
//找到最后一个节点
node *lastnode = headnode;
while(lastnode->next != headnode)
{
lastnode = lastnode->next;//往下走
}
//注意顺序
headnode->prev = newnode;
newnode->next = headnode;
lastnode->next = newnode;
newnode->prev = lastnode;
}
//删除节点
void deletenodebyappoin(node *headnode,int posdata)
{
// posnode 想要删除的节点,从第一个节点开始遍历
// posnodefront 想要删除节点的前一个节点
node *posnode = headnode -> next;
node *posnodefront = headnode;
if(posnode == null)
printf(链表为空,无法删除);
else{
while(posnode->data != posdata)
{
//两个都往后移,跟着 posnodefront 走
posnodefront = posnode;
posnode = posnodefront->next;
if (posnode->next == headnode)
{
printf(没有找到,无法删除);
return;
}
}
//找到后开始删除
posnodefront->next = posnode->next;
posnode->next->prev = posnodefront;
free(posnode);
}
}
int main()
{
node* list = creatlist();
insertnodebyhead(list,1);
insertnodebyhead(list,2);
insertnodebyhead(list,3);
printlist(list);
insertnodebytail(list,0);
printlist(list);
deletenodebyappoin(list,2);
printlist(list);
return 0;
}
结果:
双链表的创建、遍历和单链表差不多,只是头插法、尾插法、删除操作多了几个步骤。
研华科技公司助力智能医疗应用落地
利用16位DAC实现20位分辨率的设计
智能家居领域有什么误解的点
“五眼”情报密谈,随后陆续开始围堵华为?
一下科技致力为用户生产优质短视频内容
双向循环链表创建代码
智能医疗提高医生阅片准确率和诊断水平
电子变压器常见故障及解决办法的介绍
LED开关电源PCB元件布局设计
基于LM3402的新型LED无影灯控制系统
音频设计:外包策略--明确我的需求!
欢迎你的到来苹果HomePod智能音箱:HomePod音箱图赏
家用太阳能热水器的选购,How to buy solar water heater
超级电容器在国内市场潜力无限 但需持续提高能量密度和性价比
AMD Giglio DPU计划于2023年推出
日本地震对芯片供应链的影响分析
人工智能的发明的专利申请近年来呈爆炸式增长
纳芯微推出四款单通道MLVDS收发器NLC530x系列
英集芯IP6505T手机快速充电模块 已打板验证
NVIDIA 官方提供Jetson Nano(含2GB)网卡推荐列表