当前位置: 首页 > 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;
}

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

相关文章:

  • X-R1:训练医疗推理大模型
  • AD 规则的导入与导出
  • W1R3S: 1.0.1靶场
  • 10.2 LangChain v0.3全面解析:模块化架构+多代理系统如何实现效率飙升500%
  • 团队项目培训
  • 题解:P12207 [蓝桥杯 2023 国 Python B] 划分
  • 编译OpenSSL时报错,Can‘t locate IPC/Cmd.pm in @INC perl环境
  • JVM方法区核心技术解析:从方法区到执行引擎
  • 什么是 NB-IoT ?窄带IoT 应用
  • 铜墙铁壁 - 服务网格的安全之道 (Istio 实例)
  • Electron详解:原理与不足
  • 如何在多线程环境下避免快速失败异常?
  • VMware(Ubuntu系统)设置共享文件夹
  • 前端流行框架Vue3教程:16. 组件事件配合`v-model`使用
  • 阿里云ECS部署Dify
  • go依赖查询工具之godepgraph(分析main.go的依赖树)
  • 机器学习08-损失函数
  • 【上位机——WPF】Window标签常用属性
  • 概率相关问题
  • win10电脑无法访问局域网内其他共享电脑文件的问题
  • 用C语言实现了——一个基于顺序表的插入排序演示系统
  • Java并发编程:锁机制
  • 数据库--处理模型(Processing Model)(二)
  • AWS CloudHSM:金融级密钥安全管理实战,如何通过FIPS 140-2认证守护数据生命线?
  • aws 实践创建policy + Role
  • 黑马程序员c++2024版笔记 第一章
  • Delphi 中 BPL(2):大型项目中 BPL 对性能的影响及调优策略
  • 2025年11月软考各科目难度及适合人群分析
  • 浪潮云边协同:赋能云计算变革的强力引擎
  • YOLO11改进-模块-引入空间增强前馈网络SEFN 提高多尺度 遮挡