当前位置: 首页 > news >正文

玳瑁的嵌入式日记D21-08020(数据结构)

双向链表


double link list

typedef struct dou_node {
DATATYPE data;
struct dou_node *prev;
struct dou_node *next;
}DouLinkNode;


双向链表:

节点  =  数据 + NEXT +PREV .
手撕代码(增加+删除)
增加,删除的操作, 需要 tmp 停止待操作节点的前一节点上。
查找操作进行了扩展,回调函数(函数指针)。解耦合,扩展功能。


查找                               顺序表O(1)         链表  O(n)
插入和删除                     顺序表 O(n)       链表   O(1)

空间性能
顺序表          需要预先分配空间,大小固定
链表             不需要预先分配,大小可变,动态分配


int InsertHeadDouLinkList(DouLinkList *list,DATATYPE *data)
{
DouLinkNode *newnode = (DouLinkNode*)malloc(sizeof(DouLinkNode));
if ( NULL == newnode )
{
perror( "IsertHeadDouLinkList malloc error" );
return 1;
}
  memcpy(&newnode->data,data,sizeof(DATATYPE));
newnode->prev = NULL;
newnode->next = NULL;
if ( IsEmptyLinkList(list) )
{
list->head = newnode;
}
else{
newnode->next = list->head;
  list->head->prev = newnode;
list->head = newnode;
}
list->clen++;
return 0;
}

int InsertTailDouLinkList(DouLinkList *dl, DATATYPE *data)
{
if (IsEmptyLinkList(dl))
{
return InsertHeadDouLinkList(dl, data);
}
else
{
DouLinkNode *newnode = malloc(sizeof(DouLinkNode));
if (NULL == newnode)
{
perror("InsertTailDouLinkList malloc");
return 1;
}
memcpy(&newnode->data, data, sizeof(DATATYPE));
newnode->next = NULL;
newnode->prev = NULL;

    DouLinkNode *tmp = dl->head;
while (tmp->next)
{
tmp = tmp->next;
}

    newnode->prev = tmp;
tmp->next = newnode;

}
dl->clen++;
return 0;
}

int InsertPosLinkList(DouLinkList *list, DATATYPE *data,int pos)
{
if(pos<0 || pos > list->clen)
{
printf("InsertPosLinkList pos error\n");
return 1;
}

    if(pos == 0)
{
return InsertHeadDouLinkList(list,data);
}
else if(pos == list->clen)
{
return InsertTailDouLinkList(list, data);
}else
{

    DouLinkNode *newnode = malloc(sizeof(DouLinkNode));
if(NULL == newnode)
{
perror("InsertPosLinkList malloc error");
return 1;
}
memcpy(&newnode->data,data,sizeof(DATATYPE));
newnode->next = NULL;
newnode->prev = NULL;
DouLinkNode *tmp = list->head;
for(int i = 0; i < pos; i++)
{
tmp = tmp->next;
}

    newnode->next = tmp;
newnode->prev = tmp->prev;
tmp->prev->next = newnode;
tmp->prev = newnode;
list->clen++;

    }
return 0;
}


gdb



typedef enum {DIR_FORWARD,DIR_BACKWARD}DIRECT;    //枚举

int ShowLinkList(DouLinkList *list,DIRECT direct)  
{
DouLinkNode *tmp = list->head;
if(DIR_FORWARD == direct)
{
while(tmp)
{
printf("%s \n",tmp->data.data);
tmp = tmp->next;
}

    }else
{
while(tmp->next)
{
tmp = tmp->next;
// 移到最后
while(tmp)
{
printf("%s \n",tmp->data.data);
tmp = tmp->prev;
}      
}

return 0;
}


int ReviseLinkList(DouLinkList *list)
{
if(list == NULL|| list->clen == 0)
{
printf("RviseLinkList error");
return 1;
}
DouLinkNode *prev = NULL;
DouLinkNode *curr = list->head;
DouLinkNode *next = NULL;


while(curr!=NULL)
{
  next = curr->next;
prev = curr->prev;

curr->next = prev; //后移
prev = curr;
curr = next;
}
list->head = prev;
return 0;
}


DouLinkNode *FindDouLinkList(DouLinkList *dl,PFUN fun, void*arg);

DouLinkNode *FindDouLinkList(DouLinkList *dl,PFUN fun, void*arg)
{
DouLinkNode* tmp = dl->head;
while(tmp)
{
// if(0==strcmp(tmp->data.name,name))
if ( fun ( &tmp->data , arg))
{
return tmp;
}
tmp=tmp->next;
}
return NULL;
}

int findperbyname(DATATYPE*data,void* arg)
{
// 从void* -> 其他类型指针,需要强转
return 0 == strcmp(data->name,(char*)arg);
}

int findperbyage(DATATYPE*data,void* arg)
{
// 从void* -> 其他类型指针,需要强转
return data->age == *(int*)arg;;
}


   printf("------------------------find-----------------------------\n");
char want_name[] = "lisi";
int age =50;
DouLinkNode* tmp = FindDouLinkList(list,findperbyname ,want_name);
if (NULL == tmp)
{
printf("cant find per %s\n",want_name);
}
else
{
printf("find it,name:%s score:%d\n",tmp->data.name,tmp->data.score);
}

http://www.xdnf.cn/news/1334035.html

相关文章:

  • 河南萌新联赛2025第六场 - 郑州大学
  • 一种数字相机中的自动曝光算法
  • Java 性能优化实战(二):JVM 调优的 5 个核心维度
  • ABAP OOP革命:ALV报表面向对象改造深度实战
  • 基于Python的反诈知识科普平台 Python+Django+Vue.js
  • 49 C++ STL模板库18-类模板-pair
  • 解决前端项目启动时找不到esm文件的问题
  • PostgreSQL 流程---更新
  • 力扣面试150(61/100)
  • 使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本1)
  • 笔试——Day44
  • 使用RealSense相机和YOLO进行实时目标检测
  • 从零开发Java坦克大战Ⅱ(上) -- 从单机到联机(架构演进与设计模式剖析)
  • 01.初识mysql数据库,了解sql语句
  • React-native之组件
  • 《算法导论》第 34 章 - NP 完全性
  • J1939协议
  • C++围绕音视频相关的资料都有哪些?如何进行学习
  • 升级Android系统webview
  • 运维日常工作100条
  • linux内核源码下载
  • Redisson3.14.1及之后连接阿里云redis代理模式,使用分布式锁:ERR unknown command ‘WAIT‘
  • 双模式 RTMP H.265 播放器解析:从国内扩展到 Enhanced RTMP 标准的演进
  • 猫头虎开源AI分享|基于大模型和RAG的一款智能text2sql问答系统:SQLBot(SQL-RAG-QABot),可以帮你用自然语言查询数据库
  • PowerShell脚本检查业务健康状态
  • Web3:重构互联网秩序的下一代范式革命
  • OceanBase DBA实战营2期--SQL 关键字限流学习笔记
  • CAT1+mqtt
  • Bigemap APP 详细使用教程,入门学习PPT
  • KDD 2025 | CMA:一次训练,预测任意过去与未来!元学习+扩散模型颠覆时序预测!