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

day21:零基础学嵌入式之数据结构

一、双向链表(doulinklist)

1.

2.创建

struct DouLinkList *CreateDouLinkList()
{struct DouLinkList *dl = malloc(sizeof(struct DouLinkList));if(NULL ==  dl){fprintf(stderr, "CreateDouLinkLis malloc");return NULL;}dl->head = NULL;dl->clen = 0;return dl;}

3.长度、判空、

//判空
int IsEmptyDouLinkList(struct DouLinkList *dl)
{return 0 == dl->clen;
}
//获得长度
int GETSizeDouLinkList(struct DouLinkList *dl)
{return dl->clen;
}

4.头插与显示

//头插
int InSertHeadDouLinkList(struct DouLinkList *dl,struct DATATYPE *data)
{struct DouNode *newnode = malloc(sizeof(struct DouNode));if( NULL == newnode){fprintf(stderr, "InSertHeadDouLinkList malloc");return 1;}memcpy(&newnode->data,data, sizeof(struct DouNode));newnode->next = NULL;newnode->prev = NULL;newnode->next = dl->head;if(dl->head){dl->head->prev = newnode;}dl->head = newnode;dl->clen ++;return 0;
}
//显示
int ShowDouLinkList(struct DouLinkList *dl,DIR dir)
{struct DouNode *tmp = dl->head;if(FORWAOR == dir){struct DouNode *tmp = dl->head;while (tmp){printf("%s %c %d %d\n",tmp->data.name,tmp->data.sex,tmp->data.age,tmp->data.score);tmp = tmp->next;}}else if(BACKWAOR ==dir){struct DouNode *tmp = dl->head;while (tmp->next){tmp=tmp->next;}while(tmp){printf("%s %c %d %d\n",tmp->data.name,tmp->data.sex,tmp->data.age,tmp->data.score);tmp = tmp->prev;}}return 0;
}

5.尾插

int InSertTailDouLinkList(struct DouLinkList *dl,struct DATATYPE *data)
{int len = GETSizeDouLinkList(dl);if(0 == len){InSertHeadDouLinkList(dl, data);}else{struct DouNode *newnode = malloc(sizeof(struct DouNode));if(NULL == newnode){fprintf(stderr, "InSertTailDouLinkList malloc");return 1;} memcpy(&newnode->data, data ,sizeof(struct DATATYPE ));newnode->next = NULL;newnode->prev=NULL;struct DouNode *tmp = dl->head;while(tmp->next){tmp = tmp->next;}newnode->prev = tmp;tmp->next = newnode;dl->clen ++;}return 0;
}

6.位置插

int InSertPosDouLinkList(struct DouLinkList *dl,struct DATATYPE *data,int pos)
{int len = GETSizeDouLinkList(dl);if(pos < 0 || pos >len){return 1;}if(0 == pos){return InSertHeadDouLinkList(dl, data);}else if(len ==pos){return InSertTailDouLinkList(dl, data);}else{struct DouNode *newnode = malloc(sizeof(struct DouNode));if(NULL == newnode){fprintf(stderr, "InSertPosDouLinkList malloc");return 1;}memcpy(&newnode->data, data, sizeof(struct DATATYPE));newnode->next =NULL;newnode->prev=NULL;struct DouNode *tmp = dl->head;for(int i = 0;i < pos;++i){tmp = tmp->next;}newnode->next = tmp;newnode->prev =tmp->prev;tmp->prev = newnode;newnode->prev->next = newnode;dl->clen++;return 0;}}

7.寻找

struct DouNode * FindDouLinkList(struct DouLinkList *dl,char *name)
{if(IsEmptyDouLinkList(dl)){return NULL;}struct DouNode *tmp = dl->head;while(tmp){if(0 == strcmp(name,tmp->data.name)){return tmp;}tmp = tmp->next;}return NULL;}

8.修改

int MdifyDouLinkList(struct DouLinkList *dl,char *name,struct DATATYPE *data)
{struct DouNode *tmp = FindDouLinkList(dl, name);if(NULL == tmp){return 1;}memcpy(tmp, data, sizeof(struct DATATYPE));return 0;
}

9.Makefile/makefile

(1)工程管理工具,三个以上编译要写,如果在实际中.c比较多,改了其中的一个.c,只编译这一个.c;

(2)vi Makefile 

        进入之后

1)

目标  :   依赖
a.out : main.c doulinklist.c//通过依赖文件可以产生目标;gcc main.c doulinklist.c //开头必须tab不能是几个空格,规则,打命令;clean:               rm a.out//可以删目标文件、中间生成的文件,只留最后的需要文件;

        make 回车

如果想在没有改代码的前提下再次编译,先make clean ,再make

2)

//支持自定义变量
#代表源文件
SRC += main.c         //追加
SRC +=doulinklist.c   //追加
DST = app             //(all->app啥名字都可以),可执行文件CC = gcc
FLAG = -g             //标志位 ,调试版本
LIB = -lm#a.out:main.c./doulinklist.c
#   gcc main.c doulinklist.c$(DST) :$(SRC)$(CC) $(SRC) $(FLAG) $(LIB) -o $(DST)clean:rm $(DST)

:wqa

make (如果也要指定makefilr文件,就make -f Makefile2)

如果想在没有改代码的前提下再次编译,先make clean ,再make

10.销毁

int DestroyDouLinkList(struct DouLinkList **dl)
{struct DouNode *tmp = (*dl)->head;while (1){struct DouNode *tmp = (*dl)->head;if(NULL == tmp ){break;}(*dl)->head = (*dl)->head->next;free(tmp);}free(*dl);dl = NULL;return 0;
}

11.删除

int DeleteDouLinkList(struct DouLinkList *dl,char *name)
{struct DouNode *tmp = FindDouLinkList(dl, name);if(NULL == tmp){return 1;}if(dl->head == tmp){dl->head=dl->head->next;tmp->next->prev = NULL;free(tmp);dl->clen--;return 0;}else if(NULL ==tmp->next){tmp->prev->next = NULL;free(tmp);dl->clen--;return 0;}else{tmp->prev->next = tmp->next;tmp->next->prev = tmp->prev;free(tmp);dl->clen --;return 0;}
}

12.逆序

int ReverseDouLinkList(struct DouLinkList *dl)
{struct DouNode *prev = NULL;struct DouNode *tmp = dl->head;struct DouNode *last = tmp->next;int len = GETSizeDouLinkList(dl);if(len < 2){return 1;}while(1){tmp->next= prev;tmp->prev = last;prev = tmp;tmp = last;if(NULL == tmp){break;}last = last->next;}dl->head = prev;return 0;
}

相关文章:

  • 解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-MCP大模型上下文解析
  • SQLMesh 模型管理指南:从创建到验证的全流程解析
  • SaaS基于云计算、大数据的Java云HIS平台信息化系统源码
  • java实现根据Velocity批量生成pdf并合成zip压缩包
  • AD 多层线路及装配图PDF的输出
  • Springboot考研信息平台
  • LLM Text2SQL NL2SQL 实战总结
  • MongoDB数据库深度解析:架构、特性与应用场景
  • 呼叫中心高可用方案:全方位保障客服业务持续稳定
  • 7、MinIO服务器简介与安装
  • Python3 简易DNS服务器实现
  • Python机器学习笔记(二十三 模型评估与改进-网格搜索)
  • 20、工业协议转换与数据采集中间件 (模拟) - /数据与物联网组件/protocol-converter-middleware
  • 全球宠物经济新周期下的亚马逊跨境采购策略革新——宠物用品赛道成本优化三维路径
  • IP防护等级举例解析
  • 专项智能练习(加强题型)-DA-02
  • websocket入门详解
  • 【Ubuntu】安装BitComet种子下载器
  • 远程实时控制安卓模拟器技术scrcpy
  • 基于EtherCAT与ABP vNext 构建高可用、高性能的工业自动化平台
  • 外企聊营商|武田制药:知识产权保护助创新药研发
  • 专家:家长要以身作则,孩子是模仿者学习者有时也是评判者
  • 商务部:中方将适时发布中美经贸磋商相关消息
  • 巴菲特谈卸任CEO:开始偶尔失去平衡,但仍然保持敏锐的头脑,仍打算继续工作
  • 万科再获深铁集团借款,今年已累计获股东借款近120亿元
  • 国际能源署:全球电动汽车市场强劲增长,中国市场继续领跑